Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Mahoney <jeffm@suse.com>2009-08-17 10:39:04 -0400
committerJeff Mahoney <jeffm@suse.com>2009-08-17 10:39:04 -0400
commit0dafc35c3b337f0d48420be46df7b8b5c4e20f96 (patch)
treeca3381db4a6f7cb25bccae24517cab54a248af5f
parent1ef4a05272f4f5fc5156f08ab7262fc454b95804 (diff)
- Updated to 2.6.31-rc6.
-rw-r--r--kernel-source.changes5
-rw-r--r--patches.kernel.org/patch-2.6.31-rc5-git39254
-rw-r--r--patches.kernel.org/patch-2.6.31-rc5-git3-git912317
-rw-r--r--patches.kernel.org/patch-2.6.31-rc5-rc624306
-rw-r--r--patches.xen/xen3-auto-xen-kconfig.diff79
-rw-r--r--patches.xen/xen3-patch-2.6.31-rc4600
-rw-r--r--series.conf3
7 files changed, 24713 insertions, 21851 deletions
diff --git a/kernel-source.changes b/kernel-source.changes
index 8a86d48950..b765ff1232 100644
--- a/kernel-source.changes
+++ b/kernel-source.changes
@@ -1,4 +1,9 @@
-------------------------------------------------------------------
+Mon Aug 17 16:38:38 CEST 2009 - jeffm@suse.com
+
+- Updated to 2.6.31-rc6.
+
+-------------------------------------------------------------------
Mon Aug 17 00:19:20 CEST 2009 - gregkh@suse.de
- patches.drivers/samsung-backlight-driver.patch: added N120 support
diff --git a/patches.kernel.org/patch-2.6.31-rc5-git3 b/patches.kernel.org/patch-2.6.31-rc5-git3
deleted file mode 100644
index 866b96bc85..0000000000
--- a/patches.kernel.org/patch-2.6.31-rc5-git3
+++ /dev/null
@@ -1,9254 +0,0 @@
-From: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
-Subject: Linux: 2.6.31-rc5-git3
-Patch-mainline: 2.6.31-rc5-git3
-
- This patch contains the differences between 2.6.31-rc5 and -rc5-git3.
-
-Acked-by: Jeff Mahoney <jeffm@suse.com>
----
-
- Documentation/ABI/testing/sysfs-block | 37 +-
- Documentation/DocBook/kernel-hacking.tmpl | 4
- Documentation/laptops/thinkpad-acpi.txt | 127 -------
- MAINTAINERS | 4
- Makefile | 2
- arch/mips/alchemy/mtx-1/platform.c | 14
- arch/mips/ar7/Makefile | 1
- arch/mips/ar7/clock.c | 13
- arch/mips/ar7/memory.c | 2
- arch/mips/ar7/platform.c | 10
- arch/mips/ar7/prom.c | 2
- arch/mips/ar7/setup.c | 1
- arch/mips/cavium-octeon/smp.c | 4
- arch/mips/dec/ecc-berr.c | 2
- arch/mips/dec/int-handler.S | 2
- arch/mips/dec/ioasic-irq.c | 2
- arch/mips/dec/kn01-berr.c | 2
- arch/mips/dec/kn02-irq.c | 2
- arch/mips/dec/kn02xa-berr.c | 2
- arch/mips/dec/prom/call_o32.S | 2
- arch/mips/dec/prom/console.c | 2
- arch/mips/dec/time.c | 2
- arch/mips/emma/common/Makefile | 3
- arch/mips/emma/common/prom.c | 3
- arch/mips/emma/markeins/Makefile | 3
- arch/mips/emma/markeins/irq.c | 3
- arch/mips/emma/markeins/led.c | 3
- arch/mips/emma/markeins/platform.c | 3
- arch/mips/emma/markeins/setup.c | 3
- arch/mips/fw/lib/call_o32.S | 2
- arch/mips/include/asm/emma/emma2rh.h | 3
- arch/mips/include/asm/emma/markeins.h | 3
- arch/mips/include/asm/gic.h | 2
- arch/mips/include/asm/pmc-sierra/msp71xx/war.h | 2
- arch/mips/include/asm/processor.h | 5
- arch/mips/include/asm/unistd.h | 15
- arch/mips/jazz/jazzdma.c | 2
- arch/mips/kernel/head.S | 3
- arch/mips/kernel/irq_txx9.c | 2
- arch/mips/kernel/module.c | 12
- arch/mips/kernel/proc.c | 2
- arch/mips/kernel/process.c | 4
- arch/mips/kernel/scall32-o32.S | 1
- arch/mips/kernel/scall64-64.S | 1
- arch/mips/kernel/scall64-n32.S | 1
- arch/mips/kernel/scall64-o32.S | 1
- arch/mips/kernel/smtc.c | 13
- arch/mips/kernel/stacktrace.c | 2
- arch/mips/kernel/vpe.c | 49 +-
- arch/mips/mipssim/sim_time.c | 12
- arch/mips/mm/c-octeon.c | 4
- arch/mips/mm/extable.c | 6
- arch/mips/mm/fault.c | 1
- arch/mips/mti-malta/malta-int.c | 2
- arch/mips/nxp/pnx8550/common/time.c | 2
- arch/mips/pci/fixup-emma2rh.c | 3
- arch/mips/pci/fixup-sb1250.c | 2
- arch/mips/pci/ops-emma2rh.c | 3
- arch/mips/pci/pci-emma2rh.c | 3
- arch/mips/pci/pci-tx4927.c | 2
- arch/mips/pci/pci-tx4938.c | 2
- arch/mips/pci/pci-tx4939.c | 2
- arch/mips/pci/pcie-octeon.c | 31 -
- arch/mips/pmc-sierra/msp71xx/gpio.c | 2
- arch/mips/pmc-sierra/msp71xx/gpio_extended.c | 2
- arch/mips/pmc-sierra/msp71xx/msp_irq_slp.c | 12
- arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c | 2
- arch/mips/sibyte/swarm/swarm-i2c.c | 2
- arch/mips/txx9/generic/mem_tx4927.c | 2
- arch/mips/txx9/generic/setup.c | 2
- arch/mips/txx9/rbtx4939/setup.c | 2
- arch/parisc/kernel/entry.S | 2
- arch/parisc/kernel/module.c | 50 ++
- arch/x86/include/asm/efi.h | 5
- arch/x86/include/asm/irqflags.h | 8
- arch/x86/include/asm/uv/uv_hub.h | 9
- arch/x86/kernel/apic/io_apic.c | 3
- arch/x86/kernel/apic/x2apic_cluster.c | 2
- arch/x86/kernel/apic/x2apic_phys.c | 2
- arch/x86/kernel/apic/x2apic_uv_x.c | 38 --
- arch/x86/kernel/apm_32.c | 2
- arch/x86/kernel/efi.c | 2
- arch/x86/kernel/efi_64.c | 6
- arch/x86/kernel/head_32.S | 6
- arch/x86/kernel/reboot.c | 34 +
- arch/x86/kernel/vmlinux.lds.S | 16
- arch/x86/lib/msr.c | 26 -
- arch/x86/mm/pageattr.c | 39 +-
- arch/x86/mm/pgtable.c | 1
- block/Kconfig | 11
- block/blk-settings.c | 77 ++--
- drivers/acpi/acpi_memhotplug.c | 34 +
- drivers/acpi/acpica/acobject.h | 1
- drivers/acpi/acpica/dsopcode.c | 24 +
- drivers/acpi/acpica/exfldio.c | 6
- drivers/acpi/osl.c | 25 +
- drivers/acpi/system.c | 2
- drivers/char/agp/parisc-agp.c | 2
- drivers/char/tty_ldisc.c | 152 ++------
- drivers/cpufreq/cpufreq.c | 27 +
- drivers/cpufreq/cpufreq_conservative.c | 6
- drivers/edac/amd64_edac.c | 7
- drivers/gpu/drm/drm_crtc.c | 2
- drivers/gpu/drm/drm_crtc_helper.c | 6
- drivers/gpu/drm/radeon/r100.c | 3
- drivers/gpu/drm/radeon/radeon_drv.c | 17
- drivers/gpu/drm/radeon/radeon_kms.c | 2
- drivers/gpu/drm/radeon/rv515.c | 1
- drivers/gpu/drm/ttm/ttm_bo.c | 7
- drivers/gpu/drm/ttm/ttm_bo_util.c | 8
- drivers/input/serio/hp_sdc_mlc.c | 2
- drivers/isdn/mISDN/l1oip_core.c | 2
- drivers/md/linear.c | 2
- drivers/md/md.c | 144 +++++---
- drivers/md/md.h | 2
- drivers/md/multipath.c | 5
- drivers/md/raid0.c | 1
- drivers/md/raid1.c | 7
- drivers/md/raid10.c | 4
- drivers/md/raid5.c | 51 +-
- drivers/mfd/twl4030-irq.c | 55 +--
- drivers/net/3c515.c | 4
- drivers/net/3c59x.c | 10
- drivers/net/eexpress.c | 6
- drivers/net/ehea/ehea.h | 2
- drivers/net/ehea/ehea_main.c | 3
- drivers/net/gianfar_ethtool.c | 10
- drivers/net/igbvf/vf.c | 4
- drivers/net/ixgbe/ixgbe.h | 2
- drivers/net/ixgbe/ixgbe_82598.c | 67 +++
- drivers/net/ixgbe/ixgbe_ethtool.c | 11
- drivers/net/ixgbe/ixgbe_main.c | 25 -
- drivers/net/ixgbe/ixgbe_type.h | 8
- drivers/net/mlx4/en_tx.c | 1
- drivers/net/netxen/netxen_nic_main.c | 37 +-
- drivers/net/pcnet32.c | 30 -
- drivers/net/ppp_generic.c | 34 +
- drivers/net/pppoe.c | 1
- drivers/net/pppol2tp.c | 1
- drivers/net/s6gmac.c | 2
- drivers/net/sky2.c | 14
- drivers/net/sky2.h | 1
- drivers/net/tulip/de4x5.c | 6
- drivers/net/wireless/airo.c | 13
- drivers/net/wireless/ath/ath9k/eeprom.c | 4
- drivers/net/wireless/iwlwifi/iwl-3945.h | 2
- drivers/net/wireless/iwlwifi/iwl-core.c | 3
- drivers/net/wireless/iwlwifi/iwl-debugfs.c | 12
- drivers/net/wireless/iwlwifi/iwl-dev.h | 6
- drivers/net/wireless/iwlwifi/iwl-sta.c | 12
- drivers/net/wireless/iwlwifi/iwl-tx.c | 14
- drivers/net/wireless/iwlwifi/iwl3945-base.c | 7
- drivers/net/wireless/iwmc3200wifi/commands.c | 1
- drivers/net/wireless/iwmc3200wifi/netdev.c | 6
- drivers/net/wireless/libertas/11d.c | 2
- drivers/net/wireless/libertas/assoc.c | 18 -
- drivers/net/wireless/libertas/scan.c | 3
- drivers/net/wireless/zd1211rw/zd_mac.c | 2
- drivers/parisc/ccio-dma.c | 1
- drivers/parisc/dino.c | 2
- drivers/parisc/eisa_eeprom.c | 2
- drivers/parisc/hppb.c | 9
- drivers/parisc/lba_pci.c | 2
- drivers/parisc/pdc_stable.c | 2
- drivers/pci/setup-res.c | 4
- drivers/platform/x86/Kconfig | 25 -
- drivers/platform/x86/eeepc-laptop.c | 9
- drivers/platform/x86/hp-wmi.c | 12
- drivers/platform/x86/thinkpad_acpi.c | 390 ++--------------------
- drivers/s390/scsi/zfcp_erp.c | 68 ++-
- drivers/s390/scsi/zfcp_fc.c | 8
- drivers/s390/scsi/zfcp_fsf.c | 56 ++-
- drivers/s390/scsi/zfcp_scsi.c | 25 -
- drivers/s390/scsi/zfcp_sysfs.c | 7
- drivers/scsi/libfc/fc_exch.c | 23 -
- drivers/scsi/libiscsi.c | 4
- drivers/scsi/libsas/sas_expander.c | 147 ++++++--
- drivers/scsi/libsas/sas_port.c | 19 -
- drivers/scsi/qla4xxx/ql4_dbg.c | 15
- drivers/scsi/qla4xxx/ql4_def.h | 9
- drivers/scsi/qla4xxx/ql4_fw.h | 7
- drivers/scsi/qla4xxx/ql4_iocb.c | 133 +++----
- drivers/scsi/qla4xxx/ql4_isr.c | 145 +++++---
- drivers/scsi/qla4xxx/ql4_mbx.c | 10
- drivers/scsi/qla4xxx/ql4_os.c | 40 +-
- drivers/scsi/qla4xxx/ql4_version.h | 2
- drivers/scsi/scsi_transport_iscsi.c | 4
- drivers/scsi/sd.c | 20 +
- drivers/video/console/sticore.c | 9
- drivers/watchdog/coh901327_wdt.c | 11
- fs/cifs/CHANGES | 7
- fs/cifs/README | 25 -
- fs/cifs/cifs_dfs_ref.c | 12
- fs/cifs/cifs_unicode.c | 2
- fs/cifs/cifsfs.c | 4
- fs/cifs/connect.c | 55 ++-
- fs/nilfs2/mdt.c | 4
- fs/nilfs2/segment.c | 16
- include/acpi/acpiosxf.h | 4
- include/drm/drm_pciids.h | 5
- include/linux/blkdev.h | 1
- include/linux/inetdevice.h | 2
- include/linux/perf_counter.h | 13
- include/linux/tty_ldisc.h | 2
- include/net/bluetooth/rfcomm.h | 12
- include/net/cfg80211.h | 5
- init/Kconfig | 11
- kernel/fork.c | 4
- kernel/panic.c | 1
- kernel/perf_counter.c | 101 ++++-
- kernel/posix-timers.c | 7
- kernel/sched_cpupri.c | 15
- kernel/sched_fair.c | 32 +
- kernel/signal.c | 25 -
- kernel/trace/ftrace.c | 4
- kernel/trace/trace.c | 12
- kernel/trace/trace_events.c | 2
- kernel/trace/trace_functions_graph.c | 11
- kernel/trace/trace_printk.c | 2
- lib/flex_array.c | 2
- net/bluetooth/rfcomm/core.c | 27 +
- net/bluetooth/rfcomm/sock.c | 2
- net/core/dev.c | 25 -
- net/core/net_namespace.c | 2
- net/ipv4/arp.c | 4
- net/mac80211/mlme.c | 2
- net/mac80211/pm.c | 24 -
- net/mac80211/rx.c | 12
- net/netlabel/netlabel_kapi.c | 2
- net/wireless/reg.c | 9
- net/wireless/reg.h | 3
- net/wireless/scan.c | 4
- scripts/recordmcount.pl | 5
- sound/pci/hda/hda_codec.c | 2
- sound/pci/hda/hda_codec.h | 2
- sound/pci/hda/hda_intel.c | 103 ++++-
- sound/pci/hda/patch_realtek.c | 4
- sound/pci/hda/patch_sigmatel.c | 9
- tools/perf/Makefile | 2
- tools/perf/builtin-report.c | 24 +
- tools/perf/builtin-top.c | 1
- tools/perf/util/quote.c | 2
- tools/perf/util/symbol.c | 2
- 243 files changed, 2030 insertions(+), 1676 deletions(-)
-
-diff --git a/Documentation/ABI/testing/sysfs-block b/Documentation/ABI/testing/sysfs-block
-index cbbd3e0..5f3beda 100644
---- a/Documentation/ABI/testing/sysfs-block
-+++ b/Documentation/ABI/testing/sysfs-block
-@@ -94,28 +94,37 @@ What: /sys/block/<disk>/queue/physical_block_size
- Date: May 2009
- Contact: Martin K. Petersen <martin.petersen@oracle.com>
- Description:
-- This is the smallest unit the storage device can write
-- without resorting to read-modify-write operation. It is
-- usually the same as the logical block size but may be
-- bigger. One example is SATA drives with 4KB sectors
-- that expose a 512-byte logical block size to the
-- operating system.
-+ This is the smallest unit a physical storage device can
-+ write atomically. It is usually the same as the logical
-+ block size but may be bigger. One example is SATA
-+ drives with 4KB sectors that expose a 512-byte logical
-+ block size to the operating system. For stacked block
-+ devices the physical_block_size variable contains the
-+ maximum physical_block_size of the component devices.
-
- What: /sys/block/<disk>/queue/minimum_io_size
- Date: April 2009
- Contact: Martin K. Petersen <martin.petersen@oracle.com>
- Description:
-- Storage devices may report a preferred minimum I/O size,
-- which is the smallest request the device can perform
-- without incurring a read-modify-write penalty. For disk
-- drives this is often the physical block size. For RAID
-- arrays it is often the stripe chunk size.
-+ Storage devices may report a granularity or preferred
-+ minimum I/O size which is the smallest request the
-+ device can perform without incurring a performance
-+ penalty. For disk drives this is often the physical
-+ block size. For RAID arrays it is often the stripe
-+ chunk size. A properly aligned multiple of
-+ minimum_io_size is the preferred request size for
-+ workloads where a high number of I/O operations is
-+ desired.
-
- What: /sys/block/<disk>/queue/optimal_io_size
- Date: April 2009
- Contact: Martin K. Petersen <martin.petersen@oracle.com>
- Description:
- Storage devices may report an optimal I/O size, which is
-- the device's preferred unit of receiving I/O. This is
-- rarely reported for disk drives. For RAID devices it is
-- usually the stripe width or the internal block size.
-+ the device's preferred unit for sustained I/O. This is
-+ rarely reported for disk drives. For RAID arrays it is
-+ usually the stripe width or the internal track size. A
-+ properly aligned multiple of optimal_io_size is the
-+ preferred request size for workloads where sustained
-+ throughput is desired. If no optimal I/O size is
-+ reported this file contains 0.
-diff --git a/Documentation/DocBook/kernel-hacking.tmpl b/Documentation/DocBook/kernel-hacking.tmpl
-index a50d6cd..992e67e 100644
---- a/Documentation/DocBook/kernel-hacking.tmpl
-+++ b/Documentation/DocBook/kernel-hacking.tmpl
-@@ -449,8 +449,8 @@ printk(KERN_INFO "i = %u\n", i);
- </para>
-
- <programlisting>
--__u32 ipaddress;
--printk(KERN_INFO "my ip: %d.%d.%d.%d\n", NIPQUAD(ipaddress));
-+__be32 ipaddress;
-+printk(KERN_INFO "my ip: %pI4\n", &amp;ipaddress);
- </programlisting>
-
- <para>
-diff --git a/Documentation/laptops/thinkpad-acpi.txt b/Documentation/laptops/thinkpad-acpi.txt
-index f2296ec..e2ddcde 100644
---- a/Documentation/laptops/thinkpad-acpi.txt
-+++ b/Documentation/laptops/thinkpad-acpi.txt
-@@ -36,8 +36,6 @@ detailed description):
- - Bluetooth enable and disable
- - video output switching, expansion control
- - ThinkLight on and off
-- - limited docking and undocking
-- - UltraBay eject
- - CMOS/UCMS control
- - LED control
- - ACPI sounds
-@@ -729,131 +727,6 @@ cannot be read or if it is unknown, thinkpad-acpi will report it as "off".
- It is impossible to know if the status returned through sysfs is valid.
-
-
--Docking / undocking -- /proc/acpi/ibm/dock
--------------------------------------------
--
--Docking and undocking (e.g. with the X4 UltraBase) requires some
--actions to be taken by the operating system to safely make or break
--the electrical connections with the dock.
--
--The docking feature of this driver generates the following ACPI events:
--
-- ibm/dock GDCK 00000003 00000001 -- eject request
-- ibm/dock GDCK 00000003 00000002 -- undocked
-- ibm/dock GDCK 00000000 00000003 -- docked
--
--NOTE: These events will only be generated if the laptop was docked
--when originally booted. This is due to the current lack of support for
--hot plugging of devices in the Linux ACPI framework. If the laptop was
--booted while not in the dock, the following message is shown in the
--logs:
--
-- Mar 17 01:42:34 aero kernel: thinkpad_acpi: dock device not present
--
--In this case, no dock-related events are generated but the dock and
--undock commands described below still work. They can be executed
--manually or triggered by Fn key combinations (see the example acpid
--configuration files included in the driver tarball package available
--on the web site).
--
--When the eject request button on the dock is pressed, the first event
--above is generated. The handler for this event should issue the
--following command:
--
-- echo undock > /proc/acpi/ibm/dock
--
--After the LED on the dock goes off, it is safe to eject the laptop.
--Note: if you pressed this key by mistake, go ahead and eject the
--laptop, then dock it back in. Otherwise, the dock may not function as
--expected.
--
--When the laptop is docked, the third event above is generated. The
--handler for this event should issue the following command to fully
--enable the dock:
--
-- echo dock > /proc/acpi/ibm/dock
--
--The contents of the /proc/acpi/ibm/dock file shows the current status
--of the dock, as provided by the ACPI framework.
--
--The docking support in this driver does not take care of enabling or
--disabling any other devices you may have attached to the dock. For
--example, a CD drive plugged into the UltraBase needs to be disabled or
--enabled separately. See the provided example acpid configuration files
--for how this can be accomplished.
--
--There is no support yet for PCI devices that may be attached to a
--docking station, e.g. in the ThinkPad Dock II. The driver currently
--does not recognize, enable or disable such devices. This means that
--the only docking stations currently supported are the X-series
--UltraBase docks and "dumb" port replicators like the Mini Dock (the
--latter don't need any ACPI support, actually).
--
--
--UltraBay eject -- /proc/acpi/ibm/bay
--------------------------------------
--
--Inserting or ejecting an UltraBay device requires some actions to be
--taken by the operating system to safely make or break the electrical
--connections with the device.
--
--This feature generates the following ACPI events:
--
-- ibm/bay MSTR 00000003 00000000 -- eject request
-- ibm/bay MSTR 00000001 00000000 -- eject lever inserted
--
--NOTE: These events will only be generated if the UltraBay was present
--when the laptop was originally booted (on the X series, the UltraBay
--is in the dock, so it may not be present if the laptop was undocked).
--This is due to the current lack of support for hot plugging of devices
--in the Linux ACPI framework. If the laptop was booted without the
--UltraBay, the following message is shown in the logs:
--
-- Mar 17 01:42:34 aero kernel: thinkpad_acpi: bay device not present
--
--In this case, no bay-related events are generated but the eject
--command described below still works. It can be executed manually or
--triggered by a hot key combination.
--
--Sliding the eject lever generates the first event shown above. The
--handler for this event should take whatever actions are necessary to
--shut down the device in the UltraBay (e.g. call idectl), then issue
--the following command:
--
-- echo eject > /proc/acpi/ibm/bay
--
--After the LED on the UltraBay goes off, it is safe to pull out the
--device.
--
--When the eject lever is inserted, the second event above is
--generated. The handler for this event should take whatever actions are
--necessary to enable the UltraBay device (e.g. call idectl).
--
--The contents of the /proc/acpi/ibm/bay file shows the current status
--of the UltraBay, as provided by the ACPI framework.
--
--EXPERIMENTAL warm eject support on the 600e/x, A22p and A3x (To use
--this feature, you need to supply the experimental=1 parameter when
--loading the module):
--
--These models do not have a button near the UltraBay device to request
--a hot eject but rather require the laptop to be put to sleep
--(suspend-to-ram) before the bay device is ejected or inserted).
--The sequence of steps to eject the device is as follows:
--
-- echo eject > /proc/acpi/ibm/bay
-- put the ThinkPad to sleep
-- remove the drive
-- resume from sleep
-- cat /proc/acpi/ibm/bay should show that the drive was removed
--
--On the A3x, both the UltraBay 2000 and UltraBay Plus devices are
--supported. Use "eject2" instead of "eject" for the second bay.
--
--Note: the UltraBay eject support on the 600e/x, A22p and A3x is
--EXPERIMENTAL and may not work as expected. USE WITH CAUTION!
--
--
- CMOS/UCMS control
- -----------------
-
-diff --git a/MAINTAINERS b/MAINTAINERS
-index d6befb2..b1114cf 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -4995,7 +4995,9 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
- S: Maintained
-
- TTY LAYER
--S: Orphan
-+M: Greg Kroah-Hartman <gregkh@suse.de>
-+S: Maintained
-+T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
- F: drivers/char/tty_*
- F: drivers/serial/serial_core.c
- F: include/linux/serial_core.h
-diff --git a/Makefile b/Makefile
-index 0d46615..054e166 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,7 +1,7 @@
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 31
--EXTRAVERSION = -rc5
-+EXTRAVERSION = -rc5-git3
- NAME = Man-Eating Seals of Antiquity
-
- # *DOCUMENTATION*
-diff --git a/arch/mips/alchemy/mtx-1/platform.c b/arch/mips/alchemy/mtx-1/platform.c
-index 8b5914d..e30e42a 100644
---- a/arch/mips/alchemy/mtx-1/platform.c
-+++ b/arch/mips/alchemy/mtx-1/platform.c
-@@ -1,7 +1,7 @@
- /*
- * MTX-1 platform devices registration
- *
-- * Copyright (C) 2007, Florian Fainelli <florian@openwrt.org>
-+ * Copyright (C) 2007-2009, Florian Fainelli <florian@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
-@@ -142,7 +142,17 @@ static struct __initdata platform_device * mtx1_devs[] = {
-
- static int __init mtx1_register_devices(void)
- {
-- gpio_direction_input(207);
-+ int rc;
-+
-+ rc = gpio_request(mtx1_gpio_button[0].gpio,
-+ mtx1_gpio_button[0].desc);
-+ if (rc < 0) {
-+ printk(KERN_INFO "mtx1: failed to request %d\n",
-+ mtx1_gpio_button[0].gpio);
-+ goto out;
-+ }
-+ gpio_direction_input(mtx1_gpio_button[0].gpio);
-+out:
- return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
- }
-
-diff --git a/arch/mips/ar7/Makefile b/arch/mips/ar7/Makefile
-index 7435e44..26bc5da 100644
---- a/arch/mips/ar7/Makefile
-+++ b/arch/mips/ar7/Makefile
-@@ -8,3 +8,4 @@ obj-y := \
- platform.o \
- gpio.o \
- clock.o
-+EXTRA_CFLAGS += -Werror
-diff --git a/arch/mips/ar7/clock.c b/arch/mips/ar7/clock.c
-index 27dc666..cc65c8e 100644
---- a/arch/mips/ar7/clock.c
-+++ b/arch/mips/ar7/clock.c
-@@ -264,19 +264,6 @@ static void __init tnetd7300_init_clocks(void)
- iounmap(bootcr);
- }
-
--static int tnetd7200_get_clock(int base, struct tnetd7200_clock *clock,
-- u32 *bootcr, u32 bus_clock)
--{
-- int divisor = ((readl(&clock->prediv) & 0x1f) + 1) *
-- ((readl(&clock->postdiv) & 0x1f) + 1);
--
-- if (*bootcr & BOOT_PLL_BYPASS)
-- return base / divisor;
--
-- return base * ((readl(&clock->mul) & 0xf) + 1) / divisor;
--}
--
--
- static void tnetd7200_set_clock(int base, struct tnetd7200_clock *clock,
- int prediv, int postdiv, int postdiv2, int mul, u32 frequency)
- {
-diff --git a/arch/mips/ar7/memory.c b/arch/mips/ar7/memory.c
-index 46fed44..696c723 100644
---- a/arch/mips/ar7/memory.c
-+++ b/arch/mips/ar7/memory.c
-@@ -52,7 +52,7 @@ static int __init memsize(void)
- size <<= 1;
- } while (size < (64 << 20));
-
-- writel(tmpaddr, &addr);
-+ writel((u32)tmpaddr, &addr);
-
- return size;
- }
-diff --git a/arch/mips/ar7/platform.c b/arch/mips/ar7/platform.c
-index 5422449..2ecab61 100644
---- a/arch/mips/ar7/platform.c
-+++ b/arch/mips/ar7/platform.c
-@@ -28,7 +28,6 @@
- #include <linux/serial_8250.h>
- #include <linux/ioport.h>
- #include <linux/io.h>
--#include <linux/version.h>
- #include <linux/vlynq.h>
- #include <linux/leds.h>
- #include <linux/string.h>
-@@ -243,13 +242,13 @@ static struct platform_device physmap_flash = {
- .num_resources = 1,
- };
-
--static u64 cpmac_dma_mask = DMA_32BIT_MASK;
-+static u64 cpmac_dma_mask = DMA_BIT_MASK(32);
- static struct platform_device cpmac_low = {
- .id = 0,
- .name = "cpmac",
- .dev = {
- .dma_mask = &cpmac_dma_mask,
-- .coherent_dma_mask = DMA_32BIT_MASK,
-+ .coherent_dma_mask = DMA_BIT_MASK(32),
- .platform_data = &cpmac_low_data,
- },
- .resource = cpmac_low_res,
-@@ -261,7 +260,7 @@ static struct platform_device cpmac_high = {
- .name = "cpmac",
- .dev = {
- .dma_mask = &cpmac_dma_mask,
-- .coherent_dma_mask = DMA_32BIT_MASK,
-+ .coherent_dma_mask = DMA_BIT_MASK(32),
- .platform_data = &cpmac_high_data,
- },
- .resource = cpmac_high_res,
-@@ -481,6 +480,7 @@ static void __init detect_leds(void)
- static int __init ar7_register_devices(void)
- {
- int res;
-+#ifdef CONFIG_SERIAL_8250
- static struct uart_port uart_port[2];
-
- memset(uart_port, 0, sizeof(struct uart_port) * 2);
-@@ -512,7 +512,7 @@ static int __init ar7_register_devices(void)
- if (res)
- return res;
- }
--
-+#endif /* CONFIG_SERIAL_8250 */
- res = platform_device_register(&physmap_flash);
- if (res)
- return res;
-diff --git a/arch/mips/ar7/prom.c b/arch/mips/ar7/prom.c
-index a320bce..5ad6f1d 100644
---- a/arch/mips/ar7/prom.c
-+++ b/arch/mips/ar7/prom.c
-@@ -144,7 +144,7 @@ static char * __init lookup_psp_var_map(u8 num)
- {
- int i;
-
-- for (i = 0; i < sizeof(psp_var_map); i++)
-+ for (i = 0; i < ARRAY_SIZE(psp_var_map); i++)
- if (psp_var_map[i].num == num)
- return psp_var_map[i].value;
-
-diff --git a/arch/mips/ar7/setup.c b/arch/mips/ar7/setup.c
-index 6ebb5f1..39f6b5b 100644
---- a/arch/mips/ar7/setup.c
-+++ b/arch/mips/ar7/setup.c
-@@ -15,7 +15,6 @@
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- */
--#include <linux/version.h>
- #include <linux/init.h>
- #include <linux/ioport.h>
- #include <linux/pm.h>
-diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
-index 0b891a9..32d51a3 100644
---- a/arch/mips/cavium-octeon/smp.c
-+++ b/arch/mips/cavium-octeon/smp.c
-@@ -194,11 +194,11 @@ static void octeon_init_secondary(void)
- void octeon_prepare_cpus(unsigned int max_cpus)
- {
- cvmx_write_csr(CVMX_CIU_MBOX_CLRX(cvmx_get_core_num()), 0xffffffff);
-- if (request_irq(OCTEON_IRQ_MBOX0, mailbox_interrupt, IRQF_SHARED,
-+ if (request_irq(OCTEON_IRQ_MBOX0, mailbox_interrupt, IRQF_DISABLED,
- "mailbox0", mailbox_interrupt)) {
- panic("Cannot request_irq(OCTEON_IRQ_MBOX0)\n");
- }
-- if (request_irq(OCTEON_IRQ_MBOX1, mailbox_interrupt, IRQF_SHARED,
-+ if (request_irq(OCTEON_IRQ_MBOX1, mailbox_interrupt, IRQF_DISABLED,
- "mailbox1", mailbox_interrupt)) {
- panic("Cannot request_irq(OCTEON_IRQ_MBOX1)\n");
- }
-diff --git a/arch/mips/dec/ecc-berr.c b/arch/mips/dec/ecc-berr.c
-index 6a17c9b..7abce66 100644
---- a/arch/mips/dec/ecc-berr.c
-+++ b/arch/mips/dec/ecc-berr.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/ecc-berr.c
-- *
- * Bus error event handling code for systems equipped with ECC
- * handling logic, i.e. DECstation/DECsystem 5000/200 (KN02),
- * 5000/240 (KN03), 5000/260 (KN05) and DECsystem 5900 (KN03),
-diff --git a/arch/mips/dec/int-handler.S b/arch/mips/dec/int-handler.S
-index 00cecdc..82c8528 100644
---- a/arch/mips/dec/int-handler.S
-+++ b/arch/mips/dec/int-handler.S
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/dec/int-handler.S
-- *
- * Copyright (C) 1995, 1996, 1997 Paul M. Antoine and Harald Koerfgen
- * Copyright (C) 2000, 2001, 2002, 2003, 2005 Maciej W. Rozycki
- *
-diff --git a/arch/mips/dec/ioasic-irq.c b/arch/mips/dec/ioasic-irq.c
-index 3acb133..cb41954 100644
---- a/arch/mips/dec/ioasic-irq.c
-+++ b/arch/mips/dec/ioasic-irq.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/ioasic-irq.c
-- *
- * DEC I/O ASIC interrupts.
- *
- * Copyright (c) 2002, 2003 Maciej W. Rozycki
-diff --git a/arch/mips/dec/kn01-berr.c b/arch/mips/dec/kn01-berr.c
-index d3b8002..b0dc6d5 100644
---- a/arch/mips/dec/kn01-berr.c
-+++ b/arch/mips/dec/kn01-berr.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/kn01-berr.c
-- *
- * Bus error event handling code for DECstation/DECsystem 3100
- * and 2100 (KN01) systems equipped with parity error detection
- * logic.
-diff --git a/arch/mips/dec/kn02-irq.c b/arch/mips/dec/kn02-irq.c
-index 02439dc..ed90a8d 100644
---- a/arch/mips/dec/kn02-irq.c
-+++ b/arch/mips/dec/kn02-irq.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/kn02-irq.c
-- *
- * DECstation 5000/200 (KN02) Control and Status Register
- * interrupts.
- *
-diff --git a/arch/mips/dec/kn02xa-berr.c b/arch/mips/dec/kn02xa-berr.c
-index 5f04545..07ca540 100644
---- a/arch/mips/dec/kn02xa-berr.c
-+++ b/arch/mips/dec/kn02xa-berr.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/kn02xa-berr.c
-- *
- * Bus error event handling code for 5000-series systems equipped
- * with parity error detection logic, i.e. DECstation/DECsystem
- * 5000/120, /125, /133 (KN02-BA), 5000/150 (KN04-BA) and Personal
-diff --git a/arch/mips/dec/prom/call_o32.S b/arch/mips/dec/prom/call_o32.S
-index e523454..8c84981 100644
---- a/arch/mips/dec/prom/call_o32.S
-+++ b/arch/mips/dec/prom/call_o32.S
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/dec/prom/call_o32.S
-- *
- * O32 interface for the 64 (or N32) ABI.
- *
- * Copyright (C) 2002 Maciej W. Rozycki
-diff --git a/arch/mips/dec/prom/console.c b/arch/mips/dec/prom/console.c
-index 078e1a1..caa6e04 100644
---- a/arch/mips/dec/prom/console.c
-+++ b/arch/mips/dec/prom/console.c
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/dec/prom/console.c
-- *
- * DECstation PROM-based early console support.
- *
- * Copyright (C) 2004, 2007 Maciej W. Rozycki
-diff --git a/arch/mips/dec/time.c b/arch/mips/dec/time.c
-index 1359c03..463136e 100644
---- a/arch/mips/dec/time.c
-+++ b/arch/mips/dec/time.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/dec/time.c
-- *
- * Copyright (C) 1991, 1992, 1995 Linus Torvalds
- * Copyright (C) 2000, 2003 Maciej W. Rozycki
- *
-diff --git a/arch/mips/emma/common/Makefile b/arch/mips/emma/common/Makefile
-index c392d28..f27d84d 100644
---- a/arch/mips/emma/common/Makefile
-+++ b/arch/mips/emma/common/Makefile
-@@ -1,7 +1,4 @@
- #
--# arch/mips/emma2rh/common/Makefile
--# Makefile for the common code of NEC EMMA2RH based board.
--#
- # Copyright (C) NEC Electronics Corporation 2005-2006
- #
- # This program is free software; you can redistribute it and/or modify
-diff --git a/arch/mips/emma/common/prom.c b/arch/mips/emma/common/prom.c
-index 120f53f..708f087 100644
---- a/arch/mips/emma/common/prom.c
-+++ b/arch/mips/emma/common/prom.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/emma2rh/common/prom.c
-- * This file is prom file.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/ddb5xxx/common/prom.c
-diff --git a/arch/mips/emma/markeins/Makefile b/arch/mips/emma/markeins/Makefile
-index 16e0017..f8ba250 100644
---- a/arch/mips/emma/markeins/Makefile
-+++ b/arch/mips/emma/markeins/Makefile
-@@ -1,7 +1,4 @@
- #
--# arch/mips/emma2rh/markeins/Makefile
--# Makefile for the common code of NEC EMMA2RH based board.
--#
- # Copyright (C) NEC Electronics Corporation 2005-2006
- #
- # This program is free software; you can redistribute it and/or modify
-diff --git a/arch/mips/emma/markeins/irq.c b/arch/mips/emma/markeins/irq.c
-index 43828ae..9504b7e 100644
---- a/arch/mips/emma/markeins/irq.c
-+++ b/arch/mips/emma/markeins/irq.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/emma2rh/markeins/irq.c
-- * This file defines the irq handler for EMMA2RH.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
-diff --git a/arch/mips/emma/markeins/led.c b/arch/mips/emma/markeins/led.c
-index 377a181..4975589 100644
---- a/arch/mips/emma/markeins/led.c
-+++ b/arch/mips/emma/markeins/led.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/emma2rh/markeins/led.c
-- * This file defines the led display for Mark-eins.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This program is free software; you can redistribute it and/or modify
-diff --git a/arch/mips/emma/markeins/platform.c b/arch/mips/emma/markeins/platform.c
-index 80ae12e..b05b08b 100644
---- a/arch/mips/emma/markeins/platform.c
-+++ b/arch/mips/emma/markeins/platform.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/emma2rh/markeins/platofrm.c
-- * This file sets up platform devices for EMMA2RH Mark-eins.
-- *
- * Copyright(C) MontaVista Software Inc, 2006
- *
- * Author: dmitry pervushin <dpervushin@ru.mvista.com>
-diff --git a/arch/mips/emma/markeins/setup.c b/arch/mips/emma/markeins/setup.c
-index 67f4565..335dc8c 100644
---- a/arch/mips/emma/markeins/setup.c
-+++ b/arch/mips/emma/markeins/setup.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/emma2rh/markeins/setup.c
-- * This file is setup for EMMA2RH Mark-eins.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/ddb5xxx/ddb5477/setup.c.
-diff --git a/arch/mips/fw/lib/call_o32.S b/arch/mips/fw/lib/call_o32.S
-index bdf7d1d..e0a6871 100644
---- a/arch/mips/fw/lib/call_o32.S
-+++ b/arch/mips/fw/lib/call_o32.S
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/dec/prom/call_o32.S
-- *
- * O32 interface for the 64 (or N32) ABI.
- *
- * Copyright (C) 2002 Maciej W. Rozycki
-diff --git a/arch/mips/include/asm/emma/emma2rh.h b/arch/mips/include/asm/emma/emma2rh.h
-index 30aea91..2afb2fe 100644
---- a/arch/mips/include/asm/emma/emma2rh.h
-+++ b/arch/mips/include/asm/emma/emma2rh.h
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/include/asm/emma/emma2rh.h
-- * This file is EMMA2RH common header.
-- *
- * Copyright (C) NEC Electronics Corporation 2005-2006
- *
- * This file based on include/asm-mips/ddb5xxx/ddb5xxx.h
-diff --git a/arch/mips/include/asm/emma/markeins.h b/arch/mips/include/asm/emma/markeins.h
-index 973b062..2618bf2 100644
---- a/arch/mips/include/asm/emma/markeins.h
-+++ b/arch/mips/include/asm/emma/markeins.h
-@@ -1,7 +1,4 @@
- /*
-- * include/asm-mips/emma2rh/markeins.h
-- * This file is EMMA2RH board depended header.
-- *
- * Copyright (C) NEC Electronics Corporation 2005-2006
- *
- * This file based on include/asm-mips/ddb5xxx/ddb5xxx.h
-diff --git a/arch/mips/include/asm/gic.h b/arch/mips/include/asm/gic.h
-index 10292e3..a8f5734 100644
---- a/arch/mips/include/asm/gic.h
-+++ b/arch/mips/include/asm/gic.h
-@@ -20,7 +20,7 @@
- #define GIC_TRIG_EDGE 1
- #define GIC_TRIG_LEVEL 0
-
--#if CONFIG_SMP
-+#ifdef CONFIG_SMP
- #define GIC_NUM_INTRS (24 + NR_CPUS * 2)
- #else
- #define GIC_NUM_INTRS 32
-diff --git a/arch/mips/include/asm/pmc-sierra/msp71xx/war.h b/arch/mips/include/asm/pmc-sierra/msp71xx/war.h
-index 0bf48fc..9e2ee42 100644
---- a/arch/mips/include/asm/pmc-sierra/msp71xx/war.h
-+++ b/arch/mips/include/asm/pmc-sierra/msp71xx/war.h
-@@ -23,6 +23,8 @@
- #if defined(CONFIG_PMC_MSP7120_EVAL) || defined(CONFIG_PMC_MSP7120_GW) || \
- defined(CONFIG_PMC_MSP7120_FPGA)
- #define MIPS34K_MISSED_ITLB_WAR 1
-+#else
-+#define MIPS34K_MISSED_ITLB_WAR 0
- #endif
-
- #endif /* __ASM_MIPS_PMC_SIERRA_WAR_H */
-diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
-index 0f926aa..087a888 100644
---- a/arch/mips/include/asm/processor.h
-+++ b/arch/mips/include/asm/processor.h
-@@ -311,8 +311,9 @@ extern void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long
-
- unsigned long get_wchan(struct task_struct *p);
-
--#define __KSTK_TOS(tsk) ((unsigned long)task_stack_page(tsk) + THREAD_SIZE - 32)
--#define task_pt_regs(tsk) ((struct pt_regs *)__KSTK_TOS(tsk) - 1)
-+#define __KSTK_TOS(tsk) ((unsigned long)task_stack_page(tsk) + \
-+ THREAD_SIZE - 32 - sizeof(struct pt_regs))
-+#define task_pt_regs(tsk) ((struct pt_regs *)__KSTK_TOS(tsk))
- #define KSTK_EIP(tsk) (task_pt_regs(tsk)->cp0_epc)
- #define KSTK_ESP(tsk) (task_pt_regs(tsk)->regs[29])
- #define KSTK_STATUS(tsk) (task_pt_regs(tsk)->cp0_status)
-diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h
-index b70c49f..e753a77 100644
---- a/arch/mips/include/asm/unistd.h
-+++ b/arch/mips/include/asm/unistd.h
-@@ -354,16 +354,17 @@
- #define __NR_pwritev (__NR_Linux + 331)
- #define __NR_rt_tgsigqueueinfo (__NR_Linux + 332)
- #define __NR_perf_counter_open (__NR_Linux + 333)
-+#define __NR_accept4 (__NR_Linux + 334)
-
- /*
- * Offset of the last Linux o32 flavoured syscall
- */
--#define __NR_Linux_syscalls 333
-+#define __NR_Linux_syscalls 334
-
- #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
-
- #define __NR_O32_Linux 4000
--#define __NR_O32_Linux_syscalls 333
-+#define __NR_O32_Linux_syscalls 334
-
- #if _MIPS_SIM == _MIPS_SIM_ABI64
-
-@@ -664,16 +665,17 @@
- #define __NR_pwritev (__NR_Linux + 290)
- #define __NR_rt_tgsigqueueinfo (__NR_Linux + 291)
- #define __NR_perf_counter_open (__NR_Linux + 292)
-+#define __NR_accept4 (__NR_Linux + 293)
-
- /*
- * Offset of the last Linux 64-bit flavoured syscall
- */
--#define __NR_Linux_syscalls 292
-+#define __NR_Linux_syscalls 293
-
- #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
-
- #define __NR_64_Linux 5000
--#define __NR_64_Linux_syscalls 292
-+#define __NR_64_Linux_syscalls 293
-
- #if _MIPS_SIM == _MIPS_SIM_NABI32
-
-@@ -978,16 +980,17 @@
- #define __NR_pwritev (__NR_Linux + 294)
- #define __NR_rt_tgsigqueueinfo (__NR_Linux + 295)
- #define __NR_perf_counter_open (__NR_Linux + 296)
-+#define __NR_accept4 (__NR_Linux + 297)
-
- /*
- * Offset of the last N32 flavoured syscall
- */
--#define __NR_Linux_syscalls 296
-+#define __NR_Linux_syscalls 297
-
- #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
-
- #define __NR_N32_Linux 6000
--#define __NR_N32_Linux_syscalls 296
-+#define __NR_N32_Linux_syscalls 297
-
- #ifdef __KERNEL__
-
-diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c
-index f0fd636..0d64d0f 100644
---- a/arch/mips/jazz/jazzdma.c
-+++ b/arch/mips/jazz/jazzdma.c
-@@ -190,7 +190,7 @@ int vdma_free(unsigned long laddr)
- return -1;
- }
-
-- while (pgtbl[i].owner == laddr && i < VDMA_PGTBL_ENTRIES) {
-+ while (i < VDMA_PGTBL_ENTRIES && pgtbl[i].owner == laddr) {
- pgtbl[i].owner = VDMA_PAGE_EMPTY;
- i++;
- }
-diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
-index 492a0a8..531ce7b 100644
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -188,7 +188,8 @@ NESTED(kernel_entry, 16, sp) # kernel entry point
-
- MTC0 zero, CP0_CONTEXT # clear context register
- PTR_LA $28, init_thread_union
-- PTR_LI sp, _THREAD_SIZE - 32
-+ /* Set the SP after an empty pt_regs. */
-+ PTR_LI sp, _THREAD_SIZE - 32 - PT_SIZE
- PTR_ADDU sp, $28
- set_saved_sp sp, t0, t1
- PTR_SUBU sp, 4 * SZREG # init stack pointer
-diff --git a/arch/mips/kernel/irq_txx9.c b/arch/mips/kernel/irq_txx9.c
-index a4d1462..9b78029 100644
---- a/arch/mips/kernel/irq_txx9.c
-+++ b/arch/mips/kernel/irq_txx9.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/kernel/irq_txx9.c
-- *
- * Based on linux/arch/mips/jmr3927/rbhma3100/irq.c,
- * linux/arch/mips/tx4927/common/tx4927_irq.c,
- * linux/arch/mips/tx4938/common/irq.c
-diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c
-index 3e9100d..6f51dda 100644
---- a/arch/mips/kernel/module.c
-+++ b/arch/mips/kernel/module.c
-@@ -98,7 +98,8 @@ static int apply_r_mips_32_rela(struct module *me, u32 *location, Elf_Addr v)
- static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
- {
- if (v % 4) {
-- printk(KERN_ERR "module %s: dangerous relocation\n", me->name);
-+ pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
-+ me->name);
- return -ENOEXEC;
- }
-
-@@ -118,7 +119,8 @@ static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
- static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
- {
- if (v % 4) {
-- printk(KERN_ERR "module %s: dangerous relocation\n", me->name);
-+ pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
-+ me->name);
- return -ENOEXEC;
- }
-
-@@ -222,7 +224,7 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v)
- return 0;
-
- out_danger:
-- printk(KERN_ERR "module %s: dangerous " "relocation\n", me->name);
-+ pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name);
-
- return -ENOEXEC;
- }
-@@ -301,7 +303,7 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
- /* This is the symbol it is referring to */
- sym = (Elf_Sym *)sechdrs[symindex].sh_addr
- + ELF_MIPS_R_SYM(rel[i]);
-- if (!sym->st_value) {
-+ if (IS_ERR_VALUE(sym->st_value)) {
- /* Ignore unresolved weak symbol */
- if (ELF_ST_BIND(sym->st_info) == STB_WEAK)
- continue;
-@@ -341,7 +343,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
- /* This is the symbol it is referring to */
- sym = (Elf_Sym *)sechdrs[symindex].sh_addr
- + ELF_MIPS_R_SYM(rel[i]);
-- if (!sym->st_value) {
-+ if (IS_ERR_VALUE(sym->st_value)) {
- /* Ignore unresolved weak symbol */
- if (ELF_ST_BIND(sym->st_info) == STB_WEAK)
- continue;
-diff --git a/arch/mips/kernel/proc.c b/arch/mips/kernel/proc.c
-index e0a4ac1..26109c4 100644
---- a/arch/mips/kernel/proc.c
-+++ b/arch/mips/kernel/proc.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/kernel/proc.c
-- *
- * Copyright (C) 1995, 1996, 2001 Ralf Baechle
- * Copyright (C) 2001, 2004 MIPS Technologies, Inc.
- * Copyright (C) 2004 Maciej W. Rozycki
-diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
-index c09d681..f3d73e1 100644
---- a/arch/mips/kernel/process.c
-+++ b/arch/mips/kernel/process.c
-@@ -115,7 +115,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
- {
- struct thread_info *ti = task_thread_info(p);
- struct pt_regs *childregs;
-- long childksp;
-+ unsigned long childksp;
- p->set_child_tid = p->clear_child_tid = NULL;
-
- childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32;
-@@ -132,6 +132,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
-
- /* set up new TSS. */
- childregs = (struct pt_regs *) childksp - 1;
-+ /* Put the stack after the struct pt_regs. */
-+ childksp = (unsigned long) childregs;
- *childregs = *regs;
- childregs->regs[7] = 0; /* Clear error flag */
-
-diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
-index 20a86e0..b570821 100644
---- a/arch/mips/kernel/scall32-o32.S
-+++ b/arch/mips/kernel/scall32-o32.S
-@@ -654,6 +654,7 @@ einval: li v0, -ENOSYS
- sys sys_pwritev 6
- sys sys_rt_tgsigqueueinfo 4
- sys sys_perf_counter_open 5
-+ sys sys_accept4 4
- .endm
-
- /* We pre-compute the number of _instruction_ bytes needed to
-diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
-index b046130..3d866f2 100644
---- a/arch/mips/kernel/scall64-64.S
-+++ b/arch/mips/kernel/scall64-64.S
-@@ -491,4 +491,5 @@ sys_call_table:
- PTR sys_pwritev /* 5390 */
- PTR sys_rt_tgsigqueueinfo
- PTR sys_perf_counter_open
-+ PTR sys_accept4
- .size sys_call_table,.-sys_call_table
-diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
-index 15874f9..e855b11 100644
---- a/arch/mips/kernel/scall64-n32.S
-+++ b/arch/mips/kernel/scall64-n32.S
-@@ -417,4 +417,5 @@ EXPORT(sysn32_call_table)
- PTR sys_pwritev
- PTR compat_sys_rt_tgsigqueueinfo /* 5295 */
- PTR sys_perf_counter_open
-+ PTR sys_accept4
- .size sysn32_call_table,.-sysn32_call_table
-diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
-index 781e0f1..0c49f1a 100644
---- a/arch/mips/kernel/scall64-o32.S
-+++ b/arch/mips/kernel/scall64-o32.S
-@@ -537,4 +537,5 @@ sys_call_table:
- PTR compat_sys_pwritev
- PTR compat_sys_rt_tgsigqueueinfo
- PTR sys_perf_counter_open
-+ PTR sys_accept4
- .size sys_call_table,.-sys_call_table
-diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c
-index 8a0626c..c16bb6d 100644
---- a/arch/mips/kernel/smtc.c
-+++ b/arch/mips/kernel/smtc.c
-@@ -465,11 +465,8 @@ void smtc_prepare_cpus(int cpus)
- smtc_configure_tlb();
-
- for (tc = 0, vpe = 0 ; (vpe < nvpe) && (tc < ntc) ; vpe++) {
-- /*
-- * Set the MVP bits.
-- */
-- settc(tc);
-- write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | VPECONF0_MVP);
-+ if (tcpervpe[vpe] == 0)
-+ continue;
- if (vpe != 0)
- printk(", ");
- printk("VPE %d: TC", vpe);
-@@ -488,6 +485,12 @@ void smtc_prepare_cpus(int cpus)
- }
- if (vpe != 0) {
- /*
-+ * Allow this VPE to control others.
-+ */
-+ write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() |
-+ VPECONF0_MVP);
-+
-+ /*
- * Clear any stale software interrupts from VPE's Cause
- */
- write_vpe_c0_cause(0);
-diff --git a/arch/mips/kernel/stacktrace.c b/arch/mips/kernel/stacktrace.c
-index 58f5cd7..d52ff77 100644
---- a/arch/mips/kernel/stacktrace.c
-+++ b/arch/mips/kernel/stacktrace.c
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/kernel/stacktrace.c
-- *
- * Stack trace management functions
- *
- * Copyright (C) 2006 Atsushi Nemoto <anemo@mba.ocn.ne.jp>
-diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c
-index 07b9ec2..9a1ab7e 100644
---- a/arch/mips/kernel/vpe.c
-+++ b/arch/mips/kernel/vpe.c
-@@ -73,7 +73,7 @@ static int major;
- static const int minor = 1; /* fixed for now */
-
- #ifdef CONFIG_MIPS_APSP_KSPD
-- static struct kspd_notifications kspd_events;
-+static struct kspd_notifications kspd_events;
- static int kspd_events_reqd = 0;
- #endif
-
-@@ -155,10 +155,9 @@ struct {
- };
-
- static void release_progmem(void *ptr);
--extern void save_gp_address(unsigned int secbase, unsigned int rel);
-
- /* get the vpe associated with this minor */
--struct vpe *get_vpe(int minor)
-+static struct vpe *get_vpe(int minor)
- {
- struct vpe *v;
-
-@@ -174,7 +173,7 @@ struct vpe *get_vpe(int minor)
- }
-
- /* get the vpe associated with this minor */
--struct tc *get_tc(int index)
-+static struct tc *get_tc(int index)
- {
- struct tc *t;
-
-@@ -186,20 +185,8 @@ struct tc *get_tc(int index)
- return NULL;
- }
-
--struct tc *get_tc_unused(void)
--{
-- struct tc *t;
--
-- list_for_each_entry(t, &vpecontrol.tc_list, list) {
-- if (t->state == TC_STATE_UNUSED)
-- return t;
-- }
--
-- return NULL;
--}
--
- /* allocate a vpe and associate it with this minor (or index) */
--struct vpe *alloc_vpe(int minor)
-+static struct vpe *alloc_vpe(int minor)
- {
- struct vpe *v;
-
-@@ -216,7 +203,7 @@ struct vpe *alloc_vpe(int minor)
- }
-
- /* allocate a tc. At startup only tc0 is running, all other can be halted. */
--struct tc *alloc_tc(int index)
-+static struct tc *alloc_tc(int index)
- {
- struct tc *tc;
-
-@@ -232,7 +219,7 @@ out:
- }
-
- /* clean up and free everything */
--void release_vpe(struct vpe *v)
-+static void release_vpe(struct vpe *v)
- {
- list_del(&v->list);
- if (v->load_addr)
-@@ -240,7 +227,7 @@ void release_vpe(struct vpe *v)
- kfree(v);
- }
-
--void dump_mtregs(void)
-+static void dump_mtregs(void)
- {
- unsigned long val;
-
-@@ -327,7 +314,8 @@ static void layout_sections(struct module *mod, const Elf_Ehdr * hdr,
- || (s->sh_flags & masks[m][1])
- || s->sh_entsize != ~0UL)
- continue;
-- s->sh_entsize = get_offset(&mod->core_size, s);
-+ s->sh_entsize =
-+ get_offset((unsigned long *)&mod->core_size, s);
- }
-
- if (m == 0)
-@@ -461,16 +449,15 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,
- {
- unsigned long insnlo = *location;
- Elf32_Addr val, vallo;
-+ struct mips_hi16 *l, *next;
-
- /* Sign extend the addend we extract from the lo insn. */
- vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
-
- if (mips_hi16_list != NULL) {
-- struct mips_hi16 *l;
-
- l = mips_hi16_list;
- while (l != NULL) {
-- struct mips_hi16 *next;
- unsigned long insn;
-
- /*
-@@ -480,7 +467,7 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,
- printk(KERN_DEBUG "VPE loader: "
- "apply_r_mips_lo16/hi16: \t"
- "inconsistent value information\n");
-- return -ENOEXEC;
-+ goto out_free;
- }
-
- /*
-@@ -518,6 +505,16 @@ static int apply_r_mips_lo16(struct module *me, uint32_t *location,
- *location = insnlo;
-
- return 0;
-+
-+out_free:
-+ while (l != NULL) {
-+ next = l->next;
-+ kfree(l);
-+ l = next;
-+ }
-+ mips_hi16_list = NULL;
-+
-+ return -ENOEXEC;
- }
-
- static int (*reloc_handlers[]) (struct module *me, uint32_t *location,
-@@ -541,7 +538,7 @@ static char *rstrs[] = {
- [R_MIPS_PC16] = "MIPS_PC16"
- };
-
--int apply_relocations(Elf32_Shdr *sechdrs,
-+static int apply_relocations(Elf32_Shdr *sechdrs,
- const char *strtab,
- unsigned int symindex,
- unsigned int relsec,
-@@ -586,7 +583,7 @@ int apply_relocations(Elf32_Shdr *sechdrs,
- return 0;
- }
-
--void save_gp_address(unsigned int secbase, unsigned int rel)
-+static inline void save_gp_address(unsigned int secbase, unsigned int rel)
- {
- gp_addr = secbase + rel;
- gp_offs = gp_addr - (secbase & 0xffff0000);
-diff --git a/arch/mips/mipssim/sim_time.c b/arch/mips/mipssim/sim_time.c
-index 0cea932..5492c42 100644
---- a/arch/mips/mipssim/sim_time.c
-+++ b/arch/mips/mipssim/sim_time.c
-@@ -89,13 +89,13 @@ unsigned __cpuinit get_c0_compare_int(void)
- if (cpu_has_veic) {
- set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch);
- mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR;
-- } else {
--#endif
-- {
-- if (cpu_has_vint)
-- set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
-- mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
-+
-+ return mips_cpu_timer_irq;
- }
-+#endif
-+ if (cpu_has_vint)
-+ set_vi_handler(cp0_compare_irq, mips_timer_dispatch);
-+ mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
-
- return mips_cpu_timer_irq;
- }
-diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c
-index b165cdc..10ab69f 100644
---- a/arch/mips/mm/c-octeon.c
-+++ b/arch/mips/mm/c-octeon.c
-@@ -289,7 +289,7 @@ static void cache_parity_error_octeon(int non_recoverable)
- }
-
- /**
-- * Called when the the exception is not recoverable
-+ * Called when the the exception is recoverable
- */
-
- asmlinkage void cache_parity_error_octeon_recoverable(void)
-@@ -298,7 +298,7 @@ asmlinkage void cache_parity_error_octeon_recoverable(void)
- }
-
- /**
-- * Called when the the exception is recoverable
-+ * Called when the the exception is not recoverable
- */
-
- asmlinkage void cache_parity_error_octeon_non_recoverable(void)
-diff --git a/arch/mips/mm/extable.c b/arch/mips/mm/extable.c
-index 297fb9f..9d25d2b 100644
---- a/arch/mips/mm/extable.c
-+++ b/arch/mips/mm/extable.c
-@@ -1,5 +1,9 @@
- /*
-- * linux/arch/mips/mm/extable.c
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License. See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1997, 99, 2001 - 2004 Ralf Baechle <ralf@linux-mips.org>
- */
- #include <linux/module.h>
- #include <linux/spinlock.h>
-diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
-index 6751ce9..f956ecb 100644
---- a/arch/mips/mm/fault.c
-+++ b/arch/mips/mm/fault.c
-@@ -171,6 +171,7 @@ out_of_memory:
- * We ran out of memory, call the OOM killer, and return the userspace
- * (which will retry the fault, or kill us if we got oom-killed).
- */
-+ up_read(&mm->mmap_sem);
- pagefault_out_of_memory();
- return;
-
-diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
-index a8756f8..3e0a9b3 100644
---- a/arch/mips/mti-malta/malta-int.c
-+++ b/arch/mips/mti-malta/malta-int.c
-@@ -331,6 +331,7 @@ static struct irqaction irq_call = {
- .flags = IRQF_DISABLED|IRQF_PERCPU,
- .name = "IPI_call"
- };
-+#endif /* CONFIG_MIPS_MT_SMP */
-
- static int gic_resched_int_base;
- static int gic_call_int_base;
-@@ -346,7 +347,6 @@ unsigned int plat_ipi_resched_int_xlate(unsigned int cpu)
- {
- return GIC_RESCHED_INT(cpu);
- }
--#endif /* CONFIG_MIPS_MT_SMP */
-
- static struct irqaction i8259irq = {
- .handler = no_action,
-diff --git a/arch/mips/nxp/pnx8550/common/time.c b/arch/mips/nxp/pnx8550/common/time.c
-index 8df43e9..18b1927 100644
---- a/arch/mips/nxp/pnx8550/common/time.c
-+++ b/arch/mips/nxp/pnx8550/common/time.c
-@@ -138,7 +138,7 @@ __init void plat_time_init(void)
- * HZ timer interrupts per second.
- */
- mips_hpt_frequency = 27UL * ((1000000UL * n)/(m * pow2p));
-- cpj = (mips_hpt_frequency + HZ / 2) / HZ;
-+ cpj = DIV_ROUND_CLOSEST(mips_hpt_frequency, HZ);
- write_c0_count(0);
- timer_ack();
-
-diff --git a/arch/mips/pci/fixup-emma2rh.c b/arch/mips/pci/fixup-emma2rh.c
-index fba5aad..0d9ccf4 100644
---- a/arch/mips/pci/fixup-emma2rh.c
-+++ b/arch/mips/pci/fixup-emma2rh.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/pci/fixup-emma2rh.c
-- * This file defines the PCI configration.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/ddb5xxx/ddb5477/pci.c
-diff --git a/arch/mips/pci/fixup-sb1250.c b/arch/mips/pci/fixup-sb1250.c
-index 0ad39e5..f0bb914 100644
---- a/arch/mips/pci/fixup-sb1250.c
-+++ b/arch/mips/pci/fixup-sb1250.c
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/pci/fixup-sb1250.c
-- *
- * Copyright (C) 2004, 2006 MIPS Technologies, Inc. All rights reserved.
- * Author: Maciej W. Rozycki <macro@mips.com>
- *
-diff --git a/arch/mips/pci/ops-emma2rh.c b/arch/mips/pci/ops-emma2rh.c
-index 5947a70..710aef5 100644
---- a/arch/mips/pci/ops-emma2rh.c
-+++ b/arch/mips/pci/ops-emma2rh.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/pci/ops-emma2rh.c
-- * This file defines the PCI operation for EMMA2RH.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/pci/ops-vr41xx.c
-diff --git a/arch/mips/pci/pci-emma2rh.c b/arch/mips/pci/pci-emma2rh.c
-index 2df4190..773e34f 100644
---- a/arch/mips/pci/pci-emma2rh.c
-+++ b/arch/mips/pci/pci-emma2rh.c
-@@ -1,7 +1,4 @@
- /*
-- * arch/mips/pci/pci-emma2rh.c
-- * This file defines the PCI configration.
-- *
- * Copyright (C) NEC Electronics Corporation 2004-2006
- *
- * This file is based on the arch/mips/ddb5xxx/ddb5477/pci.c
-diff --git a/arch/mips/pci/pci-tx4927.c b/arch/mips/pci/pci-tx4927.c
-index aaa9005..a580740 100644
---- a/arch/mips/pci/pci-tx4927.c
-+++ b/arch/mips/pci/pci-tx4927.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/pci/pci-tx4927.c
-- *
- * Based on linux/arch/mips/txx9/rbtx4938/setup.c,
- * and RBTX49xx patch from CELF patch archive.
- *
-diff --git a/arch/mips/pci/pci-tx4938.c b/arch/mips/pci/pci-tx4938.c
-index 1ea257b..20e45f3 100644
---- a/arch/mips/pci/pci-tx4938.c
-+++ b/arch/mips/pci/pci-tx4938.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/pci/pci-tx4938.c
-- *
- * Based on linux/arch/mips/txx9/rbtx4938/setup.c,
- * and RBTX49xx patch from CELF patch archive.
- *
-diff --git a/arch/mips/pci/pci-tx4939.c b/arch/mips/pci/pci-tx4939.c
-index 5fecf1c..9ef8406 100644
---- a/arch/mips/pci/pci-tx4939.c
-+++ b/arch/mips/pci/pci-tx4939.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/pci/pci-tx4939.c
-- *
- * Based on linux/arch/mips/txx9/rbtx4939/setup.c,
- * and RBTX49xx patch from CELF patch archive.
- *
-diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c
-index 7526224..6aa5c54 100644
---- a/arch/mips/pci/pcie-octeon.c
-+++ b/arch/mips/pci/pcie-octeon.c
-@@ -1040,19 +1040,29 @@ static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus,
- int bus_number = bus->number;
-
- /*
-- * We need to force the bus number to be zero on the root
-- * bus. Linux numbers the 2nd root bus to start after all
-- * buses on root 0.
-+ * For the top level bus make sure our hardware bus number
-+ * matches the software one.
- */
-- if (bus->parent == NULL)
-- bus_number = 0;
-+ if (bus->parent == NULL) {
-+ union cvmx_pciercx_cfg006 pciercx_cfg006;
-+ pciercx_cfg006.u32 = cvmx_pcie_cfgx_read(pcie_port,
-+ CVMX_PCIERCX_CFG006(pcie_port));
-+ if (pciercx_cfg006.s.pbnum != bus_number) {
-+ pciercx_cfg006.s.pbnum = bus_number;
-+ pciercx_cfg006.s.sbnum = bus_number;
-+ pciercx_cfg006.s.subbnum = bus_number;
-+ cvmx_pcie_cfgx_write(pcie_port,
-+ CVMX_PCIERCX_CFG006(pcie_port),
-+ pciercx_cfg006.u32);
-+ }
-+ }
-
- /*
- * PCIe only has a single device connected to Octeon. It is
- * always device ID 0. Don't bother doing reads for other
- * device IDs on the first segment.
- */
-- if ((bus_number == 0) && (devfn >> 3 != 0))
-+ if ((bus->parent == NULL) && (devfn >> 3 != 0))
- return PCIBIOS_FUNC_NOT_SUPPORTED;
-
- /*
-@@ -1070,7 +1080,7 @@ static inline int octeon_pcie_read_config(int pcie_port, struct pci_bus *bus,
- * bridge only respondes to device ID 0, function
- * 0-1
- */
-- if ((bus_number == 0) && (devfn >= 2))
-+ if ((bus->parent == NULL) && (devfn >= 2))
- return PCIBIOS_FUNC_NOT_SUPPORTED;
- /*
- * The PCI-X slots are device ID 2,3. Choose one of
-@@ -1167,13 +1177,6 @@ static inline int octeon_pcie_write_config(int pcie_port, struct pci_bus *bus,
- int size, u32 val)
- {
- int bus_number = bus->number;
-- /*
-- * We need to force the bus number to be zero on the root
-- * bus. Linux numbers the 2nd root bus to start after all
-- * busses on root 0.
-- */
-- if (bus->parent == NULL)
-- bus_number = 0;
-
- switch (size) {
- case 4:
-diff --git a/arch/mips/pmc-sierra/msp71xx/gpio.c b/arch/mips/pmc-sierra/msp71xx/gpio.c
-index 69848c5..aaccbe5 100644
---- a/arch/mips/pmc-sierra/msp71xx/gpio.c
-+++ b/arch/mips/pmc-sierra/msp71xx/gpio.c
-@@ -1,6 +1,4 @@
- /*
-- * @file /arch/mips/pmc-sierra/msp71xx/gpio.c
-- *
- * Generic PMC MSP71xx GPIO handling. These base gpio are controlled by two
- * types of registers. The data register sets the output level when in output
- * mode and when in input mode will contain the value at the input. The config
-diff --git a/arch/mips/pmc-sierra/msp71xx/gpio_extended.c b/arch/mips/pmc-sierra/msp71xx/gpio_extended.c
-index fc6dbc6..2a99f36 100644
---- a/arch/mips/pmc-sierra/msp71xx/gpio_extended.c
-+++ b/arch/mips/pmc-sierra/msp71xx/gpio_extended.c
-@@ -1,6 +1,4 @@
- /*
-- * @file /arch/mips/pmc-sierra/msp71xx/gpio_extended.c
-- *
- * Generic PMC MSP71xx EXTENDED (EXD) GPIO handling. The extended gpio is
- * a set of hardware registers that have no need for explicit locking as
- * it is handled by unique method of writing individual set/clr bits.
-diff --git a/arch/mips/pmc-sierra/msp71xx/msp_irq_slp.c b/arch/mips/pmc-sierra/msp71xx/msp_irq_slp.c
-index f5f1b8d..61f3902 100644
---- a/arch/mips/pmc-sierra/msp71xx/msp_irq_slp.c
-+++ b/arch/mips/pmc-sierra/msp71xx/msp_irq_slp.c
-@@ -45,13 +45,6 @@ static inline void mask_msp_slp_irq(unsigned int irq)
- */
- static inline void ack_msp_slp_irq(unsigned int irq)
- {
-- mask_slp_irq(irq);
--
-- /*
-- * only really necessary for 18, 16-14 and sometimes 3:0 (since
-- * these can be edge sensitive) but it doesn't hurt for the others.
-- */
--
- /* check for PER interrupt range */
- if (irq < MSP_PER_INTBASE)
- *SLP_INT_STS_REG = (1 << (irq - MSP_SLP_INTBASE));
-@@ -62,8 +55,7 @@ static inline void ack_msp_slp_irq(unsigned int irq)
- static struct irq_chip msp_slp_irq_controller = {
- .name = "MSP_SLP",
- .ack = ack_msp_slp_irq,
-- .mask = ack_msp_slp_irq,
-- .mask_ack = ack_msp_slp_irq,
-+ .mask = mask_msp_slp_irq,
- .unmask = unmask_msp_slp_irq,
- };
-
-@@ -79,7 +71,7 @@ void __init msp_slp_irq_init(void)
-
- /* initialize all the IRQ descriptors */
- for (i = MSP_SLP_INTBASE; i < MSP_PER_INTBASE + 32; i++)
-- set_irq_chip_and_handler(i, &msp_slp_irq_controller
-+ set_irq_chip_and_handler(i, &msp_slp_irq_controller,
- handle_level_irq);
- }
-
-diff --git a/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c
-index caf5e9a..fc990cb 100644
---- a/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c
-+++ b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c
-- *
- * Copyright (C) 2003 PMC-Sierra Inc.
- * Author: Manish Lachwani (lachwani@pmc-sierra.com)
- *
-diff --git a/arch/mips/sibyte/swarm/swarm-i2c.c b/arch/mips/sibyte/swarm/swarm-i2c.c
-index 4282ac9..0625050 100644
---- a/arch/mips/sibyte/swarm/swarm-i2c.c
-+++ b/arch/mips/sibyte/swarm/swarm-i2c.c
-@@ -1,6 +1,4 @@
- /*
-- * arch/mips/sibyte/swarm/swarm-i2c.c
-- *
- * Broadcom BCM91250A (SWARM), etc. I2C platform setup.
- *
- * Copyright (c) 2008 Maciej W. Rozycki
-diff --git a/arch/mips/txx9/generic/mem_tx4927.c b/arch/mips/txx9/generic/mem_tx4927.c
-index ef6ea6e..70f9626 100644
---- a/arch/mips/txx9/generic/mem_tx4927.c
-+++ b/arch/mips/txx9/generic/mem_tx4927.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/txx9/generic/mem_tx4927.c
-- *
- * common tx4927 memory interface
- *
- * Author: MontaVista Software, Inc.
-diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c
-index 3b7d77d..a205e2b 100644
---- a/arch/mips/txx9/generic/setup.c
-+++ b/arch/mips/txx9/generic/setup.c
-@@ -1,6 +1,4 @@
- /*
-- * linux/arch/mips/txx9/generic/setup.c
-- *
- * Based on linux/arch/mips/txx9/rbtx4938/setup.c,
- * and RBTX49xx patch from CELF patch archive.
- *
-diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c
-index c033ffe..b0c241e 100644
---- a/arch/mips/txx9/rbtx4939/setup.c
-+++ b/arch/mips/txx9/rbtx4939/setup.c
-@@ -512,10 +512,10 @@ static void __init rbtx4939_setup(void)
- rbtx4939_ebusc_setup();
- /* always enable ATA0 */
- txx9_set64(&tx4939_ccfgptr->pcfg, TX4939_PCFG_ATA0MODE);
-- rbtx4939_update_ioc_pen();
- if (txx9_master_clock == 0)
- txx9_master_clock = 20000000;
- tx4939_setup();
-+ rbtx4939_update_ioc_pen();
- #ifdef HAVE_RBTX4939_IOSWAB
- ioswabw = rbtx4939_ioswabw;
- __mem_ioswabw = rbtx4939_mem_ioswabw;
-diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
-index ae3e70c..e552e54 100644
---- a/arch/parisc/kernel/entry.S
-+++ b/arch/parisc/kernel/entry.S
-@@ -553,7 +553,7 @@
- * on most of those machines only handles cache transactions.
- */
- extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0
-- depi 1,12,1,\prot
-+ depdi 1,12,1,\prot
-
- /* Drop prot bits and convert to page addr for iitlbt and idtlbt */
- convert_for_tlb_insert20 \pte
-diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c
-index ef5caf2..61ee0ee 100644
---- a/arch/parisc/kernel/module.c
-+++ b/arch/parisc/kernel/module.c
-@@ -86,8 +86,12 @@
- * the bottom of the table, which has a maximum signed displacement of
- * 0x3fff; however, since we're only going forward, this becomes
- * 0x1fff, and thus, since each GOT entry is 8 bytes long we can have
-- * at most 1023 entries */
--#define MAX_GOTS 1023
-+ * at most 1023 entries.
-+ * To overcome this 14bit displacement with some kernel modules, we'll
-+ * use instead the unusal 16bit displacement method (see reassemble_16a)
-+ * which gives us a maximum positive displacement of 0x7fff, and as such
-+ * allows us to allocate up to 4095 GOT entries. */
-+#define MAX_GOTS 4095
-
- /* three functions to determine where in the module core
- * or init pieces the location is */
-@@ -145,12 +149,40 @@ struct stub_entry {
- /* The reassemble_* functions prepare an immediate value for
- insertion into an opcode. pa-risc uses all sorts of weird bitfields
- in the instruction to hold the value. */
-+static inline int sign_unext(int x, int len)
-+{
-+ int len_ones;
-+
-+ len_ones = (1 << len) - 1;
-+ return x & len_ones;
-+}
-+
-+static inline int low_sign_unext(int x, int len)
-+{
-+ int sign, temp;
-+
-+ sign = (x >> (len-1)) & 1;
-+ temp = sign_unext(x, len-1);
-+ return (temp << 1) | sign;
-+}
-+
- static inline int reassemble_14(int as14)
- {
- return (((as14 & 0x1fff) << 1) |
- ((as14 & 0x2000) >> 13));
- }
-
-+static inline int reassemble_16a(int as16)
-+{
-+ int s, t;
-+
-+ /* Unusual 16-bit encoding, for wide mode only. */
-+ t = (as16 << 1) & 0xffff;
-+ s = (as16 & 0x8000);
-+ return (t ^ s ^ (s >> 1)) | (s >> 15);
-+}
-+
-+
- static inline int reassemble_17(int as17)
- {
- return (((as17 & 0x10000) >> 16) |
-@@ -407,6 +439,7 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
- enum elf_stub_type stub_type, Elf_Addr loc0, unsigned int targetsec)
- {
- struct stub_entry *stub;
-+ int __maybe_unused d;
-
- /* initialize stub_offset to point in front of the section */
- if (!me->arch.section[targetsec].stub_offset) {
-@@ -460,12 +493,19 @@ static Elf_Addr get_stub(struct module *me, unsigned long value, long addend,
- */
- switch (stub_type) {
- case ELF_STUB_GOT:
-- stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */
-+ d = get_got(me, value, addend);
-+ if (d <= 15) {
-+ /* Format 5 */
-+ stub->insns[0] = 0x0f6010db; /* ldd 0(%dp),%dp */
-+ stub->insns[0] |= low_sign_unext(d, 5) << 16;
-+ } else {
-+ /* Format 3 */
-+ stub->insns[0] = 0x537b0000; /* ldd 0(%dp),%dp */
-+ stub->insns[0] |= reassemble_16a(d);
-+ }
- stub->insns[1] = 0x53610020; /* ldd 10(%dp),%r1 */
- stub->insns[2] = 0xe820d000; /* bve (%r1) */
- stub->insns[3] = 0x537b0030; /* ldd 18(%dp),%dp */
--
-- stub->insns[0] |= reassemble_14(get_got(me, value, addend) & 0x3fff);
- break;
- case ELF_STUB_MILLI:
- stub->insns[0] = 0x20200000; /* ldil 0,%r1 */
-diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h
-index edc90f2..8406ed7 100644
---- a/arch/x86/include/asm/efi.h
-+++ b/arch/x86/include/asm/efi.h
-@@ -33,7 +33,7 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
- #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \
- efi_call_virt(f, a1, a2, a3, a4, a5, a6)
-
--#define efi_ioremap(addr, size) ioremap_cache(addr, size)
-+#define efi_ioremap(addr, size, type) ioremap_cache(addr, size)
-
- #else /* !CONFIG_X86_32 */
-
-@@ -84,7 +84,8 @@ extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3,
- efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \
- (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6))
-
--extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size);
-+extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,
-+ u32 type);
-
- #endif /* CONFIG_X86_32 */
-
-diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h
-index 2bdab21..c6ccbe7 100644
---- a/arch/x86/include/asm/irqflags.h
-+++ b/arch/x86/include/asm/irqflags.h
-@@ -12,9 +12,15 @@ static inline unsigned long native_save_fl(void)
- {
- unsigned long flags;
-
-+ /*
-+ * Note: this needs to be "=r" not "=rm", because we have the
-+ * stack offset from what gcc expects at the time the "pop" is
-+ * executed, and so a memory reference with respect to the stack
-+ * would end up using the wrong address.
-+ */
- asm volatile("# __raw_save_flags\n\t"
- "pushf ; pop %0"
-- : "=g" (flags)
-+ : "=r" (flags)
- : /* no input */
- : "memory");
-
-diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h
-index 341070f..77a6850 100644
---- a/arch/x86/include/asm/uv/uv_hub.h
-+++ b/arch/x86/include/asm/uv/uv_hub.h
-@@ -175,7 +175,7 @@ DECLARE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
- #define UV_GLOBAL_MMR32_PNODE_BITS(p) ((p) << (UV_GLOBAL_MMR32_PNODE_SHIFT))
-
- #define UV_GLOBAL_MMR64_PNODE_BITS(p) \
-- ((unsigned long)(UV_PNODE_TO_GNODE(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT)
-+ (((unsigned long)(p)) << UV_GLOBAL_MMR64_PNODE_SHIFT)
-
- #define UV_APIC_PNODE_SHIFT 6
-
-@@ -327,6 +327,7 @@ struct uv_blade_info {
- unsigned short nr_possible_cpus;
- unsigned short nr_online_cpus;
- unsigned short pnode;
-+ short memory_nid;
- };
- extern struct uv_blade_info *uv_blade_info;
- extern short *uv_node_to_blade;
-@@ -363,6 +364,12 @@ static inline int uv_blade_to_pnode(int bid)
- return uv_blade_info[bid].pnode;
- }
-
-+/* Nid of memory node on blade. -1 if no blade-local memory */
-+static inline int uv_blade_to_memory_nid(int bid)
-+{
-+ return uv_blade_info[bid].memory_nid;
-+}
-+
- /* Determine the number of possible cpus on a blade */
- static inline int uv_blade_nr_possible_cpus(int bid)
- {
-diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
-index 2284a48..d2ed6c5 100644
---- a/arch/x86/kernel/apic/io_apic.c
-+++ b/arch/x86/kernel/apic/io_apic.c
-@@ -3793,6 +3793,9 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
- mmr_pnode = uv_blade_to_pnode(mmr_blade);
- uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
-
-+ if (cfg->move_in_progress)
-+ send_cleanup_vector(cfg);
-+
- return irq;
- }
-
-diff --git a/arch/x86/kernel/apic/x2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c
-index 8e4cbb2..2ed4e2b 100644
---- a/arch/x86/kernel/apic/x2apic_cluster.c
-+++ b/arch/x86/kernel/apic/x2apic_cluster.c
-@@ -170,7 +170,7 @@ static unsigned long set_apic_id(unsigned int id)
-
- static int x2apic_cluster_phys_pkg_id(int initial_apicid, int index_msb)
- {
-- return current_cpu_data.initial_apicid >> index_msb;
-+ return initial_apicid >> index_msb;
- }
-
- static void x2apic_send_IPI_self(int vector)
-diff --git a/arch/x86/kernel/apic/x2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c
-index a284359..0b631c6 100644
---- a/arch/x86/kernel/apic/x2apic_phys.c
-+++ b/arch/x86/kernel/apic/x2apic_phys.c
-@@ -162,7 +162,7 @@ static unsigned long set_apic_id(unsigned int id)
-
- static int x2apic_phys_pkg_id(int initial_apicid, int index_msb)
- {
-- return current_cpu_data.initial_apicid >> index_msb;
-+ return initial_apicid >> index_msb;
- }
-
- static void x2apic_send_IPI_self(int vector)
-diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
-index 096d19a..832e908 100644
---- a/arch/x86/kernel/apic/x2apic_uv_x.c
-+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
-@@ -261,7 +261,7 @@ struct apic apic_x2apic_uv_x = {
- .apic_id_registered = uv_apic_id_registered,
-
- .irq_delivery_mode = dest_Fixed,
-- .irq_dest_mode = 1, /* logical */
-+ .irq_dest_mode = 0, /* physical */
-
- .target_cpus = uv_target_cpus,
- .disable_esr = 0,
-@@ -362,12 +362,6 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size)
- BUG();
- }
-
--static __init void map_low_mmrs(void)
--{
-- init_extra_mapping_uc(UV_GLOBAL_MMR32_BASE, UV_GLOBAL_MMR32_SIZE);
-- init_extra_mapping_uc(UV_LOCAL_MMR_BASE, UV_LOCAL_MMR_SIZE);
--}
--
- enum map_type {map_wb, map_uc};
-
- static __init void map_high(char *id, unsigned long base, int shift,
-@@ -395,26 +389,6 @@ static __init void map_gru_high(int max_pnode)
- map_high("GRU", gru.s.base, shift, max_pnode, map_wb);
- }
-
--static __init void map_config_high(int max_pnode)
--{
-- union uvh_rh_gam_cfg_overlay_config_mmr_u cfg;
-- int shift = UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR_BASE_SHFT;
--
-- cfg.v = uv_read_local_mmr(UVH_RH_GAM_CFG_OVERLAY_CONFIG_MMR);
-- if (cfg.s.enable)
-- map_high("CONFIG", cfg.s.base, shift, max_pnode, map_uc);
--}
--
--static __init void map_mmr_high(int max_pnode)
--{
-- union uvh_rh_gam_mmr_overlay_config_mmr_u mmr;
-- int shift = UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR_BASE_SHFT;
--
-- mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR);
-- if (mmr.s.enable)
-- map_high("MMR", mmr.s.base, shift, max_pnode, map_uc);
--}
--
- static __init void map_mmioh_high(int max_pnode)
- {
- union uvh_rh_gam_mmioh_overlay_config_mmr_u mmioh;
-@@ -566,8 +540,6 @@ void __init uv_system_init(void)
- unsigned long mmr_base, present, paddr;
- unsigned short pnode_mask;
-
-- map_low_mmrs();
--
- m_n_config.v = uv_read_local_mmr(UVH_SI_ADDR_MAP_CONFIG);
- m_val = m_n_config.s.m_skt;
- n_val = m_n_config.s.n_skt;
-@@ -591,6 +563,8 @@ void __init uv_system_init(void)
- bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades();
- uv_blade_info = kmalloc(bytes, GFP_KERNEL);
- BUG_ON(!uv_blade_info);
-+ for (blade = 0; blade < uv_num_possible_blades(); blade++)
-+ uv_blade_info[blade].memory_nid = -1;
-
- get_lowmem_redirect(&lowmem_redir_base, &lowmem_redir_size);
-
-@@ -629,6 +603,9 @@ void __init uv_system_init(void)
- lcpu = uv_blade_info[blade].nr_possible_cpus;
- uv_blade_info[blade].nr_possible_cpus++;
-
-+ /* Any node on the blade, else will contain -1. */
-+ uv_blade_info[blade].memory_nid = nid;
-+
- uv_cpu_hub_info(cpu)->lowmem_remap_base = lowmem_redir_base;
- uv_cpu_hub_info(cpu)->lowmem_remap_top = lowmem_redir_size;
- uv_cpu_hub_info(cpu)->m_val = m_val;
-@@ -662,11 +639,10 @@ void __init uv_system_init(void)
- pnode = (paddr >> m_val) & pnode_mask;
- blade = boot_pnode_to_blade(pnode);
- uv_node_to_blade[nid] = blade;
-+ max_pnode = max(pnode, max_pnode);
- }
-
- map_gru_high(max_pnode);
-- map_mmr_high(max_pnode);
-- map_config_high(max_pnode);
- map_mmioh_high(max_pnode);
-
- uv_cpu_init();
-diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
-index 79302e9..442b550 100644
---- a/arch/x86/kernel/apm_32.c
-+++ b/arch/x86/kernel/apm_32.c
-@@ -811,7 +811,7 @@ static int apm_do_idle(void)
- u8 ret = 0;
- int idled = 0;
- int polling;
-- int err;
-+ int err = 0;
-
- polling = !!(current_thread_info()->status & TS_POLLING);
- if (polling) {
-diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c
-index 96f7ac0..19ccf6d 100644
---- a/arch/x86/kernel/efi.c
-+++ b/arch/x86/kernel/efi.c
-@@ -512,7 +512,7 @@ void __init efi_enter_virtual_mode(void)
- && end_pfn <= max_pfn_mapped))
- va = __va(md->phys_addr);
- else
-- va = efi_ioremap(md->phys_addr, size);
-+ va = efi_ioremap(md->phys_addr, size, md->type);
-
- md->virt_addr = (u64) (unsigned long) va;
-
-diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c
-index 22c3b78..ac0621a 100644
---- a/arch/x86/kernel/efi_64.c
-+++ b/arch/x86/kernel/efi_64.c
-@@ -98,10 +98,14 @@ void __init efi_call_phys_epilog(void)
- early_runtime_code_mapping_set_exec(0);
- }
-
--void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)
-+void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
-+ u32 type)
- {
- unsigned long last_map_pfn;
-
-+ if (type == EFI_MEMORY_MAPPED_IO)
-+ return ioremap(phys_addr, size);
-+
- last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size);
- if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)
- return NULL;
-diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
-index 8663afb..0d98a01 100644
---- a/arch/x86/kernel/head_32.S
-+++ b/arch/x86/kernel/head_32.S
-@@ -602,7 +602,11 @@ ignore_int:
- #endif
- iret
-
--.section .cpuinit.data,"wa"
-+#ifndef CONFIG_HOTPLUG_CPU
-+ __CPUINITDATA
-+#else
-+ __REFDATA
-+#endif
- .align 4
- ENTRY(initial_code)
- .long i386_start_kernel
-diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
-index 508e982..834c9da 100644
---- a/arch/x86/kernel/reboot.c
-+++ b/arch/x86/kernel/reboot.c
-@@ -3,6 +3,7 @@
- #include <linux/init.h>
- #include <linux/pm.h>
- #include <linux/efi.h>
-+#include <linux/dmi.h>
- #include <acpi/reboot.h>
- #include <asm/io.h>
- #include <asm/apic.h>
-@@ -17,7 +18,6 @@
- #include <asm/cpu.h>
-
- #ifdef CONFIG_X86_32
--# include <linux/dmi.h>
- # include <linux/ctype.h>
- # include <linux/mc146818rtc.h>
- #else
-@@ -404,6 +404,38 @@ EXPORT_SYMBOL(machine_real_restart);
-
- #endif /* CONFIG_X86_32 */
-
-+/*
-+ * Apple MacBook5,2 (2009 MacBook) needs reboot=p
-+ */
-+static int __init set_pci_reboot(const struct dmi_system_id *d)
-+{
-+ if (reboot_type != BOOT_CF9) {
-+ reboot_type = BOOT_CF9;
-+ printk(KERN_INFO "%s series board detected. "
-+ "Selecting PCI-method for reboots.\n", d->ident);
-+ }
-+ return 0;
-+}
-+
-+static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
-+ { /* Handle problems with rebooting on Apple MacBook5,2 */
-+ .callback = set_pci_reboot,
-+ .ident = "Apple MacBook",
-+ .matches = {
-+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
-+ },
-+ },
-+ { }
-+};
-+
-+static int __init pci_reboot_init(void)
-+{
-+ dmi_check_system(pci_reboot_dmi_table);
-+ return 0;
-+}
-+core_initcall(pci_reboot_init);
-+
- static inline void kb_wait(void)
- {
- int i;
-diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
-index 59f31d2..78d185d 100644
---- a/arch/x86/kernel/vmlinux.lds.S
-+++ b/arch/x86/kernel/vmlinux.lds.S
-@@ -393,8 +393,8 @@ SECTIONS
-
-
- #ifdef CONFIG_X86_32
--ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),
-- "kernel image bigger than KERNEL_IMAGE_SIZE")
-+. = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),
-+ "kernel image bigger than KERNEL_IMAGE_SIZE");
- #else
- /*
- * Per-cpu symbols which need to be offset from __per_cpu_load
-@@ -407,12 +407,12 @@ INIT_PER_CPU(irq_stack_union);
- /*
- * Build-time check on the image size:
- */
--ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),
-- "kernel image bigger than KERNEL_IMAGE_SIZE")
-+. = ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),
-+ "kernel image bigger than KERNEL_IMAGE_SIZE");
-
- #ifdef CONFIG_SMP
--ASSERT((per_cpu__irq_stack_union == 0),
-- "irq_stack_union is not at start of per-cpu area");
-+. = ASSERT((per_cpu__irq_stack_union == 0),
-+ "irq_stack_union is not at start of per-cpu area");
- #endif
-
- #endif /* CONFIG_X86_32 */
-@@ -420,7 +420,7 @@ ASSERT((per_cpu__irq_stack_union == 0),
- #ifdef CONFIG_KEXEC
- #include <asm/kexec.h>
-
--ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,
-- "kexec control code size is too big")
-+. = ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,
-+ "kexec control code size is too big");
- #endif
-
-diff --git a/arch/x86/lib/msr.c b/arch/x86/lib/msr.c
-index 1440b9c..caa24ac 100644
---- a/arch/x86/lib/msr.c
-+++ b/arch/x86/lib/msr.c
-@@ -89,16 +89,13 @@ void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
- rv.msrs = msrs;
- rv.msr_no = msr_no;
-
-- preempt_disable();
-- /*
-- * FIXME: handle the CPU we're executing on separately for now until
-- * smp_call_function_many has been fixed to not skip it.
-- */
-- this_cpu = raw_smp_processor_id();
-- smp_call_function_single(this_cpu, __rdmsr_on_cpu, &rv, 1);
-+ this_cpu = get_cpu();
-+
-+ if (cpumask_test_cpu(this_cpu, mask))
-+ __rdmsr_on_cpu(&rv);
-
- smp_call_function_many(mask, __rdmsr_on_cpu, &rv, 1);
-- preempt_enable();
-+ put_cpu();
- }
- EXPORT_SYMBOL(rdmsr_on_cpus);
-
-@@ -121,16 +118,13 @@ void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
- rv.msrs = msrs;
- rv.msr_no = msr_no;
-
-- preempt_disable();
-- /*
-- * FIXME: handle the CPU we're executing on separately for now until
-- * smp_call_function_many has been fixed to not skip it.
-- */
-- this_cpu = raw_smp_processor_id();
-- smp_call_function_single(this_cpu, __wrmsr_on_cpu, &rv, 1);
-+ this_cpu = get_cpu();
-+
-+ if (cpumask_test_cpu(this_cpu, mask))
-+ __wrmsr_on_cpu(&rv);
-
- smp_call_function_many(mask, __wrmsr_on_cpu, &rv, 1);
-- preempt_enable();
-+ put_cpu();
- }
- EXPORT_SYMBOL(wrmsr_on_cpus);
-
-diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
-index 1b734d7..7e600c1 100644
---- a/arch/x86/mm/pageattr.c
-+++ b/arch/x86/mm/pageattr.c
-@@ -591,9 +591,12 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
- unsigned int level;
- pte_t *kpte, old_pte;
-
-- if (cpa->flags & CPA_PAGES_ARRAY)
-- address = (unsigned long)page_address(cpa->pages[cpa->curpage]);
-- else if (cpa->flags & CPA_ARRAY)
-+ if (cpa->flags & CPA_PAGES_ARRAY) {
-+ struct page *page = cpa->pages[cpa->curpage];
-+ if (unlikely(PageHighMem(page)))
-+ return 0;
-+ address = (unsigned long)page_address(page);
-+ } else if (cpa->flags & CPA_ARRAY)
- address = cpa->vaddr[cpa->curpage];
- else
- address = *cpa->vaddr;
-@@ -697,9 +700,12 @@ static int cpa_process_alias(struct cpa_data *cpa)
- * No need to redo, when the primary call touched the direct
- * mapping already:
- */
-- if (cpa->flags & CPA_PAGES_ARRAY)
-- vaddr = (unsigned long)page_address(cpa->pages[cpa->curpage]);
-- else if (cpa->flags & CPA_ARRAY)
-+ if (cpa->flags & CPA_PAGES_ARRAY) {
-+ struct page *page = cpa->pages[cpa->curpage];
-+ if (unlikely(PageHighMem(page)))
-+ return 0;
-+ vaddr = (unsigned long)page_address(page);
-+ } else if (cpa->flags & CPA_ARRAY)
- vaddr = cpa->vaddr[cpa->curpage];
- else
- vaddr = *cpa->vaddr;
-@@ -997,12 +1003,15 @@ EXPORT_SYMBOL(set_memory_array_uc);
- int _set_memory_wc(unsigned long addr, int numpages)
- {
- int ret;
-+ unsigned long addr_copy = addr;
-+
- ret = change_page_attr_set(&addr, numpages,
- __pgprot(_PAGE_CACHE_UC_MINUS), 0);
--
- if (!ret) {
-- ret = change_page_attr_set(&addr, numpages,
-- __pgprot(_PAGE_CACHE_WC), 0);
-+ ret = change_page_attr_set_clr(&addr_copy, numpages,
-+ __pgprot(_PAGE_CACHE_WC),
-+ __pgprot(_PAGE_CACHE_MASK),
-+ 0, 0, NULL);
- }
- return ret;
- }
-@@ -1119,7 +1128,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
- int free_idx;
-
- for (i = 0; i < addrinarray; i++) {
-- start = (unsigned long)page_address(pages[i]);
-+ if (PageHighMem(pages[i]))
-+ continue;
-+ start = page_to_pfn(pages[i]) << PAGE_SHIFT;
- end = start + PAGE_SIZE;
- if (reserve_memtype(start, end, _PAGE_CACHE_UC_MINUS, NULL))
- goto err_out;
-@@ -1132,7 +1143,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
- err_out:
- free_idx = i;
- for (i = 0; i < free_idx; i++) {
-- start = (unsigned long)page_address(pages[i]);
-+ if (PageHighMem(pages[i]))
-+ continue;
-+ start = page_to_pfn(pages[i]) << PAGE_SHIFT;
- end = start + PAGE_SIZE;
- free_memtype(start, end);
- }
-@@ -1161,7 +1174,9 @@ int set_pages_array_wb(struct page **pages, int addrinarray)
- return retval;
-
- for (i = 0; i < addrinarray; i++) {
-- start = (unsigned long)page_address(pages[i]);
-+ if (PageHighMem(pages[i]))
-+ continue;
-+ start = page_to_pfn(pages[i]) << PAGE_SHIFT;
- end = start + PAGE_SIZE;
- free_memtype(start, end);
- }
-diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
-index af8f965..ed34f5e 100644
---- a/arch/x86/mm/pgtable.c
-+++ b/arch/x86/mm/pgtable.c
-@@ -329,7 +329,6 @@ void __init reserve_top_address(unsigned long reserve)
- printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
- (int)-reserve);
- __FIXADDR_TOP = -reserve - PAGE_SIZE;
-- __VMALLOC_RESERVE += reserve;
- #endif
- }
-
-diff --git a/block/Kconfig b/block/Kconfig
-index 95a86ad..9be0b56 100644
---- a/block/Kconfig
-+++ b/block/Kconfig
-@@ -48,9 +48,9 @@ config LBDAF
- If unsure, say Y.
-
- config BLK_DEV_BSG
-- bool "Block layer SG support v4 (EXPERIMENTAL)"
-- depends on EXPERIMENTAL
-- ---help---
-+ bool "Block layer SG support v4"
-+ default y
-+ help
- Saying Y here will enable generic SG (SCSI generic) v4 support
- for any block device.
-
-@@ -60,7 +60,10 @@ config BLK_DEV_BSG
- protocols (e.g. Task Management Functions and SMP in Serial
- Attached SCSI).
-
-- If unsure, say N.
-+ This option is required by recent UDEV versions to properly
-+ access device serial numbers, etc.
-+
-+ If unsure, say Y.
-
- config BLK_DEV_INTEGRITY
- bool "Block layer data integrity support"
-diff --git a/block/blk-settings.c b/block/blk-settings.c
-index 8a3ea3b..476d870 100644
---- a/block/blk-settings.c
-+++ b/block/blk-settings.c
-@@ -7,6 +7,7 @@
- #include <linux/bio.h>
- #include <linux/blkdev.h>
- #include <linux/bootmem.h> /* for max_pfn/max_low_pfn */
-+#include <linux/gcd.h>
-
- #include "blk.h"
-
-@@ -384,8 +385,8 @@ void blk_queue_alignment_offset(struct request_queue *q, unsigned int offset)
- EXPORT_SYMBOL(blk_queue_alignment_offset);
-
- /**
-- * blk_queue_io_min - set minimum request size for the queue
-- * @q: the request queue for the device
-+ * blk_limits_io_min - set minimum request size for a device
-+ * @limits: the queue limits
- * @min: smallest I/O size in bytes
- *
- * Description:
-@@ -394,15 +395,35 @@ EXPORT_SYMBOL(blk_queue_alignment_offset);
- * smallest I/O the device can perform without incurring a performance
- * penalty.
- */
--void blk_queue_io_min(struct request_queue *q, unsigned int min)
-+void blk_limits_io_min(struct queue_limits *limits, unsigned int min)
- {
-- q->limits.io_min = min;
-+ limits->io_min = min;
-
-- if (q->limits.io_min < q->limits.logical_block_size)
-- q->limits.io_min = q->limits.logical_block_size;
-+ if (limits->io_min < limits->logical_block_size)
-+ limits->io_min = limits->logical_block_size;
-
-- if (q->limits.io_min < q->limits.physical_block_size)
-- q->limits.io_min = q->limits.physical_block_size;
-+ if (limits->io_min < limits->physical_block_size)
-+ limits->io_min = limits->physical_block_size;
-+}
-+EXPORT_SYMBOL(blk_limits_io_min);
-+
-+/**
-+ * blk_queue_io_min - set minimum request size for the queue
-+ * @q: the request queue for the device
-+ * @min: smallest I/O size in bytes
-+ *
-+ * Description:
-+ * Storage devices may report a granularity or preferred minimum I/O
-+ * size which is the smallest request the device can perform without
-+ * incurring a performance penalty. For disk drives this is often the
-+ * physical block size. For RAID arrays it is often the stripe chunk
-+ * size. A properly aligned multiple of minimum_io_size is the
-+ * preferred request size for workloads where a high number of I/O
-+ * operations is desired.
-+ */
-+void blk_queue_io_min(struct request_queue *q, unsigned int min)
-+{
-+ blk_limits_io_min(&q->limits, min);
- }
- EXPORT_SYMBOL(blk_queue_io_min);
-
-@@ -412,8 +433,12 @@ EXPORT_SYMBOL(blk_queue_io_min);
- * @opt: optimal request size in bytes
- *
- * Description:
-- * Drivers can call this function to set the preferred I/O request
-- * size for devices that report such a value.
-+ * Storage devices may report an optimal I/O size, which is the
-+ * device's preferred unit for sustained I/O. This is rarely reported
-+ * for disk drives. For RAID arrays it is usually the stripe width or
-+ * the internal track size. A properly aligned multiple of
-+ * optimal_io_size is the preferred request size for workloads where
-+ * sustained throughput is desired.
- */
- void blk_queue_io_opt(struct request_queue *q, unsigned int opt)
- {
-@@ -433,27 +458,7 @@ EXPORT_SYMBOL(blk_queue_io_opt);
- **/
- void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b)
- {
-- /* zero is "infinity" */
-- t->limits.max_sectors = min_not_zero(queue_max_sectors(t),
-- queue_max_sectors(b));
--
-- t->limits.max_hw_sectors = min_not_zero(queue_max_hw_sectors(t),
-- queue_max_hw_sectors(b));
--
-- t->limits.seg_boundary_mask = min_not_zero(queue_segment_boundary(t),
-- queue_segment_boundary(b));
--
-- t->limits.max_phys_segments = min_not_zero(queue_max_phys_segments(t),
-- queue_max_phys_segments(b));
--
-- t->limits.max_hw_segments = min_not_zero(queue_max_hw_segments(t),
-- queue_max_hw_segments(b));
--
-- t->limits.max_segment_size = min_not_zero(queue_max_segment_size(t),
-- queue_max_segment_size(b));
--
-- t->limits.logical_block_size = max(queue_logical_block_size(t),
-- queue_logical_block_size(b));
-+ blk_stack_limits(&t->limits, &b->limits, 0);
-
- if (!t->queue_lock)
- WARN_ON_ONCE(1);
-@@ -523,6 +528,16 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
- return -1;
- }
-
-+ /* Find lcm() of optimal I/O size */
-+ if (t->io_opt && b->io_opt)
-+ t->io_opt = (t->io_opt * b->io_opt) / gcd(t->io_opt, b->io_opt);
-+ else if (b->io_opt)
-+ t->io_opt = b->io_opt;
-+
-+ /* Verify that optimal I/O size is a multiple of io_min */
-+ if (t->io_min && t->io_opt % t->io_min)
-+ return -1;
-+
- return 0;
- }
- EXPORT_SYMBOL(blk_stack_limits);
-diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
-index 7a0f4aa..9a62224 100644
---- a/drivers/acpi/acpi_memhotplug.c
-+++ b/drivers/acpi/acpi_memhotplug.c
-@@ -38,6 +38,9 @@
-
- #define _COMPONENT ACPI_MEMORY_DEVICE_COMPONENT
-
-+#undef PREFIX
-+#define PREFIX "ACPI:memory_hp:"
-+
- ACPI_MODULE_NAME("acpi_memhotplug");
- MODULE_AUTHOR("Naveen B S <naveen.b.s@intel.com>");
- MODULE_DESCRIPTION("Hotplug Mem Driver");
-@@ -153,6 +156,7 @@ acpi_memory_get_device(acpi_handle handle,
- acpi_handle phandle;
- struct acpi_device *device = NULL;
- struct acpi_device *pdevice = NULL;
-+ int result;
-
-
- if (!acpi_bus_get_device(handle, &device) && device)
-@@ -165,9 +169,9 @@ acpi_memory_get_device(acpi_handle handle,
- }
-
- /* Get the parent device */
-- status = acpi_bus_get_device(phandle, &pdevice);
-- if (ACPI_FAILURE(status)) {
-- ACPI_EXCEPTION((AE_INFO, status, "Cannot get acpi bus device"));
-+ result = acpi_bus_get_device(phandle, &pdevice);
-+ if (result) {
-+ printk(KERN_WARNING PREFIX "Cannot get acpi bus device");
- return -EINVAL;
- }
-
-@@ -175,9 +179,9 @@ acpi_memory_get_device(acpi_handle handle,
- * Now add the notified device. This creates the acpi_device
- * and invokes .add function
- */
-- status = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
-- if (ACPI_FAILURE(status)) {
-- ACPI_EXCEPTION((AE_INFO, status, "Cannot add acpi bus"));
-+ result = acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE);
-+ if (result) {
-+ printk(KERN_WARNING PREFIX "Cannot add acpi bus");
- return -EINVAL;
- }
-
-@@ -238,7 +242,12 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
- num_enabled++;
- continue;
- }
--
-+ /*
-+ * If the memory block size is zero, please ignore it.
-+ * Don't try to do the following memory hotplug flowchart.
-+ */
-+ if (!info->length)
-+ continue;
- if (node < 0)
- node = memory_add_physaddr_to_nid(info->start_addr);
-
-@@ -253,8 +262,15 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
- mem_device->state = MEMORY_INVALID_STATE;
- return -EINVAL;
- }
--
-- return result;
-+ /*
-+ * Sometimes the memory device will contain several memory blocks.
-+ * When one memory block is hot-added to the system memory, it will
-+ * be regarded as a success.
-+ * Otherwise if the last memory block can't be hot-added to the system
-+ * memory, it will be failure and the memory device can't be bound with
-+ * driver.
-+ */
-+ return 0;
- }
-
- static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
-diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h
-index 544dcf8..eb6f038 100644
---- a/drivers/acpi/acpica/acobject.h
-+++ b/drivers/acpi/acpica/acobject.h
-@@ -97,6 +97,7 @@
- #define AOPOBJ_OBJECT_INITIALIZED 0x08
- #define AOPOBJ_SETUP_COMPLETE 0x10
- #define AOPOBJ_SINGLE_DATUM 0x20
-+#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an op_region address */
-
- /******************************************************************************
- *
-diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c
-index 584d766..b79978f 100644
---- a/drivers/acpi/acpica/dsopcode.c
-+++ b/drivers/acpi/acpica/dsopcode.c
-@@ -397,6 +397,30 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
- status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node),
- extra_desc->extra.aml_length,
- extra_desc->extra.aml_start);
-+ if (ACPI_FAILURE(status)) {
-+ return_ACPI_STATUS(status);
-+ }
-+
-+ /* Validate the region address/length via the host OS */
-+
-+ status = acpi_os_validate_address(obj_desc->region.space_id,
-+ obj_desc->region.address,
-+ (acpi_size) obj_desc->region.length,
-+ acpi_ut_get_node_name(node));
-+
-+ if (ACPI_FAILURE(status)) {
-+ /*
-+ * Invalid address/length. We will emit an error message and mark
-+ * the region as invalid, so that it will cause an additional error if
-+ * it is ever used. Then return AE_OK.
-+ */
-+ ACPI_EXCEPTION((AE_INFO, status,
-+ "During address validation of OpRegion [%4.4s]",
-+ node->name.ascii));
-+ obj_desc->common.flags |= AOPOBJ_INVALID;
-+ status = AE_OK;
-+ }
-+
- return_ACPI_STATUS(status);
- }
-
-diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c
-index d4075b8..6687be1 100644
---- a/drivers/acpi/acpica/exfldio.c
-+++ b/drivers/acpi/acpica/exfldio.c
-@@ -113,6 +113,12 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
- }
- }
-
-+ /* Exit if Address/Length have been disallowed by the host OS */
-+
-+ if (rgn_desc->common.flags & AOPOBJ_INVALID) {
-+ return_ACPI_STATUS(AE_AML_ILLEGAL_ADDRESS);
-+ }
-+
- /*
- * Exit now for SMBus address space, it has a non-linear address space
- * and the request cannot be directly validated
-diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
-index 7167071..5691f16 100644
---- a/drivers/acpi/osl.c
-+++ b/drivers/acpi/osl.c
-@@ -189,11 +189,36 @@ acpi_status __init acpi_os_initialize(void)
- return AE_OK;
- }
-
-+static void bind_to_cpu0(struct work_struct *work)
-+{
-+ set_cpus_allowed(current, cpumask_of_cpu(0));
-+ kfree(work);
-+}
-+
-+static void bind_workqueue(struct workqueue_struct *wq)
-+{
-+ struct work_struct *work;
-+
-+ work = kzalloc(sizeof(struct work_struct), GFP_KERNEL);
-+ INIT_WORK(work, bind_to_cpu0);
-+ queue_work(wq, work);
-+}
-+
- acpi_status acpi_os_initialize1(void)
- {
-+ /*
-+ * On some machines, a software-initiated SMI causes corruption unless
-+ * the SMI runs on CPU 0. An SMI can be initiated by any AML, but
-+ * typically it's done in GPE-related methods that are run via
-+ * workqueues, so we can avoid the known corruption cases by binding
-+ * the workqueues to CPU 0.
-+ */
- kacpid_wq = create_singlethread_workqueue("kacpid");
-+ bind_workqueue(kacpid_wq);
- kacpi_notify_wq = create_singlethread_workqueue("kacpi_notify");
-+ bind_workqueue(kacpi_notify_wq);
- kacpi_hotplug_wq = create_singlethread_workqueue("kacpi_hotplug");
-+ bind_workqueue(kacpi_hotplug_wq);
- BUG_ON(!kacpid_wq);
- BUG_ON(!kacpi_notify_wq);
- BUG_ON(!kacpi_hotplug_wq);
-diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
-index 0944dae..9c61ab2 100644
---- a/drivers/acpi/system.c
-+++ b/drivers/acpi/system.c
-@@ -121,7 +121,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
- table_attr->attr.size = 0;
- table_attr->attr.read = acpi_table_show;
- table_attr->attr.attr.name = table_attr->name;
-- table_attr->attr.attr.mode = 0444;
-+ table_attr->attr.attr.mode = 0400;
-
- return;
- }
-diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
-index f4bb43f..e077701 100644
---- a/drivers/char/agp/parisc-agp.c
-+++ b/drivers/char/agp/parisc-agp.c
-@@ -225,7 +225,7 @@ static const struct agp_bridge_driver parisc_agp_driver = {
- .configure = parisc_agp_configure,
- .fetch_size = parisc_agp_fetch_size,
- .tlb_flush = parisc_agp_tlbflush,
-- .mask_memory = parisc_agp_mask_memory,
-+ .mask_memory = parisc_agp_page_mask_memory,
- .masks = parisc_agp_masks,
- .agp_enable = parisc_agp_enable,
- .cache_flush = global_cache_flush,
-diff --git a/drivers/char/tty_ldisc.c b/drivers/char/tty_ldisc.c
-index acd76b7..1733d34 100644
---- a/drivers/char/tty_ldisc.c
-+++ b/drivers/char/tty_ldisc.c
-@@ -48,6 +48,41 @@ static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
- /* Line disc dispatch table */
- static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
-
-+static inline struct tty_ldisc *get_ldisc(struct tty_ldisc *ld)
-+{
-+ if (ld)
-+ atomic_inc(&ld->users);
-+ return ld;
-+}
-+
-+static void put_ldisc(struct tty_ldisc *ld)
-+{
-+ unsigned long flags;
-+
-+ if (WARN_ON_ONCE(!ld))
-+ return;
-+
-+ /*
-+ * If this is the last user, free the ldisc, and
-+ * release the ldisc ops.
-+ *
-+ * We really want an "atomic_dec_and_lock_irqsave()",
-+ * but we don't have it, so this does it by hand.
-+ */
-+ local_irq_save(flags);
-+ if (atomic_dec_and_lock(&ld->users, &tty_ldisc_lock)) {
-+ struct tty_ldisc_ops *ldo = ld->ops;
-+
-+ ldo->refcount--;
-+ module_put(ldo->owner);
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+
-+ kfree(ld);
-+ return;
-+ }
-+ local_irq_restore(flags);
-+}
-+
- /**
- * tty_register_ldisc - install a line discipline
- * @disc: ldisc number
-@@ -142,7 +177,7 @@ static struct tty_ldisc *tty_ldisc_try_get(int disc)
- /* lock it */
- ldops->refcount++;
- ld->ops = ldops;
-- ld->refcount = 0;
-+ atomic_set(&ld->users, 1);
- err = 0;
- }
- }
-@@ -181,35 +216,6 @@ static struct tty_ldisc *tty_ldisc_get(int disc)
- return ld;
- }
-
--/**
-- * tty_ldisc_put - drop ldisc reference
-- * @ld: ldisc
-- *
-- * Drop a reference to a line discipline. Manage refcounts and
-- * module usage counts. Free the ldisc once the recount hits zero.
-- *
-- * Locking:
-- * takes tty_ldisc_lock to guard against ldisc races
-- */
--
--static void tty_ldisc_put(struct tty_ldisc *ld)
--{
-- unsigned long flags;
-- int disc = ld->ops->num;
-- struct tty_ldisc_ops *ldo;
--
-- BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
--
-- spin_lock_irqsave(&tty_ldisc_lock, flags);
-- ldo = tty_ldiscs[disc];
-- BUG_ON(ldo->refcount == 0);
-- ldo->refcount--;
-- module_put(ldo->owner);
-- spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-- WARN_ON(ld->refcount);
-- kfree(ld);
--}
--
- static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
- {
- return (*pos < NR_LDISCS) ? pos : NULL;
-@@ -234,7 +240,7 @@ static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
- if (IS_ERR(ld))
- return 0;
- seq_printf(m, "%-10s %2d\n", ld->ops->name ? ld->ops->name : "???", i);
-- tty_ldisc_put(ld);
-+ put_ldisc(ld);
- return 0;
- }
-
-@@ -288,20 +294,17 @@ static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
- * Locking: takes tty_ldisc_lock
- */
-
--static int tty_ldisc_try(struct tty_struct *tty)
-+static struct tty_ldisc *tty_ldisc_try(struct tty_struct *tty)
- {
- unsigned long flags;
- struct tty_ldisc *ld;
-- int ret = 0;
-
- spin_lock_irqsave(&tty_ldisc_lock, flags);
-- ld = tty->ldisc;
-- if (test_bit(TTY_LDISC, &tty->flags)) {
-- ld->refcount++;
-- ret = 1;
-- }
-+ ld = NULL;
-+ if (test_bit(TTY_LDISC, &tty->flags))
-+ ld = get_ldisc(tty->ldisc);
- spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-- return ret;
-+ return ld;
- }
-
- /**
-@@ -322,10 +325,11 @@ static int tty_ldisc_try(struct tty_struct *tty)
-
- struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
- {
-+ struct tty_ldisc *ld;
-+
- /* wait_event is a macro */
-- wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
-- WARN_ON(tty->ldisc->refcount == 0);
-- return tty->ldisc;
-+ wait_event(tty_ldisc_wait, (ld = tty_ldisc_try(tty)) != NULL);
-+ return ld;
- }
- EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
-
-@@ -342,9 +346,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
-
- struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
- {
-- if (tty_ldisc_try(tty))
-- return tty->ldisc;
-- return NULL;
-+ return tty_ldisc_try(tty);
- }
- EXPORT_SYMBOL_GPL(tty_ldisc_ref);
-
-@@ -360,21 +362,15 @@ EXPORT_SYMBOL_GPL(tty_ldisc_ref);
-
- void tty_ldisc_deref(struct tty_ldisc *ld)
- {
-- unsigned long flags;
--
-- BUG_ON(ld == NULL);
--
-- spin_lock_irqsave(&tty_ldisc_lock, flags);
-- if (ld->refcount == 0)
-- printk(KERN_ERR "tty_ldisc_deref: no references.\n");
-- else
-- ld->refcount--;
-- if (ld->refcount == 0)
-- wake_up(&tty_ldisc_wait);
-- spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+ put_ldisc(ld);
- }
- EXPORT_SYMBOL_GPL(tty_ldisc_deref);
-
-+static inline void tty_ldisc_put(struct tty_ldisc *ld)
-+{
-+ put_ldisc(ld);
-+}
-+
- /**
- * tty_ldisc_enable - allow ldisc use
- * @tty: terminal to activate ldisc on
-@@ -523,31 +519,6 @@ static int tty_ldisc_halt(struct tty_struct *tty)
- }
-
- /**
-- * tty_ldisc_wait_idle - wait for the ldisc to become idle
-- * @tty: tty to wait for
-- *
-- * Wait for the line discipline to become idle. The discipline must
-- * have been halted for this to guarantee it remains idle.
-- *
-- * tty_ldisc_lock protects the ref counts currently.
-- */
--
--static int tty_ldisc_wait_idle(struct tty_struct *tty)
--{
-- unsigned long flags;
-- spin_lock_irqsave(&tty_ldisc_lock, flags);
-- while (tty->ldisc->refcount) {
-- spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-- if (wait_event_timeout(tty_ldisc_wait,
-- tty->ldisc->refcount == 0, 5 * HZ) == 0)
-- return -EBUSY;
-- spin_lock_irqsave(&tty_ldisc_lock, flags);
-- }
-- spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-- return 0;
--}
--
--/**
- * tty_set_ldisc - set line discipline
- * @tty: the terminal to set
- * @ldisc: the line discipline
-@@ -642,14 +613,6 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
-
- flush_scheduled_work();
-
-- /* Let any existing reference holders finish */
-- retval = tty_ldisc_wait_idle(tty);
-- if (retval < 0) {
-- clear_bit(TTY_LDISC_CHANGING, &tty->flags);
-- tty_ldisc_put(new_ldisc);
-- return retval;
-- }
--
- mutex_lock(&tty->ldisc_mutex);
- if (test_bit(TTY_HUPPED, &tty->flags)) {
- /* We were raced by the hangup method. It will have stomped
-@@ -795,7 +758,6 @@ void tty_ldisc_hangup(struct tty_struct *tty)
- if (tty->ldisc) { /* Not yet closed */
- /* Switch back to N_TTY */
- tty_ldisc_halt(tty);
-- tty_ldisc_wait_idle(tty);
- tty_ldisc_reinit(tty);
- /* At this point we have a closed ldisc and we want to
- reopen it. We could defer this to the next open but
-@@ -860,14 +822,6 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
- tty_ldisc_halt(tty);
- flush_scheduled_work();
-
-- /*
-- * Wait for any short term users (we know they are just driver
-- * side waiters as the file is closing so user count on the file
-- * side is zero.
-- */
--
-- tty_ldisc_wait_idle(tty);
--
- mutex_lock(&tty->ldisc_mutex);
- /*
- * Now kill off the ldisc
-diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
-index b90eda8..fd69086 100644
---- a/drivers/cpufreq/cpufreq.c
-+++ b/drivers/cpufreq/cpufreq.c
-@@ -858,6 +858,8 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
-
- /* Check for existing affected CPUs.
- * They may not be aware of it due to CPU Hotplug.
-+ * cpufreq_cpu_put is called when the device is removed
-+ * in __cpufreq_remove_dev()
- */
- managed_policy = cpufreq_cpu_get(j);
- if (unlikely(managed_policy)) {
-@@ -884,7 +886,7 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
- ret = sysfs_create_link(&sys_dev->kobj,
- &managed_policy->kobj,
- "cpufreq");
-- if (!ret)
-+ if (ret)
- cpufreq_cpu_put(managed_policy);
- /*
- * Success. We only needed to be added to the mask.
-@@ -924,6 +926,8 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
-
- spin_lock_irqsave(&cpufreq_driver_lock, flags);
- for_each_cpu(j, policy->cpus) {
-+ if (!cpu_online(j))
-+ continue;
- per_cpu(cpufreq_cpu_data, j) = policy;
- per_cpu(policy_cpu, j) = policy->cpu;
- }
-@@ -1244,13 +1248,22 @@ EXPORT_SYMBOL(cpufreq_get);
-
- static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
- {
-- int cpu = sysdev->id;
- int ret = 0;
-+
-+#ifdef __powerpc__
-+ int cpu = sysdev->id;
- unsigned int cur_freq = 0;
- struct cpufreq_policy *cpu_policy;
-
- dprintk("suspending cpu %u\n", cpu);
-
-+ /*
-+ * This whole bogosity is here because Powerbooks are made of fail.
-+ * No sane platform should need any of the code below to be run.
-+ * (it's entirely the wrong thing to do, as driver->get may
-+ * reenable interrupts on some architectures).
-+ */
-+
- if (!cpu_online(cpu))
- return 0;
-
-@@ -1309,6 +1322,7 @@ static int cpufreq_suspend(struct sys_device *sysdev, pm_message_t pmsg)
-
- out:
- cpufreq_cpu_put(cpu_policy);
-+#endif /* __powerpc__ */
- return ret;
- }
-
-@@ -1322,12 +1336,18 @@ out:
- */
- static int cpufreq_resume(struct sys_device *sysdev)
- {
-- int cpu = sysdev->id;
- int ret = 0;
-+
-+#ifdef __powerpc__
-+ int cpu = sysdev->id;
- struct cpufreq_policy *cpu_policy;
-
- dprintk("resuming cpu %u\n", cpu);
-
-+ /* As with the ->suspend method, all the code below is
-+ * only necessary because Powerbooks suck.
-+ * See commit 42d4dc3f4e1e for jokes. */
-+
- if (!cpu_online(cpu))
- return 0;
-
-@@ -1391,6 +1411,7 @@ out:
- schedule_work(&cpu_policy->update);
- fail:
- cpufreq_cpu_put(cpu_policy);
-+#endif /* __powerpc__ */
- return ret;
- }
-
-diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
-index 5749050..bdea7e2 100644
---- a/drivers/cpufreq/cpufreq_conservative.c
-+++ b/drivers/cpufreq/cpufreq_conservative.c
-@@ -63,6 +63,7 @@ struct cpu_dbs_info_s {
- unsigned int down_skip;
- unsigned int requested_freq;
- int cpu;
-+ unsigned int enable:1;
- /*
- * percpu mutex that serializes governor limit change with
- * do_dbs_timer invocation. We do not want do_dbs_timer to run
-@@ -141,6 +142,9 @@ dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
-
- struct cpufreq_policy *policy;
-
-+ if (!this_dbs_info->enable)
-+ return 0;
-+
- policy = this_dbs_info->cur_policy;
-
- /*
-@@ -497,6 +501,7 @@ static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)
- int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
- delay -= jiffies % delay;
-
-+ dbs_info->enable = 1;
- INIT_DELAYED_WORK_DEFERRABLE(&dbs_info->work, do_dbs_timer);
- queue_delayed_work_on(dbs_info->cpu, kconservative_wq, &dbs_info->work,
- delay);
-@@ -504,6 +509,7 @@ static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)
-
- static inline void dbs_timer_exit(struct cpu_dbs_info_s *dbs_info)
- {
-+ dbs_info->enable = 0;
- cancel_delayed_work_sync(&dbs_info->work);
- }
-
-diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c
-index 24964c1..e2a10bc 100644
---- a/drivers/edac/amd64_edac.c
-+++ b/drivers/edac/amd64_edac.c
-@@ -868,6 +868,8 @@ static void amd64_read_dbam_reg(struct amd64_pvt *pvt)
- goto err_reg;
- }
-
-+ return;
-+
- err_reg:
- debugf0("Error reading F2x%03x.\n", reg);
- }
-@@ -2634,6 +2636,8 @@ static void amd64_read_mc_registers(struct amd64_pvt *pvt)
-
- amd64_dump_misc_regs(pvt);
-
-+ return;
-+
- err_reg:
- debugf0("Reading an MC register failed\n");
-
-@@ -2977,6 +2981,9 @@ static int amd64_check_ecc_enabled(struct amd64_pvt *pvt)
- "ECC is enabled by BIOS, Proceeding "
- "with EDAC module initialization\n");
-
-+ /* Signal good ECC status */
-+ ret = 0;
-+
- /* CLEAR the override, since BIOS controlled it */
- ecc_enable_override = 0;
- }
-diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
-index 8fab789..33be210 100644
---- a/drivers/gpu/drm/drm_crtc.c
-+++ b/drivers/gpu/drm/drm_crtc.c
-@@ -1461,7 +1461,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
- goto out;
- }
-
-- if (crtc_req->count_connectors > 0 && !mode && !fb) {
-+ if (crtc_req->count_connectors > 0 && (!mode || !fb)) {
- DRM_DEBUG("Count connectors is %d but no mode or fb set\n",
- crtc_req->count_connectors);
- ret = -EINVAL;
-diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
-index 3da9cfa..6aaa2cb 100644
---- a/drivers/gpu/drm/drm_crtc_helper.c
-+++ b/drivers/gpu/drm/drm_crtc_helper.c
-@@ -706,8 +706,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
- struct drm_encoder **save_encoders, *new_encoder;
- struct drm_framebuffer *old_fb = NULL;
- bool save_enabled;
-- bool mode_changed = false;
-- bool fb_changed = false;
-+ bool mode_changed = false; /* if true do a full mode set */
-+ bool fb_changed = false; /* if true and !mode_changed just do a flip */
- struct drm_connector *connector;
- int count = 0, ro, fail = 0;
- struct drm_crtc_helper_funcs *crtc_funcs;
-@@ -758,6 +758,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
- if (set->crtc->fb == NULL) {
- DRM_DEBUG("crtc has no fb, full mode set\n");
- mode_changed = true;
-+ } else if (set->fb == NULL) {
-+ mode_changed = true;
- } else if ((set->fb->bits_per_pixel !=
- set->crtc->fb->bits_per_pixel) ||
- set->fb->depth != set->crtc->fb->depth)
-diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
-index 05a4489..f1ba8ff 100644
---- a/drivers/gpu/drm/radeon/r100.c
-+++ b/drivers/gpu/drm/radeon/r100.c
-@@ -722,13 +722,14 @@ int r100_cs_packet_parse(struct radeon_cs_parser *p,
- unsigned idx)
- {
- struct radeon_cs_chunk *ib_chunk = &p->chunks[p->chunk_ib_idx];
-- uint32_t header = ib_chunk->kdata[idx];
-+ uint32_t header;
-
- if (idx >= ib_chunk->length_dw) {
- DRM_ERROR("Can not parse packet at %d after CS end %d !\n",
- idx, ib_chunk->length_dw);
- return -EINVAL;
- }
-+ header = ib_chunk->kdata[idx];
- pkt->idx = idx;
- pkt->type = CP_PACKET_GET_TYPE(header);
- pkt->count = CP_PACKET_GET_COUNT(header);
-diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
-index 3cfcee1..0bd5879 100644
---- a/drivers/gpu/drm/radeon/radeon_drv.c
-+++ b/drivers/gpu/drm/radeon/radeon_drv.c
-@@ -318,6 +318,14 @@ static int __init radeon_init(void)
- driver = &driver_old;
- driver->num_ioctls = radeon_max_ioctl;
- #if defined(CONFIG_DRM_RADEON_KMS)
-+#ifdef CONFIG_VGA_CONSOLE
-+ if (vgacon_text_force() && radeon_modeset == -1) {
-+ DRM_INFO("VGACON disable radeon kernel modesetting.\n");
-+ driver = &driver_old;
-+ driver->driver_features &= ~DRIVER_MODESET;
-+ radeon_modeset = 0;
-+ }
-+#endif
- /* if enabled by default */
- if (radeon_modeset == -1) {
- DRM_INFO("radeon default to kernel modesetting.\n");
-@@ -329,17 +337,8 @@ static int __init radeon_init(void)
- driver->driver_features |= DRIVER_MODESET;
- driver->num_ioctls = radeon_max_kms_ioctl;
- }
--
- /* if the vga console setting is enabled still
- * let modprobe override it */
--#ifdef CONFIG_VGA_CONSOLE
-- if (vgacon_text_force() && radeon_modeset == -1) {
-- DRM_INFO("VGACON disable radeon kernel modesetting.\n");
-- driver = &driver_old;
-- driver->driver_features &= ~DRIVER_MODESET;
-- radeon_modeset = 0;
-- }
--#endif
- #endif
- return drm_init(driver);
- }
-diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
-index 937a2f1..3357110 100644
---- a/drivers/gpu/drm/radeon/radeon_kms.c
-+++ b/drivers/gpu/drm/radeon/radeon_kms.c
-@@ -58,6 +58,8 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
- if (r) {
- DRM_ERROR("Failed to initialize radeon, disabling IOCTL\n");
- radeon_device_fini(rdev);
-+ kfree(rdev);
-+ dev->dev_private = NULL;
- return r;
- }
- return 0;
-diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
-index 551e608..fd8f3ca 100644
---- a/drivers/gpu/drm/radeon/rv515.c
-+++ b/drivers/gpu/drm/radeon/rv515.c
-@@ -370,6 +370,7 @@ void rv515_vram_info(struct radeon_device *rdev)
-
- rv515_vram_get_type(rdev);
-
-+ r100_vram_init_sizes(rdev);
- /* FIXME: we should enforce default clock in case GPU is not in
- * default setup
- */
-diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
-index 6538d42..c2b0d71 100644
---- a/drivers/gpu/drm/ttm/ttm_bo.c
-+++ b/drivers/gpu/drm/ttm/ttm_bo.c
-@@ -1182,13 +1182,14 @@ static int ttm_bo_force_list_clean(struct ttm_bo_device *bdev,
-
- int ttm_bo_clean_mm(struct ttm_bo_device *bdev, unsigned mem_type)
- {
-- struct ttm_mem_type_manager *man = &bdev->man[mem_type];
-+ struct ttm_mem_type_manager *man;
- int ret = -EINVAL;
-
- if (mem_type >= TTM_NUM_MEM_TYPES) {
- printk(KERN_ERR TTM_PFX "Illegal memory type %d\n", mem_type);
- return ret;
- }
-+ man = &bdev->man[mem_type];
-
- if (!man->has_type) {
- printk(KERN_ERR TTM_PFX "Trying to take down uninitialized "
-@@ -1575,6 +1576,10 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
- driver->sync_obj_unref(&sync_obj);
- driver->sync_obj_unref(&tmp_obj);
- spin_lock(&bo->lock);
-+ } else {
-+ spin_unlock(&bo->lock);
-+ driver->sync_obj_unref(&sync_obj);
-+ spin_lock(&bo->lock);
- }
- }
- return 0;
-diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
-index ce2e6f3..ad4ada0 100644
---- a/drivers/gpu/drm/ttm/ttm_bo_util.c
-+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
-@@ -150,7 +150,7 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
- #ifdef CONFIG_X86
- dst = kmap_atomic_prot(d, KM_USER0, prot);
- #else
-- if (prot != PAGE_KERNEL)
-+ if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
- dst = vmap(&d, 1, 0, prot);
- else
- dst = kmap(d);
-@@ -163,7 +163,7 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src,
- #ifdef CONFIG_X86
- kunmap_atomic(dst, KM_USER0);
- #else
-- if (prot != PAGE_KERNEL)
-+ if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
- vunmap(dst);
- else
- kunmap(d);
-@@ -186,7 +186,7 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
- #ifdef CONFIG_X86
- src = kmap_atomic_prot(s, KM_USER0, prot);
- #else
-- if (prot != PAGE_KERNEL)
-+ if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
- src = vmap(&s, 1, 0, prot);
- else
- src = kmap(s);
-@@ -199,7 +199,7 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst,
- #ifdef CONFIG_X86
- kunmap_atomic(src, KM_USER0);
- #else
-- if (prot != PAGE_KERNEL)
-+ if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
- vunmap(src);
- else
- kunmap(s);
-diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c
-index b587e2d..820e516 100644
---- a/drivers/input/serio/hp_sdc_mlc.c
-+++ b/drivers/input/serio/hp_sdc_mlc.c
-@@ -296,7 +296,7 @@ static void hp_sdc_mlc_out(hil_mlc *mlc)
- priv->tseq[3] = 0;
- if (mlc->opacket & HIL_CTRL_APE) {
- priv->tseq[3] |= HP_SDC_LPC_APE_IPF;
-- down_trylock(&mlc->csem);
-+ BUG_ON(down_trylock(&mlc->csem));
- }
- enqueue:
- hp_sdc_enqueue_transaction(&priv->trans);
-diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c
-index c3b661a..7e5f30d 100644
---- a/drivers/isdn/mISDN/l1oip_core.c
-+++ b/drivers/isdn/mISDN/l1oip_core.c
-@@ -1480,7 +1480,7 @@ l1oip_init(void)
- return -ENOMEM;
-
- l1oip_cnt = 0;
-- while (type[l1oip_cnt] && l1oip_cnt < MAX_CARDS) {
-+ while (l1oip_cnt < MAX_CARDS && type[l1oip_cnt]) {
- switch (type[l1oip_cnt] & 0xff) {
- case 1:
- pri = 0;
-diff --git a/drivers/md/linear.c b/drivers/md/linear.c
-index 5810fa9..5fe39c2 100644
---- a/drivers/md/linear.c
-+++ b/drivers/md/linear.c
-@@ -220,6 +220,7 @@ static int linear_run (mddev_t *mddev)
- mddev->queue->unplug_fn = linear_unplug;
- mddev->queue->backing_dev_info.congested_fn = linear_congested;
- mddev->queue->backing_dev_info.congested_data = mddev;
-+ md_integrity_register(mddev);
- return 0;
- }
-
-@@ -256,6 +257,7 @@ static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
- rcu_assign_pointer(mddev->private, newconf);
- md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
- set_capacity(mddev->gendisk, mddev->array_sectors);
-+ revalidate_disk(mddev->gendisk);
- call_rcu(&oldconf->rcu, free_conf);
- return 0;
- }
-diff --git a/drivers/md/md.c b/drivers/md/md.c
-index d4351ff..5b98bea 100644
---- a/drivers/md/md.c
-+++ b/drivers/md/md.c
-@@ -1308,7 +1308,12 @@ static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
- }
- if (mddev->level != LEVEL_MULTIPATH) {
- int role;
-- role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
-+ if (rdev->desc_nr < 0 ||
-+ rdev->desc_nr >= le32_to_cpu(sb->max_dev)) {
-+ role = 0xffff;
-+ rdev->desc_nr = -1;
-+ } else
-+ role = le16_to_cpu(sb->dev_roles[rdev->desc_nr]);
- switch(role) {
- case 0xffff: /* spare */
- break;
-@@ -1394,8 +1399,14 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
- if (rdev2->desc_nr+1 > max_dev)
- max_dev = rdev2->desc_nr+1;
-
-- if (max_dev > le32_to_cpu(sb->max_dev))
-+ if (max_dev > le32_to_cpu(sb->max_dev)) {
-+ int bmask;
- sb->max_dev = cpu_to_le32(max_dev);
-+ rdev->sb_size = max_dev * 2 + 256;
-+ bmask = queue_logical_block_size(rdev->bdev->bd_disk->queue)-1;
-+ if (rdev->sb_size & bmask)
-+ rdev->sb_size = (rdev->sb_size | bmask) + 1;
-+ }
- for (i=0; i<max_dev;i++)
- sb->dev_roles[i] = cpu_to_le16(0xfffe);
-
-@@ -1487,37 +1498,76 @@ static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2)
-
- static LIST_HEAD(pending_raid_disks);
-
--static void md_integrity_check(mdk_rdev_t *rdev, mddev_t *mddev)
-+/*
-+ * Try to register data integrity profile for an mddev
-+ *
-+ * This is called when an array is started and after a disk has been kicked
-+ * from the array. It only succeeds if all working and active component devices
-+ * are integrity capable with matching profiles.
-+ */
-+int md_integrity_register(mddev_t *mddev)
-+{
-+ mdk_rdev_t *rdev, *reference = NULL;
-+
-+ if (list_empty(&mddev->disks))
-+ return 0; /* nothing to do */
-+ if (blk_get_integrity(mddev->gendisk))
-+ return 0; /* already registered */
-+ list_for_each_entry(rdev, &mddev->disks, same_set) {
-+ /* skip spares and non-functional disks */
-+ if (test_bit(Faulty, &rdev->flags))
-+ continue;
-+ if (rdev->raid_disk < 0)
-+ continue;
-+ /*
-+ * If at least one rdev is not integrity capable, we can not
-+ * enable data integrity for the md device.
-+ */
-+ if (!bdev_get_integrity(rdev->bdev))
-+ return -EINVAL;
-+ if (!reference) {
-+ /* Use the first rdev as the reference */
-+ reference = rdev;
-+ continue;
-+ }
-+ /* does this rdev's profile match the reference profile? */
-+ if (blk_integrity_compare(reference->bdev->bd_disk,
-+ rdev->bdev->bd_disk) < 0)
-+ return -EINVAL;
-+ }
-+ /*
-+ * All component devices are integrity capable and have matching
-+ * profiles, register the common profile for the md device.
-+ */
-+ if (blk_integrity_register(mddev->gendisk,
-+ bdev_get_integrity(reference->bdev)) != 0) {
-+ printk(KERN_ERR "md: failed to register integrity for %s\n",
-+ mdname(mddev));
-+ return -EINVAL;
-+ }
-+ printk(KERN_NOTICE "md: data integrity on %s enabled\n",
-+ mdname(mddev));
-+ return 0;
-+}
-+EXPORT_SYMBOL(md_integrity_register);
-+
-+/* Disable data integrity if non-capable/non-matching disk is being added */
-+void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
- {
-- struct mdk_personality *pers = mddev->pers;
-- struct gendisk *disk = mddev->gendisk;
- struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev);
-- struct blk_integrity *bi_mddev = blk_get_integrity(disk);
-+ struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk);
-
-- /* Data integrity passthrough not supported on RAID 4, 5 and 6 */
-- if (pers && pers->level >= 4 && pers->level <= 6)
-+ if (!bi_mddev) /* nothing to do */
- return;
--
-- /* If rdev is integrity capable, register profile for mddev */
-- if (!bi_mddev && bi_rdev) {
-- if (blk_integrity_register(disk, bi_rdev))
-- printk(KERN_ERR "%s: %s Could not register integrity!\n",
-- __func__, disk->disk_name);
-- else
-- printk(KERN_NOTICE "Enabling data integrity on %s\n",
-- disk->disk_name);
-+ if (rdev->raid_disk < 0) /* skip spares */
- return;
-- }
--
-- /* Check that mddev and rdev have matching profiles */
-- if (blk_integrity_compare(disk, rdev->bdev->bd_disk) < 0) {
-- printk(KERN_ERR "%s: %s/%s integrity mismatch!\n", __func__,
-- disk->disk_name, rdev->bdev->bd_disk->disk_name);
-- printk(KERN_NOTICE "Disabling data integrity on %s\n",
-- disk->disk_name);
-- blk_integrity_unregister(disk);
-- }
-+ if (bi_rdev && blk_integrity_compare(mddev->gendisk,
-+ rdev->bdev->bd_disk) >= 0)
-+ return;
-+ printk(KERN_NOTICE "disabling data integrity on %s\n", mdname(mddev));
-+ blk_integrity_unregister(mddev->gendisk);
- }
-+EXPORT_SYMBOL(md_integrity_add_rdev);
-
- static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
- {
-@@ -1591,7 +1641,6 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
- /* May as well allow recovery to be retried once */
- mddev->recovery_disabled = 0;
-
-- md_integrity_check(rdev, mddev);
- return 0;
-
- fail:
-@@ -2657,6 +2706,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
- ssize_t rv = len;
- struct mdk_personality *pers;
- void *priv;
-+ mdk_rdev_t *rdev;
-
- if (mddev->pers == NULL) {
- if (len == 0)
-@@ -2736,6 +2786,12 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
- mddev_suspend(mddev);
- mddev->pers->stop(mddev);
- module_put(mddev->pers->owner);
-+ /* Invalidate devices that are now superfluous */
-+ list_for_each_entry(rdev, &mddev->disks, same_set)
-+ if (rdev->raid_disk >= mddev->raid_disks) {
-+ rdev->raid_disk = -1;
-+ clear_bit(In_sync, &rdev->flags);
-+ }
- mddev->pers = pers;
- mddev->private = priv;
- strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
-@@ -3685,17 +3741,8 @@ array_size_store(mddev_t *mddev, const char *buf, size_t len)
-
- mddev->array_sectors = sectors;
- set_capacity(mddev->gendisk, mddev->array_sectors);
-- if (mddev->pers) {
-- struct block_device *bdev = bdget_disk(mddev->gendisk, 0);
--
-- if (bdev) {
-- mutex_lock(&bdev->bd_inode->i_mutex);
-- i_size_write(bdev->bd_inode,
-- (loff_t)mddev->array_sectors << 9);
-- mutex_unlock(&bdev->bd_inode->i_mutex);
-- bdput(bdev);
-- }
-- }
-+ if (mddev->pers)
-+ revalidate_disk(mddev->gendisk);
-
- return len;
- }
-@@ -4048,10 +4095,6 @@ static int do_md_run(mddev_t * mddev)
- }
- strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
-
-- if (pers->level >= 4 && pers->level <= 6)
-- /* Cannot support integrity (yet) */
-- blk_integrity_unregister(mddev->gendisk);
--
- if (mddev->reshape_position != MaxSector &&
- pers->start_reshape == NULL) {
- /* This personality cannot handle reshaping... */
-@@ -4189,6 +4232,7 @@ static int do_md_run(mddev_t * mddev)
- md_wakeup_thread(mddev->thread);
- md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */
-
-+ revalidate_disk(mddev->gendisk);
- mddev->changed = 1;
- md_new_event(mddev);
- sysfs_notify_dirent(mddev->sysfs_state);
-@@ -5087,18 +5131,8 @@ static int update_size(mddev_t *mddev, sector_t num_sectors)
- return -ENOSPC;
- }
- rv = mddev->pers->resize(mddev, num_sectors);
-- if (!rv) {
-- struct block_device *bdev;
--
-- bdev = bdget_disk(mddev->gendisk, 0);
-- if (bdev) {
-- mutex_lock(&bdev->bd_inode->i_mutex);
-- i_size_write(bdev->bd_inode,
-- (loff_t)mddev->array_sectors << 9);
-- mutex_unlock(&bdev->bd_inode->i_mutex);
-- bdput(bdev);
-- }
-- }
-+ if (!rv)
-+ revalidate_disk(mddev->gendisk);
- return rv;
- }
-
-diff --git a/drivers/md/md.h b/drivers/md/md.h
-index 9430a11..78f0316 100644
---- a/drivers/md/md.h
-+++ b/drivers/md/md.h
-@@ -431,5 +431,7 @@ extern int md_allow_write(mddev_t *mddev);
- extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
- extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors);
- extern int md_check_no_bitmap(mddev_t *mddev);
-+extern int md_integrity_register(mddev_t *mddev);
-+void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
-
- #endif /* _MD_MD_H */
-diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c
-index 237fe3f..7140909 100644
---- a/drivers/md/multipath.c
-+++ b/drivers/md/multipath.c
-@@ -313,6 +313,7 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
- set_bit(In_sync, &rdev->flags);
- rcu_assign_pointer(p->rdev, rdev);
- err = 0;
-+ md_integrity_add_rdev(rdev, mddev);
- break;
- }
-
-@@ -345,7 +346,9 @@ static int multipath_remove_disk(mddev_t *mddev, int number)
- /* lost the race, try later */
- err = -EBUSY;
- p->rdev = rdev;
-+ goto abort;
- }
-+ md_integrity_register(mddev);
- }
- abort:
-
-@@ -519,7 +522,7 @@ static int multipath_run (mddev_t *mddev)
- mddev->queue->unplug_fn = multipath_unplug;
- mddev->queue->backing_dev_info.congested_fn = multipath_congested;
- mddev->queue->backing_dev_info.congested_data = mddev;
--
-+ md_integrity_register(mddev);
- return 0;
-
- out_free_conf:
-diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
-index 335f490..898e2bd 100644
---- a/drivers/md/raid0.c
-+++ b/drivers/md/raid0.c
-@@ -351,6 +351,7 @@ static int raid0_run(mddev_t *mddev)
-
- blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
- dump_zones(mddev);
-+ md_integrity_register(mddev);
- return 0;
- }
-
-diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
-index 0569efb..8726fd7 100644
---- a/drivers/md/raid1.c
-+++ b/drivers/md/raid1.c
-@@ -1144,7 +1144,7 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
- rcu_assign_pointer(p->rdev, rdev);
- break;
- }
--
-+ md_integrity_add_rdev(rdev, mddev);
- print_conf(conf);
- return err;
- }
-@@ -1178,7 +1178,9 @@ static int raid1_remove_disk(mddev_t *mddev, int number)
- /* lost the race, try later */
- err = -EBUSY;
- p->rdev = rdev;
-+ goto abort;
- }
-+ md_integrity_register(mddev);
- }
- abort:
-
-@@ -2067,7 +2069,7 @@ static int run(mddev_t *mddev)
- mddev->queue->unplug_fn = raid1_unplug;
- mddev->queue->backing_dev_info.congested_fn = raid1_congested;
- mddev->queue->backing_dev_info.congested_data = mddev;
--
-+ md_integrity_register(mddev);
- return 0;
-
- out_no_mem:
-@@ -2132,6 +2134,7 @@ static int raid1_resize(mddev_t *mddev, sector_t sectors)
- return -EINVAL;
- set_capacity(mddev->gendisk, mddev->array_sectors);
- mddev->changed = 1;
-+ revalidate_disk(mddev->gendisk);
- if (sectors > mddev->dev_sectors &&
- mddev->recovery_cp == MaxSector) {
- mddev->recovery_cp = mddev->dev_sectors;
-diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
-index 7298a5e..3d9020c 100644
---- a/drivers/md/raid10.c
-+++ b/drivers/md/raid10.c
-@@ -1170,6 +1170,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
- break;
- }
-
-+ md_integrity_add_rdev(rdev, mddev);
- print_conf(conf);
- return err;
- }
-@@ -1203,7 +1204,9 @@ static int raid10_remove_disk(mddev_t *mddev, int number)
- /* lost the race, try later */
- err = -EBUSY;
- p->rdev = rdev;
-+ goto abort;
- }
-+ md_integrity_register(mddev);
- }
- abort:
-
-@@ -2225,6 +2228,7 @@ static int run(mddev_t *mddev)
-
- if (conf->near_copies < mddev->raid_disks)
- blk_queue_merge_bvec(mddev->queue, raid10_mergeable_bvec);
-+ md_integrity_register(mddev);
- return 0;
-
- out_free_conf:
-diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
-index 3783553..2b521ee 100644
---- a/drivers/md/raid5.c
-+++ b/drivers/md/raid5.c
-@@ -3999,6 +3999,9 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski
- return 0;
- }
-
-+ /* Allow raid5_quiesce to complete */
-+ wait_event(conf->wait_for_overlap, conf->quiesce != 2);
-+
- if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery))
- return reshape_request(mddev, sector_nr, skipped);
-
-@@ -4316,6 +4319,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
- return sectors * (raid_disks - conf->max_degraded);
- }
-
-+static void free_conf(raid5_conf_t *conf)
-+{
-+ shrink_stripes(conf);
-+ safe_put_page(conf->spare_page);
-+ kfree(conf->disks);
-+ kfree(conf->stripe_hashtbl);
-+ kfree(conf);
-+}
-+
- static raid5_conf_t *setup_conf(mddev_t *mddev)
- {
- raid5_conf_t *conf;
-@@ -4447,11 +4459,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
-
- abort:
- if (conf) {
-- shrink_stripes(conf);
-- safe_put_page(conf->spare_page);
-- kfree(conf->disks);
-- kfree(conf->stripe_hashtbl);
-- kfree(conf);
-+ free_conf(conf);
- return ERR_PTR(-EIO);
- } else
- return ERR_PTR(-ENOMEM);
-@@ -4629,12 +4637,8 @@ abort:
- md_unregister_thread(mddev->thread);
- mddev->thread = NULL;
- if (conf) {
-- shrink_stripes(conf);
- print_raid5_conf(conf);
-- safe_put_page(conf->spare_page);
-- kfree(conf->disks);
-- kfree(conf->stripe_hashtbl);
-- kfree(conf);
-+ free_conf(conf);
- }
- mddev->private = NULL;
- printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev));
-@@ -4649,13 +4653,10 @@ static int stop(mddev_t *mddev)
-
- md_unregister_thread(mddev->thread);
- mddev->thread = NULL;
-- shrink_stripes(conf);
-- kfree(conf->stripe_hashtbl);
- mddev->queue->backing_dev_info.congested_fn = NULL;
- blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
- sysfs_remove_group(&mddev->kobj, &raid5_attrs_group);
-- kfree(conf->disks);
-- kfree(conf);
-+ free_conf(conf);
- mddev->private = NULL;
- return 0;
- }
-@@ -4857,6 +4858,7 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors)
- return -EINVAL;
- set_capacity(mddev->gendisk, mddev->array_sectors);
- mddev->changed = 1;
-+ revalidate_disk(mddev->gendisk);
- if (sectors > mddev->dev_sectors && mddev->recovery_cp == MaxSector) {
- mddev->recovery_cp = mddev->dev_sectors;
- set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
-@@ -5002,7 +5004,7 @@ static int raid5_start_reshape(mddev_t *mddev)
- spin_unlock_irqrestore(&conf->device_lock, flags);
- }
- mddev->raid_disks = conf->raid_disks;
-- mddev->reshape_position = 0;
-+ mddev->reshape_position = conf->reshape_progress;
- set_bit(MD_CHANGE_DEVS, &mddev->flags);
-
- clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
-@@ -5057,7 +5059,6 @@ static void end_reshape(raid5_conf_t *conf)
- */
- static void raid5_finish_reshape(mddev_t *mddev)
- {
-- struct block_device *bdev;
- raid5_conf_t *conf = mddev->private;
-
- if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
-@@ -5066,15 +5067,7 @@ static void raid5_finish_reshape(mddev_t *mddev)
- md_set_array_sectors(mddev, raid5_size(mddev, 0, 0));
- set_capacity(mddev->gendisk, mddev->array_sectors);
- mddev->changed = 1;
--
-- bdev = bdget_disk(mddev->gendisk, 0);
-- if (bdev) {
-- mutex_lock(&bdev->bd_inode->i_mutex);
-- i_size_write(bdev->bd_inode,
-- (loff_t)mddev->array_sectors << 9);
-- mutex_unlock(&bdev->bd_inode->i_mutex);
-- bdput(bdev);
-- }
-+ revalidate_disk(mddev->gendisk);
- } else {
- int d;
- mddev->degraded = conf->raid_disks;
-@@ -5106,12 +5099,18 @@ static void raid5_quiesce(mddev_t *mddev, int state)
-
- case 1: /* stop all writes */
- spin_lock_irq(&conf->device_lock);
-- conf->quiesce = 1;
-+ /* '2' tells resync/reshape to pause so that all
-+ * active stripes can drain
-+ */
-+ conf->quiesce = 2;
- wait_event_lock_irq(conf->wait_for_stripe,
- atomic_read(&conf->active_stripes) == 0 &&
- atomic_read(&conf->active_aligned_reads) == 0,
- conf->device_lock, /* nothing */);
-+ conf->quiesce = 1;
- spin_unlock_irq(&conf->device_lock);
-+ /* allow reshape to continue */
-+ wake_up(&conf->wait_for_overlap);
- break;
-
- case 0: /* re-enable writes */
-diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c
-index bae61b2..7d43083 100644
---- a/drivers/mfd/twl4030-irq.c
-+++ b/drivers/mfd/twl4030-irq.c
-@@ -180,14 +180,9 @@ static struct completion irq_event;
- static int twl4030_irq_thread(void *data)
- {
- long irq = (long)data;
-- struct irq_desc *desc = irq_to_desc(irq);
- static unsigned i2c_errors;
- static const unsigned max_i2c_errors = 100;
-
-- if (!desc) {
-- pr_err("twl4030: Invalid IRQ: %ld\n", irq);
-- return -EINVAL;
-- }
-
- current->flags |= PF_NOFREEZE;
-
-@@ -240,7 +235,7 @@ static int twl4030_irq_thread(void *data)
- }
- local_irq_enable();
-
-- desc->chip->unmask(irq);
-+ enable_irq(irq);
- }
-
- return 0;
-@@ -255,25 +250,13 @@ static int twl4030_irq_thread(void *data)
- * thread. All we do here is acknowledge and mask the interrupt and wakeup
- * the kernel thread.
- */
--static void handle_twl4030_pih(unsigned int irq, struct irq_desc *desc)
-+static irqreturn_t handle_twl4030_pih(int irq, void *devid)
- {
- /* Acknowledge, clear *AND* mask the interrupt... */
-- desc->chip->ack(irq);
-- complete(&irq_event);
--}
--
--static struct task_struct *start_twl4030_irq_thread(long irq)
--{
-- struct task_struct *thread;
--
-- init_completion(&irq_event);
-- thread = kthread_run(twl4030_irq_thread, (void *)irq, "twl4030-irq");
-- if (!thread)
-- pr_err("twl4030: could not create irq %ld thread!\n", irq);
--
-- return thread;
-+ disable_irq_nosync(irq);
-+ complete(devid);
-+ return IRQ_HANDLED;
- }
--
- /*----------------------------------------------------------------------*/
-
- /*
-@@ -734,18 +717,28 @@ int twl_init_irq(int irq_num, unsigned irq_base, unsigned irq_end)
- }
-
- /* install an irq handler to demultiplex the TWL4030 interrupt */
-- task = start_twl4030_irq_thread(irq_num);
-- if (!task) {
-- pr_err("twl4030: irq thread FAIL\n");
-- status = -ESRCH;
-- goto fail;
-- }
-
-- set_irq_data(irq_num, task);
-- set_irq_chained_handler(irq_num, handle_twl4030_pih);
-
-- return status;
-+ init_completion(&irq_event);
-
-+ status = request_irq(irq_num, handle_twl4030_pih, IRQF_DISABLED,
-+ "TWL4030-PIH", &irq_event);
-+ if (status < 0) {
-+ pr_err("twl4030: could not claim irq%d: %d\n", irq_num, status);
-+ goto fail_rqirq;
-+ }
-+
-+ task = kthread_run(twl4030_irq_thread, (void *)irq_num, "twl4030-irq");
-+ if (IS_ERR(task)) {
-+ pr_err("twl4030: could not create irq %d thread!\n", irq_num);
-+ status = PTR_ERR(task);
-+ goto fail_kthread;
-+ }
-+ return status;
-+fail_kthread:
-+ free_irq(irq_num, &irq_event);
-+fail_rqirq:
-+ /* clean up twl4030_sih_setup */
- fail:
- for (i = irq_base; i < irq_end; i++)
- set_irq_chip_and_handler(i, NULL, NULL);
-diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c
-index 3e00fa8..4a7c328 100644
---- a/drivers/net/3c515.c
-+++ b/drivers/net/3c515.c
-@@ -832,7 +832,9 @@ static int corkscrew_open(struct net_device *dev)
- skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
- vp->rx_ring[i].addr = isa_virt_to_bus(skb->data);
- }
-- vp->rx_ring[i - 1].next = isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
-+ if (i != 0)
-+ vp->rx_ring[i - 1].next =
-+ isa_virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
- outl(isa_virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr);
- }
- if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */
-diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c
-index c34aee9..c204168 100644
---- a/drivers/net/3c59x.c
-+++ b/drivers/net/3c59x.c
-@@ -2721,13 +2721,15 @@ dump_tx_ring(struct net_device *dev)
- &vp->tx_ring[vp->dirty_tx % TX_RING_SIZE]);
- issue_and_wait(dev, DownStall);
- for (i = 0; i < TX_RING_SIZE; i++) {
-- pr_err(" %d: @%p length %8.8x status %8.8x\n", i,
-- &vp->tx_ring[i],
-+ unsigned int length;
-+
- #if DO_ZEROCOPY
-- le32_to_cpu(vp->tx_ring[i].frag[0].length),
-+ length = le32_to_cpu(vp->tx_ring[i].frag[0].length);
- #else
-- le32_to_cpu(vp->tx_ring[i].length),
-+ length = le32_to_cpu(vp->tx_ring[i].length);
- #endif
-+ pr_err(" %d: @%p length %8.8x status %8.8x\n",
-+ i, &vp->tx_ring[i], length,
- le32_to_cpu(vp->tx_ring[i].status));
- }
- if (!stalled)
-diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c
-index 1686dca..1f016d6 100644
---- a/drivers/net/eexpress.c
-+++ b/drivers/net/eexpress.c
-@@ -1474,13 +1474,13 @@ static void eexp_hw_init586(struct net_device *dev)
- outw(0x0000, ioaddr + 0x800c);
- outw(0x0000, ioaddr + 0x800e);
-
-- for (i = 0; i < (sizeof(start_code)); i+=32) {
-+ for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) {
- int j;
- outw(i, ioaddr + SM_PTR);
-- for (j = 0; j < 16; j+=2)
-+ for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2)
- outw(start_code[(i+j)/2],
- ioaddr+0x4000+j);
-- for (j = 0; j < 16; j+=2)
-+ for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2)
- outw(start_code[(i+j+16)/2],
- ioaddr+0x8000+j);
- }
-diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h
-index 78952f8..fa311a9 100644
---- a/drivers/net/ehea/ehea.h
-+++ b/drivers/net/ehea/ehea.h
-@@ -40,7 +40,7 @@
- #include <asm/io.h>
-
- #define DRV_NAME "ehea"
--#define DRV_VERSION "EHEA_0101"
-+#define DRV_VERSION "EHEA_0102"
-
- /* eHEA capability flags */
- #define DLPAR_PORT_ADD_REM 1
-diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
-index e8d46cc..977c3d3 100644
---- a/drivers/net/ehea/ehea_main.c
-+++ b/drivers/net/ehea/ehea_main.c
-@@ -1545,6 +1545,9 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
- {
- int ret, i;
-
-+ if (pr->qp)
-+ netif_napi_del(&pr->napi);
-+
- ret = ehea_destroy_qp(pr->qp);
-
- if (!ret) {
-diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c
-index dbf06e9..2234118 100644
---- a/drivers/net/gianfar_ethtool.c
-+++ b/drivers/net/gianfar_ethtool.c
-@@ -366,9 +366,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals
- return -EINVAL;
- }
-
-- priv->rxic = mk_ic_value(
-- gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs),
-- cvals->rx_max_coalesced_frames);
-+ priv->rxic = mk_ic_value(cvals->rx_max_coalesced_frames,
-+ gfar_usecs2ticks(priv, cvals->rx_coalesce_usecs));
-
- /* Set up tx coalescing */
- if ((cvals->tx_coalesce_usecs == 0) ||
-@@ -390,9 +389,8 @@ static int gfar_scoalesce(struct net_device *dev, struct ethtool_coalesce *cvals
- return -EINVAL;
- }
-
-- priv->txic = mk_ic_value(
-- gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs),
-- cvals->tx_max_coalesced_frames);
-+ priv->txic = mk_ic_value(cvals->tx_max_coalesced_frames,
-+ gfar_usecs2ticks(priv, cvals->tx_coalesce_usecs));
-
- gfar_write(&priv->regs->rxic, 0);
- if (priv->rxcoalescing)
-diff --git a/drivers/net/igbvf/vf.c b/drivers/net/igbvf/vf.c
-index 2a4faf9..a9a61ef 100644
---- a/drivers/net/igbvf/vf.c
-+++ b/drivers/net/igbvf/vf.c
-@@ -274,6 +274,8 @@ static s32 e1000_set_vfta_vf(struct e1000_hw *hw, u16 vid, bool set)
-
- err = mbx->ops.read_posted(hw, msgbuf, 2);
-
-+ msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
-+
- /* if nacked the vlan was rejected */
- if (!err && (msgbuf[0] == (E1000_VF_SET_VLAN | E1000_VT_MSGTYPE_NACK)))
- err = -E1000_ERR_MAC_INIT;
-@@ -317,6 +319,8 @@ static void e1000_rar_set_vf(struct e1000_hw *hw, u8 * addr, u32 index)
- if (!ret_val)
- ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
-
-+ msgbuf[0] &= ~E1000_VT_MSGTYPE_CTS;
-+
- /* if nacked the address was rejected, use "perm_addr" */
- if (!ret_val &&
- (msgbuf[0] == (E1000_VF_SET_MAC_ADDR | E1000_VT_MSGTYPE_NACK)))
-diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h
-index 1b12c7b..e11d83d 100644
---- a/drivers/net/ixgbe/ixgbe.h
-+++ b/drivers/net/ixgbe/ixgbe.h
-@@ -96,6 +96,8 @@
- #define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000
- #define IXGBE_TX_FLAGS_VLAN_SHIFT 16
-
-+#define IXGBE_MAX_RSC_INT_RATE 162760
-+
- /* wrapper around a pointer to a socket buffer,
- * so a DMA handle can be stored along with the buffer */
- struct ixgbe_tx_buffer {
-diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c
-index b992304..522c03b 100644
---- a/drivers/net/ixgbe/ixgbe_82598.c
-+++ b/drivers/net/ixgbe/ixgbe_82598.c
-@@ -50,6 +50,51 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
- u8 *eeprom_data);
-
- /**
-+ * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
-+ * @hw: pointer to the HW structure
-+ *
-+ * The defaults for 82598 should be in the range of 50us to 50ms,
-+ * however the hardware default for these parts is 500us to 1ms which is less
-+ * than the 10ms recommended by the pci-e spec. To address this we need to
-+ * increase the value to either 10ms to 250ms for capability version 1 config,
-+ * or 16ms to 55ms for version 2.
-+ **/
-+void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
-+{
-+ struct ixgbe_adapter *adapter = hw->back;
-+ u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
-+ u16 pcie_devctl2;
-+
-+ /* only take action if timeout value is defaulted to 0 */
-+ if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
-+ goto out;
-+
-+ /*
-+ * if capababilities version is type 1 we can write the
-+ * timeout of 10ms to 250ms through the GCR register
-+ */
-+ if (!(gcr & IXGBE_GCR_CAP_VER2)) {
-+ gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
-+ goto out;
-+ }
-+
-+ /*
-+ * for version 2 capabilities we need to write the config space
-+ * directly in order to set the completion timeout value for
-+ * 16ms to 55ms
-+ */
-+ pci_read_config_word(adapter->pdev,
-+ IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2);
-+ pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
-+ pci_write_config_word(adapter->pdev,
-+ IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
-+out:
-+ /* disable completion timeout resend */
-+ gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
-+ IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
-+}
-+
-+/**
- * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count
- * @hw: pointer to hardware structure
- *
-@@ -153,6 +198,26 @@ out:
- }
-
- /**
-+ * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
-+ * @hw: pointer to hardware structure
-+ *
-+ * Starts the hardware using the generic start_hw function.
-+ * Then set pcie completion timeout
-+ **/
-+s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
-+{
-+ s32 ret_val = 0;
-+
-+ ret_val = ixgbe_start_hw_generic(hw);
-+
-+ /* set the completion timeout for interface */
-+ if (ret_val == 0)
-+ ixgbe_set_pcie_completion_timeout(hw);
-+
-+ return ret_val;
-+}
-+
-+/**
- * ixgbe_get_link_capabilities_82598 - Determines link capabilities
- * @hw: pointer to hardware structure
- * @speed: pointer to link speed
-@@ -1085,7 +1150,7 @@ out:
- static struct ixgbe_mac_operations mac_ops_82598 = {
- .init_hw = &ixgbe_init_hw_generic,
- .reset_hw = &ixgbe_reset_hw_82598,
-- .start_hw = &ixgbe_start_hw_generic,
-+ .start_hw = &ixgbe_start_hw_82598,
- .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic,
- .get_media_type = &ixgbe_get_media_type_82598,
- .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598,
-diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c
-index 2a97800..79144e9 100644
---- a/drivers/net/ixgbe/ixgbe_ethtool.c
-+++ b/drivers/net/ixgbe/ixgbe_ethtool.c
-@@ -1975,7 +1975,10 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
- * any other value means disable eitr, which is best
- * served by setting the interrupt rate very high
- */
-- adapter->eitr_param = IXGBE_MAX_INT_RATE;
-+ if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
-+ adapter->eitr_param = IXGBE_MAX_RSC_INT_RATE;
-+ else
-+ adapter->eitr_param = IXGBE_MAX_INT_RATE;
- adapter->itr_setting = 0;
- }
-
-@@ -1999,13 +2002,13 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data)
-
- ethtool_op_set_flags(netdev, data);
-
-- if (!(adapter->flags & IXGBE_FLAG2_RSC_CAPABLE))
-+ if (!(adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE))
- return 0;
-
- /* if state changes we need to update adapter->flags and reset */
- if ((!!(data & ETH_FLAG_LRO)) !=
-- (!!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED))) {
-- adapter->flags ^= IXGBE_FLAG2_RSC_ENABLED;
-+ (!!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED))) {
-+ adapter->flags2 ^= IXGBE_FLAG2_RSC_ENABLED;
- if (netif_running(netdev))
- ixgbe_reinit_locked(adapter);
- else
-diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
-index 200454f..110c65a 100644
---- a/drivers/net/ixgbe/ixgbe_main.c
-+++ b/drivers/net/ixgbe/ixgbe_main.c
-@@ -780,7 +780,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
- prefetch(next_rxd);
- cleaned_count++;
-
-- if (adapter->flags & IXGBE_FLAG2_RSC_CAPABLE)
-+ if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)
- rsc_count = ixgbe_get_rsc_count(rx_desc);
-
- if (rsc_count) {
-@@ -2036,7 +2036,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
- IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
- }
- } else {
-- if (!(adapter->flags & IXGBE_FLAG2_RSC_ENABLED) &&
-+ if (!(adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) &&
- (netdev->mtu <= ETH_DATA_LEN))
- rx_buf_len = MAXIMUM_ETHERNET_VLAN_SIZE;
- else
-@@ -2165,7 +2165,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
- IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
- }
-
-- if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED) {
-+ if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) {
- /* Enable 82599 HW-RSC */
- for (i = 0; i < adapter->num_rx_queues; i++) {
- j = adapter->rx_ring[i].reg_idx;
-@@ -3812,8 +3812,8 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
- adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598;
- } else if (hw->mac.type == ixgbe_mac_82599EB) {
- adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599;
-- adapter->flags |= IXGBE_FLAG2_RSC_CAPABLE;
-- adapter->flags |= IXGBE_FLAG2_RSC_ENABLED;
-+ adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE;
-+ adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
- adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
- adapter->ring_feature[RING_F_FDIR].indices =
- IXGBE_MAX_FDIR_INDICES;
-@@ -5360,12 +5360,19 @@ static int ixgbe_del_sanmac_netdev(struct net_device *dev)
- static void ixgbe_netpoll(struct net_device *netdev)
- {
- struct ixgbe_adapter *adapter = netdev_priv(netdev);
-+ int i;
-
-- disable_irq(adapter->pdev->irq);
- adapter->flags |= IXGBE_FLAG_IN_NETPOLL;
-- ixgbe_intr(adapter->pdev->irq, netdev);
-+ if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
-+ int num_q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
-+ for (i = 0; i < num_q_vectors; i++) {
-+ struct ixgbe_q_vector *q_vector = adapter->q_vector[i];
-+ ixgbe_msix_clean_many(0, q_vector);
-+ }
-+ } else {
-+ ixgbe_intr(adapter->pdev->irq, netdev);
-+ }
- adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL;
-- enable_irq(adapter->pdev->irq);
- }
- #endif
-
-@@ -5611,7 +5618,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
- if (pci_using_dac)
- netdev->features |= NETIF_F_HIGHDMA;
-
-- if (adapter->flags & IXGBE_FLAG2_RSC_ENABLED)
-+ if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
- netdev->features |= NETIF_F_LRO;
-
- /* make sure the EEPROM is good */
-diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h
-index fa87309..be90eb4 100644
---- a/drivers/net/ixgbe/ixgbe_type.h
-+++ b/drivers/net/ixgbe/ixgbe_type.h
-@@ -718,6 +718,12 @@
- #define IXGBE_ECC_STATUS_82599 0x110E0
- #define IXGBE_BAR_CTRL_82599 0x110F4
-
-+/* PCI Express Control */
-+#define IXGBE_GCR_CMPL_TMOUT_MASK 0x0000F000
-+#define IXGBE_GCR_CMPL_TMOUT_10ms 0x00001000
-+#define IXGBE_GCR_CMPL_TMOUT_RESEND 0x00010000
-+#define IXGBE_GCR_CAP_VER2 0x00040000
-+
- /* Time Sync Registers */
- #define IXGBE_TSYNCRXCTL 0x05188 /* Rx Time Sync Control register - RW */
- #define IXGBE_TSYNCTXCTL 0x08C00 /* Tx Time Sync Control register - RW */
-@@ -1521,6 +1527,7 @@
-
- /* PCI Bus Info */
- #define IXGBE_PCI_LINK_STATUS 0xB2
-+#define IXGBE_PCI_DEVICE_CONTROL2 0xC8
- #define IXGBE_PCI_LINK_WIDTH 0x3F0
- #define IXGBE_PCI_LINK_WIDTH_1 0x10
- #define IXGBE_PCI_LINK_WIDTH_2 0x20
-@@ -1531,6 +1538,7 @@
- #define IXGBE_PCI_LINK_SPEED_5000 0x2
- #define IXGBE_PCI_HEADER_TYPE_REGISTER 0x0E
- #define IXGBE_PCI_HEADER_TYPE_MULTIFUNC 0x80
-+#define IXGBE_PCI_DEVICE_CONTROL2_16ms 0x0005
-
- /* Number of 100 microseconds we wait for PCI Express master disable */
- #define IXGBE_PCI_MASTER_DISABLE_TIMEOUT 800
-diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c
-index 08c43f2..5a88b3f 100644
---- a/drivers/net/mlx4/en_tx.c
-+++ b/drivers/net/mlx4/en_tx.c
-@@ -249,6 +249,7 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
- pci_unmap_page(mdev->pdev,
- (dma_addr_t) be64_to_cpu(data->addr),
- frag->size, PCI_DMA_TODEVICE);
-+ ++data;
- }
- }
- /* Stamp the freed descriptor */
-diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
-index 637ac8b..3cd8cfc 100644
---- a/drivers/net/netxen/netxen_nic_main.c
-+++ b/drivers/net/netxen/netxen_nic_main.c
-@@ -221,7 +221,7 @@ netxen_napi_disable(struct netxen_adapter *adapter)
- }
- }
-
--static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
-+static int nx_set_dma_mask(struct netxen_adapter *adapter)
- {
- struct pci_dev *pdev = adapter->pdev;
- uint64_t mask, cmask;
-@@ -229,19 +229,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
- adapter->pci_using_dac = 0;
-
- mask = DMA_BIT_MASK(32);
-- /*
-- * Consistent DMA mask is set to 32 bit because it cannot be set to
-- * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
-- * come off this pool.
-- */
- cmask = DMA_BIT_MASK(32);
-
-+ if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
- #ifndef CONFIG_IA64
-- if (revision_id >= NX_P3_B0)
-- mask = DMA_BIT_MASK(39);
-- else if (revision_id == NX_P2_C1)
- mask = DMA_BIT_MASK(35);
- #endif
-+ } else {
-+ mask = DMA_BIT_MASK(39);
-+ cmask = mask;
-+ }
-+
- if (pci_set_dma_mask(pdev, mask) == 0 &&
- pci_set_consistent_dma_mask(pdev, cmask) == 0) {
- adapter->pci_using_dac = 1;
-@@ -256,7 +254,7 @@ static int
- nx_update_dma_mask(struct netxen_adapter *adapter)
- {
- int change, shift, err;
-- uint64_t mask, old_mask;
-+ uint64_t mask, old_mask, old_cmask;
- struct pci_dev *pdev = adapter->pdev;
-
- change = 0;
-@@ -272,14 +270,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter)
-
- if (change) {
- old_mask = pdev->dma_mask;
-+ old_cmask = pdev->dev.coherent_dma_mask;
-+
- mask = (1ULL<<(32+shift)) - 1;
-
- err = pci_set_dma_mask(pdev, mask);
- if (err)
-- return pci_set_dma_mask(pdev, old_mask);
-+ goto err_out;
-+
-+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
-+
-+ err = pci_set_consistent_dma_mask(pdev, mask);
-+ if (err)
-+ goto err_out;
-+ }
-+ dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
- }
-
- return 0;
-+
-+err_out:
-+ pci_set_dma_mask(pdev, old_mask);
-+ pci_set_consistent_dma_mask(pdev, old_cmask);
-+ return err;
- }
-
- static void netxen_check_options(struct netxen_adapter *adapter)
-@@ -1006,7 +1019,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
- revision_id = pdev->revision;
- adapter->ahw.revision_id = revision_id;
-
-- err = nx_set_dma_mask(adapter, revision_id);
-+ err = nx_set_dma_mask(adapter);
- if (err)
- goto err_out_free_netdev;
-
-diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c
-index 2836815..a646a44 100644
---- a/drivers/net/pcnet32.c
-+++ b/drivers/net/pcnet32.c
-@@ -1611,8 +1611,11 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
- if (pcnet32_dwio_read_csr(ioaddr, 0) == 4
- && pcnet32_dwio_check(ioaddr)) {
- a = &pcnet32_dwio;
-- } else
-+ } else {
-+ if (pcnet32_debug & NETIF_MSG_PROBE)
-+ printk(KERN_ERR PFX "No access methods\n");
- goto err_release_region;
-+ }
- }
-
- chip_version =
-@@ -1719,7 +1722,9 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
- ret = -ENOMEM;
- goto err_release_region;
- }
-- SET_NETDEV_DEV(dev, &pdev->dev);
-+
-+ if (pdev)
-+ SET_NETDEV_DEV(dev, &pdev->dev);
-
- if (pcnet32_debug & NETIF_MSG_PROBE)
- printk(KERN_INFO PFX "%s at %#3lx,", chipname, ioaddr);
-@@ -1818,7 +1823,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
-
- spin_lock_init(&lp->lock);
-
-- SET_NETDEV_DEV(dev, &pdev->dev);
- lp->name = chipname;
- lp->shared_irq = shared;
- lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */
-@@ -1852,12 +1856,6 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
- ((cards_found >= MAX_UNITS) || full_duplex[cards_found]))
- lp->options |= PCNET32_PORT_FD;
-
-- if (!a) {
-- if (pcnet32_debug & NETIF_MSG_PROBE)
-- printk(KERN_ERR PFX "No access methods\n");
-- ret = -ENODEV;
-- goto err_free_consistent;
-- }
- lp->a = *a;
-
- /* prior to register_netdev, dev->name is not yet correct */
-@@ -1973,14 +1971,13 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev)
-
- return 0;
-
-- err_free_ring:
-+err_free_ring:
- pcnet32_free_ring(dev);
-- err_free_consistent:
- pci_free_consistent(lp->pci_dev, sizeof(*lp->init_block),
- lp->init_block, lp->init_dma_addr);
-- err_free_netdev:
-+err_free_netdev:
- free_netdev(dev);
-- err_release_region:
-+err_release_region:
- release_region(ioaddr, PCNET32_TOTAL_SIZE);
- return ret;
- }
-@@ -2089,6 +2086,7 @@ static void pcnet32_free_ring(struct net_device *dev)
- static int pcnet32_open(struct net_device *dev)
- {
- struct pcnet32_private *lp = netdev_priv(dev);
-+ struct pci_dev *pdev = lp->pci_dev;
- unsigned long ioaddr = dev->base_addr;
- u16 val;
- int i;
-@@ -2149,9 +2147,9 @@ static int pcnet32_open(struct net_device *dev)
- lp->a.write_csr(ioaddr, 124, val);
-
- /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */
-- if (lp->pci_dev->subsystem_vendor == PCI_VENDOR_ID_AT &&
-- (lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX ||
-- lp->pci_dev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) {
-+ if (pdev && pdev->subsystem_vendor == PCI_VENDOR_ID_AT &&
-+ (pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX ||
-+ pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) {
- if (lp->options & PCNET32_PORT_ASEL) {
- lp->options = PCNET32_PORT_FD | PCNET32_PORT_100;
- if (netif_msg_link(lp))
-diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
-index 639d11b..cd37d73 100644
---- a/drivers/net/ppp_generic.c
-+++ b/drivers/net/ppp_generic.c
-@@ -1384,7 +1384,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
-
- /* create a fragment for each channel */
- bits = B;
-- while (nfree > 0 && len > 0) {
-+ while (len > 0) {
- list = list->next;
- if (list == &ppp->channels) {
- i = 0;
-@@ -1431,29 +1431,31 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
- *otherwise divide it according to the speed
- *of the channel we are going to transmit on
- */
-- if (pch->speed == 0) {
-- flen = totlen/nfree ;
-- if (nbigger > 0) {
-- flen++;
-- nbigger--;
-- }
-- } else {
-- flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) /
-- ((totspeed*totfree)/pch->speed)) - hdrlen;
-- if (nbigger > 0) {
-- flen += ((totfree - nzero)*pch->speed)/totspeed;
-- nbigger -= ((totfree - nzero)*pch->speed)/
-+ if (nfree > 0) {
-+ if (pch->speed == 0) {
-+ flen = totlen/nfree ;
-+ if (nbigger > 0) {
-+ flen++;
-+ nbigger--;
-+ }
-+ } else {
-+ flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) /
-+ ((totspeed*totfree)/pch->speed)) - hdrlen;
-+ if (nbigger > 0) {
-+ flen += ((totfree - nzero)*pch->speed)/totspeed;
-+ nbigger -= ((totfree - nzero)*pch->speed)/
- totspeed;
-+ }
- }
-+ nfree--;
- }
-- nfree--;
-
- /*
- *check if we are on the last channel or
- *we exceded the lenght of the data to
- *fragment
- */
-- if ((nfree == 0) || (flen > len))
-+ if ((nfree <= 0) || (flen > len))
- flen = len;
- /*
- *it is not worth to tx on slow channels:
-@@ -1467,7 +1469,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
- continue;
- }
-
-- mtu = pch->chan->mtu + 2 - hdrlen;
-+ mtu = pch->chan->mtu - hdrlen;
- if (mtu < 4)
- mtu = 4;
- if (flen > mtu)
-diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c
-index f0031f1..5f20902 100644
---- a/drivers/net/pppoe.c
-+++ b/drivers/net/pppoe.c
-@@ -1063,6 +1063,7 @@ static void *pppoe_seq_next(struct seq_file *seq, void *v, loff_t *pos)
- else {
- int hash = hash_item(po->pppoe_pa.sid, po->pppoe_pa.remote);
-
-+ po = NULL;
- while (++hash < PPPOE_HASH_SIZE) {
- po = pn->hash_table[hash];
- if (po)
-diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
-index e7935d0..e0f9219 100644
---- a/drivers/net/pppol2tp.c
-+++ b/drivers/net/pppol2tp.c
-@@ -2680,6 +2680,7 @@ out_unregister_pppol2tp_proto:
- static void __exit pppol2tp_exit(void)
- {
- unregister_pppox_proto(PX_PROTO_OL2TP);
-+ unregister_pernet_gen_device(pppol2tp_net_id, &pppol2tp_net_ops);
- proto_unregister(&pppol2tp_sk_proto);
- }
-
-diff --git a/drivers/net/s6gmac.c b/drivers/net/s6gmac.c
-index 5345e47..4525cbe 100644
---- a/drivers/net/s6gmac.c
-+++ b/drivers/net/s6gmac.c
-@@ -793,7 +793,7 @@ static inline int s6gmac_phy_start(struct net_device *dev)
- struct s6gmac *pd = netdev_priv(dev);
- int i = 0;
- struct phy_device *p = NULL;
-- while ((!(p = pd->mii.bus->phy_map[i])) && (i < PHY_MAX_ADDR))
-+ while ((i < PHY_MAX_ADDR) && (!(p = pd->mii.bus->phy_map[i])))
- i++;
- p = phy_connect(dev, dev_name(&p->dev), &s6gmac_adjust_link, 0,
- PHY_INTERFACE_MODE_RGMII);
-diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
-index 3550c5d..0a551d8 100644
---- a/drivers/net/sky2.c
-+++ b/drivers/net/sky2.c
-@@ -1488,6 +1488,8 @@ static int sky2_up(struct net_device *dev)
- sky2_set_vlan_mode(hw, port, sky2->vlgrp != NULL);
- #endif
-
-+ sky2->restarting = 0;
-+
- err = sky2_rx_start(sky2);
- if (err)
- goto err_out;
-@@ -1500,6 +1502,9 @@ static int sky2_up(struct net_device *dev)
-
- sky2_set_multicast(dev);
-
-+ /* wake queue incase we are restarting */
-+ netif_wake_queue(dev);
-+
- if (netif_msg_ifup(sky2))
- printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
- return 0;
-@@ -1533,6 +1538,8 @@ static inline int tx_dist(unsigned tail, unsigned head)
- /* Number of list elements available for next tx */
- static inline int tx_avail(const struct sky2_port *sky2)
- {
-+ if (unlikely(sky2->restarting))
-+ return 0;
- return sky2->tx_pending - tx_dist(sky2->tx_cons, sky2->tx_prod);
- }
-
-@@ -1818,6 +1825,10 @@ static int sky2_down(struct net_device *dev)
- if (netif_msg_ifdown(sky2))
- printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);
-
-+ /* explicitly shut off tx incase we're restarting */
-+ sky2->restarting = 1;
-+ netif_tx_disable(dev);
-+
- /* Force flow control off */
- sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF);
-
-@@ -2359,7 +2370,7 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last)
- {
- struct sky2_port *sky2 = netdev_priv(dev);
-
-- if (netif_running(dev)) {
-+ if (likely(netif_running(dev) && !sky2->restarting)) {
- netif_tx_lock(dev);
- sky2_tx_complete(sky2, last);
- netif_tx_unlock(dev);
-@@ -4283,6 +4294,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
- spin_lock_init(&sky2->phy_lock);
- sky2->tx_pending = TX_DEF_PENDING;
- sky2->rx_pending = RX_DEF_PENDING;
-+ sky2->restarting = 0;
-
- hw->dev[port] = dev;
-
-diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
-index b5549c9..4486b06 100644
---- a/drivers/net/sky2.h
-+++ b/drivers/net/sky2.h
-@@ -2051,6 +2051,7 @@ struct sky2_port {
- u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */
- u8 rx_csum;
- u8 wol;
-+ u8 restarting;
- enum flow_control flow_mode;
- enum flow_control flow_status;
-
-diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c
-index eb72d2e..acfdccd 100644
---- a/drivers/net/tulip/de4x5.c
-+++ b/drivers/net/tulip/de4x5.c
-@@ -5059,7 +5059,7 @@ mii_get_phy(struct net_device *dev)
- if ((id == 0) || (id == 65535)) continue; /* Valid ID? */
- for (j=0; j<limit; j++) { /* Search PHY table */
- if (id != phy_info[j].id) continue; /* ID match? */
-- for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
-+ for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
- if (k < DE4X5_MAX_PHY) {
- memcpy((char *)&lp->phy[k],
- (char *)&phy_info[j], sizeof(struct phy_table));
-@@ -5072,7 +5072,7 @@ mii_get_phy(struct net_device *dev)
- break;
- }
- if ((j == limit) && (i < DE4X5_MAX_MII)) {
-- for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++);
-+ for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++);
- lp->phy[k].addr = i;
- lp->phy[k].id = id;
- lp->phy[k].spd.reg = GENERIC_REG; /* ANLPA register */
-@@ -5091,7 +5091,7 @@ mii_get_phy(struct net_device *dev)
- purgatory:
- lp->active = 0;
- if (lp->phy[0].id) { /* Reset the PHY devices */
-- for (k=0; lp->phy[k].id && (k < DE4X5_MAX_PHY); k++) { /*For each PHY*/
-+ for (k=0; k < DE4X5_MAX_PHY && lp->phy[k].id; k++) { /*For each PHY*/
- mii_wr(MII_CR_RST, MII_CR, lp->phy[k].addr, DE4X5_MII);
- while (mii_rd(MII_CR, lp->phy[k].addr, DE4X5_MII) & MII_CR_RST);
-
-diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
-index c70604f..8ce5e4c 100644
---- a/drivers/net/wireless/airo.c
-+++ b/drivers/net/wireless/airo.c
-@@ -5918,20 +5918,19 @@ static int airo_set_essid(struct net_device *dev,
- readSsidRid(local, &SSID_rid);
-
- /* Check if we asked for `any' */
-- if(dwrq->flags == 0) {
-+ if (dwrq->flags == 0) {
- /* Just send an empty SSID list */
- memset(&SSID_rid, 0, sizeof(SSID_rid));
- } else {
-- int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-+ unsigned index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-
- /* Check the size of the string */
-- if(dwrq->length > IW_ESSID_MAX_SIZE) {
-+ if (dwrq->length > IW_ESSID_MAX_SIZE)
- return -E2BIG ;
-- }
-+
- /* Check if index is valid */
-- if((index < 0) || (index >= 4)) {
-+ if (index >= ARRAY_SIZE(SSID_rid.ssids))
- return -EINVAL;
-- }
-
- /* Set the SSID */
- memset(SSID_rid.ssids[index].ssid, 0,
-@@ -6819,7 +6818,7 @@ static int airo_set_txpow(struct net_device *dev,
- return -EINVAL;
- }
- clear_bit (FLAG_RADIO_OFF, &local->flags);
-- for (i = 0; cap_rid.txPowerLevels[i] && (i < 8); i++)
-+ for (i = 0; i < 8 && cap_rid.txPowerLevels[i]; i++)
- if (v == cap_rid.txPowerLevels[i]) {
- readConfigRid(local, 1);
- local->config.txPower = v;
-diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c
-index a2fda70..ce0e86c 100644
---- a/drivers/net/wireless/ath/ath9k/eeprom.c
-+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
-@@ -460,7 +460,7 @@ static int ath9k_hw_4k_check_eeprom(struct ath_hw *ah)
- integer = swab32(eep->modalHeader.antCtrlCommon);
- eep->modalHeader.antCtrlCommon = integer;
-
-- for (i = 0; i < AR5416_MAX_CHAINS; i++) {
-+ for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) {
- integer = swab32(eep->modalHeader.antCtrlChain[i]);
- eep->modalHeader.antCtrlChain[i] = integer;
- }
-@@ -914,7 +914,7 @@ static void ath9k_hw_set_4k_power_per_rate_table(struct ath_hw *ah,
- ctlMode, numCtlModes, isHt40CtlMode,
- (pCtlMode[ctlMode] & EXT_ADDITIVE));
-
-- for (i = 0; (i < AR5416_NUM_CTLS) &&
-+ for (i = 0; (i < AR5416_EEP4K_NUM_CTLS) &&
- pEepData->ctlIndex[i]; i++) {
- DPRINTF(ah->ah_sc, ATH_DBG_EEPROM,
- " LOOP-Ctlidx %d: cfgCtl 0x%2.2x "
-diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h
-index fbb3a57..2de6471 100644
---- a/drivers/net/wireless/iwlwifi/iwl-3945.h
-+++ b/drivers/net/wireless/iwlwifi/iwl-3945.h
-@@ -112,7 +112,7 @@ enum iwl3945_antenna {
- #define IWL_TX_FIFO_NONE 7
-
- /* Minimum number of queues. MAX_NUM is defined in hw specific files */
--#define IWL_MIN_NUM_QUEUES 4
-+#define IWL39_MIN_NUM_QUEUES 4
-
- #define IEEE80211_DATA_LEN 2304
- #define IEEE80211_4ADDR_LEN 30
-diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
-index 6ab0716..18b135f 100644
---- a/drivers/net/wireless/iwlwifi/iwl-core.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
-@@ -1332,6 +1332,9 @@ int iwl_setup_mac(struct iwl_priv *priv)
-
- hw->wiphy->custom_regulatory = true;
-
-+ /* Firmware does not support this */
-+ hw->wiphy->disable_beacon_hints = true;
-+
- hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
- /* we create the 802.11 header and a zero-length SSID element */
- hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2;
-diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
-index 11e08c0..ca00cc8 100644
---- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
-@@ -308,18 +308,18 @@ static ssize_t iwl_dbgfs_nvm_read(struct file *file,
- return -ENODATA;
- }
-
-+ ptr = priv->eeprom;
-+ if (!ptr) {
-+ IWL_ERR(priv, "Invalid EEPROM/OTP memory\n");
-+ return -ENOMEM;
-+ }
-+
- /* 4 characters for byte 0xYY */
- buf = kzalloc(buf_size, GFP_KERNEL);
- if (!buf) {
- IWL_ERR(priv, "Can not allocate Buffer\n");
- return -ENOMEM;
- }
--
-- ptr = priv->eeprom;
-- if (!ptr) {
-- IWL_ERR(priv, "Invalid EEPROM/OTP memory\n");
-- return -ENOMEM;
-- }
- pos += scnprintf(buf + pos, buf_size - pos, "NVM Type: %s\n",
- (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP)
- ? "OTP" : "EEPROM");
-diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
-index e2d620f..650e20a 100644
---- a/drivers/net/wireless/iwlwifi/iwl-dev.h
-+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
-@@ -258,8 +258,10 @@ struct iwl_channel_info {
- #define IWL_TX_FIFO_HCCA_2 6
- #define IWL_TX_FIFO_NONE 7
-
--/* Minimum number of queues. MAX_NUM is defined in hw specific files */
--#define IWL_MIN_NUM_QUEUES 4
-+/* Minimum number of queues. MAX_NUM is defined in hw specific files.
-+ * Set the minimum to accommodate the 4 standard TX queues, 1 command
-+ * queue, 2 (unused) HCCA queues, and 4 HT queues (one for each AC) */
-+#define IWL_MIN_NUM_QUEUES 10
-
- /* Power management (not Tx power) structures */
-
-diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
-index 2addf73..ffd5c61 100644
---- a/drivers/net/wireless/iwlwifi/iwl-sta.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
-@@ -566,6 +566,8 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,
- unsigned long flags;
-
- spin_lock_irqsave(&priv->sta_lock, flags);
-+ IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n",
-+ keyconf->keyidx);
-
- if (!test_and_clear_bit(keyconf->keyidx, &priv->ucode_key_table))
- IWL_ERR(priv, "index %d not used in uCode key table.\n",
-@@ -573,6 +575,11 @@ int iwl_remove_default_wep_key(struct iwl_priv *priv,
-
- priv->default_wep_key--;
- memset(&priv->wep_keys[keyconf->keyidx], 0, sizeof(priv->wep_keys[0]));
-+ if (iwl_is_rfkill(priv)) {
-+ IWL_DEBUG_WEP(priv, "Not sending REPLY_WEPKEY command due to RFKILL.\n");
-+ spin_unlock_irqrestore(&priv->sta_lock, flags);
-+ return 0;
-+ }
- ret = iwl_send_static_wepkey_cmd(priv, 1);
- IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n",
- keyconf->keyidx, ret);
-@@ -853,6 +860,11 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
- priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
- priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
-
-+ if (iwl_is_rfkill(priv)) {
-+ IWL_DEBUG_WEP(priv, "Not sending REPLY_ADD_STA command because RFKILL enabled. \n");
-+ spin_unlock_irqrestore(&priv->sta_lock, flags);
-+ return 0;
-+ }
- ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
- spin_unlock_irqrestore(&priv->sta_lock, flags);
- return ret;
-diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
-index 9bbeec9..2e89040 100644
---- a/drivers/net/wireless/iwlwifi/iwl-tx.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
-@@ -720,8 +720,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
- goto drop_unlock;
- }
-
-- spin_unlock_irqrestore(&priv->lock, flags);
--
- hdr_len = ieee80211_hdrlen(fc);
-
- /* Find (or create) index into station table for destination station */
-@@ -729,7 +727,7 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
- if (sta_id == IWL_INVALID_STATION) {
- IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
- hdr->addr1);
-- goto drop;
-+ goto drop_unlock;
- }
-
- IWL_DEBUG_TX(priv, "station Id %d\n", sta_id);
-@@ -750,14 +748,17 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
- txq_id = priv->stations[sta_id].tid[tid].agg.txq_id;
- swq_id = iwl_virtual_agg_queue_num(swq_id, txq_id);
- }
-- priv->stations[sta_id].tid[tid].tfds_in_queue++;
- }
-
- txq = &priv->txq[txq_id];
- q = &txq->q;
- txq->swq_id = swq_id;
-
-- spin_lock_irqsave(&priv->lock, flags);
-+ if (unlikely(iwl_queue_space(q) < q->high_mark))
-+ goto drop_unlock;
-+
-+ if (ieee80211_is_data_qos(fc))
-+ priv->stations[sta_id].tid[tid].tfds_in_queue++;
-
- /* Set up driver data for this TFD */
- memset(&(txq->txb[q->write_ptr]), 0, sizeof(struct iwl_tx_info));
-@@ -902,7 +903,6 @@ int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb)
-
- drop_unlock:
- spin_unlock_irqrestore(&priv->lock, flags);
--drop:
- return -1;
- }
- EXPORT_SYMBOL(iwl_tx_skb);
-@@ -1171,6 +1171,8 @@ int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
- IWL_ERR(priv, "Start AGG on invalid station\n");
- return -ENXIO;
- }
-+ if (unlikely(tid >= MAX_TID_COUNT))
-+ return -EINVAL;
-
- if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_OFF) {
- IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n");
-diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
-index 956798f..5238433 100644
---- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
-+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
-@@ -3968,6 +3968,9 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
-
- hw->wiphy->custom_regulatory = true;
-
-+ /* Firmware does not support this */
-+ hw->wiphy->disable_beacon_hints = true;
-+
- hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX_3945;
- /* we create the 802.11 header and a zero-length SSID element */
- hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2;
-@@ -4018,10 +4021,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
- SET_IEEE80211_DEV(hw, &pdev->dev);
-
- if ((iwl3945_mod_params.num_of_queues > IWL39_MAX_NUM_QUEUES) ||
-- (iwl3945_mod_params.num_of_queues < IWL_MIN_NUM_QUEUES)) {
-+ (iwl3945_mod_params.num_of_queues < IWL39_MIN_NUM_QUEUES)) {
- IWL_ERR(priv,
- "invalid queues_num, should be between %d and %d\n",
-- IWL_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES);
-+ IWL39_MIN_NUM_QUEUES, IWL39_MAX_NUM_QUEUES);
- err = -EINVAL;
- goto out_ieee80211_free_hw;
- }
-diff --git a/drivers/net/wireless/iwmc3200wifi/commands.c b/drivers/net/wireless/iwmc3200wifi/commands.c
-index 834a7f5..e2334d1 100644
---- a/drivers/net/wireless/iwmc3200wifi/commands.c
-+++ b/drivers/net/wireless/iwmc3200wifi/commands.c
-@@ -220,6 +220,7 @@ int iwm_store_rxiq_calib_result(struct iwm_priv *iwm)
- eeprom_rxiq = iwm_eeprom_access(iwm, IWM_EEPROM_CALIB_RXIQ);
- if (IS_ERR(eeprom_rxiq)) {
- IWM_ERR(iwm, "Couldn't access EEPROM RX IQ entry\n");
-+ kfree(rxiq);
- return PTR_ERR(eeprom_rxiq);
- }
-
-diff --git a/drivers/net/wireless/iwmc3200wifi/netdev.c b/drivers/net/wireless/iwmc3200wifi/netdev.c
-index aea5ccf..bf294e4 100644
---- a/drivers/net/wireless/iwmc3200wifi/netdev.c
-+++ b/drivers/net/wireless/iwmc3200wifi/netdev.c
-@@ -106,10 +106,8 @@ void *iwm_if_alloc(int sizeof_bus, struct device *dev,
- int ret = 0;
-
- wdev = iwm_wdev_alloc(sizeof_bus, dev);
-- if (!wdev) {
-- dev_err(dev, "no memory for wireless device instance\n");
-- return ERR_PTR(-ENOMEM);
-- }
-+ if (IS_ERR(wdev))
-+ return wdev;
-
- iwm = wdev_to_iwm(wdev);
- iwm->bus_ops = if_ops;
-diff --git a/drivers/net/wireless/libertas/11d.c b/drivers/net/wireless/libertas/11d.c
-index 9a5408e..5c69681 100644
---- a/drivers/net/wireless/libertas/11d.c
-+++ b/drivers/net/wireless/libertas/11d.c
-@@ -47,7 +47,7 @@ static u8 lbs_region_2_code(u8 *region)
- {
- u8 i;
-
-- for (i = 0; region[i] && i < COUNTRY_CODE_LEN; i++)
-+ for (i = 0; i < COUNTRY_CODE_LEN && region[i]; i++)
- region[i] = toupper(region[i]);
-
- for (i = 0; i < ARRAY_SIZE(region_code_mapping); i++) {
-diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c
-index b9b3741..d699737 100644
---- a/drivers/net/wireless/libertas/assoc.c
-+++ b/drivers/net/wireless/libertas/assoc.c
-@@ -1,6 +1,7 @@
- /* Copyright (C) 2006, Red Hat, Inc. */
-
- #include <linux/types.h>
-+#include <linux/kernel.h>
- #include <linux/etherdevice.h>
- #include <linux/ieee80211.h>
- #include <linux/if_arp.h>
-@@ -43,21 +44,21 @@ static int get_common_rates(struct lbs_private *priv,
- u16 *rates_size)
- {
- u8 *card_rates = lbs_bg_rates;
-- size_t num_card_rates = sizeof(lbs_bg_rates);
- int ret = 0, i, j;
-- u8 tmp[30];
-+ u8 tmp[(ARRAY_SIZE(lbs_bg_rates) - 1) * (*rates_size - 1)];
- size_t tmp_size = 0;
-
- /* For each rate in card_rates that exists in rate1, copy to tmp */
-- for (i = 0; card_rates[i] && (i < num_card_rates); i++) {
-- for (j = 0; rates[j] && (j < *rates_size); j++) {
-+ for (i = 0; i < ARRAY_SIZE(lbs_bg_rates) && card_rates[i]; i++) {
-+ for (j = 0; j < *rates_size && rates[j]; j++) {
- if (rates[j] == card_rates[i])
- tmp[tmp_size++] = card_rates[i];
- }
- }
-
- lbs_deb_hex(LBS_DEB_JOIN, "AP rates ", rates, *rates_size);
-- lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates, num_card_rates);
-+ lbs_deb_hex(LBS_DEB_JOIN, "card rates ", card_rates,
-+ ARRAY_SIZE(lbs_bg_rates));
- lbs_deb_hex(LBS_DEB_JOIN, "common rates", tmp, tmp_size);
- lbs_deb_join("TX data rate 0x%02x\n", priv->cur_rate);
-
-@@ -69,10 +70,7 @@ static int get_common_rates(struct lbs_private *priv,
- lbs_pr_alert("Previously set fixed data rate %#x isn't "
- "compatible with the network.\n", priv->cur_rate);
- ret = -1;
-- goto done;
- }
-- ret = 0;
--
- done:
- memset(rates, 0, *rates_size);
- *rates_size = min_t(int, tmp_size, *rates_size);
-@@ -322,7 +320,7 @@ static int lbs_associate(struct lbs_private *priv,
- rates = (struct mrvl_ie_rates_param_set *) pos;
- rates->header.type = cpu_to_le16(TLV_TYPE_RATES);
- memcpy(&rates->rates, &bss->rates, MAX_RATES);
-- tmplen = MAX_RATES;
-+ tmplen = min_t(u16, ARRAY_SIZE(rates->rates), MAX_RATES);
- if (get_common_rates(priv, rates->rates, &tmplen)) {
- ret = -1;
- goto done;
-@@ -598,7 +596,7 @@ static int lbs_adhoc_join(struct lbs_private *priv,
-
- /* Copy Data rates from the rates recorded in scan response */
- memset(cmd.bss.rates, 0, sizeof(cmd.bss.rates));
-- ratesize = min_t(u16, sizeof(cmd.bss.rates), MAX_RATES);
-+ ratesize = min_t(u16, ARRAY_SIZE(cmd.bss.rates), MAX_RATES);
- memcpy(cmd.bss.rates, bss->rates, ratesize);
- if (get_common_rates(priv, cmd.bss.rates, &ratesize)) {
- lbs_deb_join("ADHOC_JOIN: get_common_rates returned error.\n");
-diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
-index 601b542..6c95af3 100644
---- a/drivers/net/wireless/libertas/scan.c
-+++ b/drivers/net/wireless/libertas/scan.c
-@@ -5,6 +5,7 @@
- * for sending scan commands to the firmware.
- */
- #include <linux/types.h>
-+#include <linux/kernel.h>
- #include <linux/etherdevice.h>
- #include <linux/if_arp.h>
- #include <asm/unaligned.h>
-@@ -876,7 +877,7 @@ static inline char *lbs_translate_scan(struct lbs_private *priv,
- iwe.u.bitrate.disabled = 0;
- iwe.u.bitrate.value = 0;
-
-- for (j = 0; bss->rates[j] && (j < sizeof(bss->rates)); j++) {
-+ for (j = 0; j < ARRAY_SIZE(bss->rates) && bss->rates[j]; j++) {
- /* Bit rate given in 500 kb/s units */
- iwe.u.bitrate.value = bss->rates[j] * 500000;
- current_val = iwe_stream_add_value(info, start, current_val,
-diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c
-index 40b07b9..3bd3c77 100644
---- a/drivers/net/wireless/zd1211rw/zd_mac.c
-+++ b/drivers/net/wireless/zd1211rw/zd_mac.c
-@@ -698,7 +698,7 @@ int zd_mac_rx(struct ieee80211_hw *hw, const u8 *buffer, unsigned int length)
- && !mac->pass_ctrl)
- return 0;
-
-- fc = *(__le16 *)buffer;
-+ fc = get_unaligned((__le16*)buffer);
- need_padding = ieee80211_is_data_qos(fc) ^ ieee80211_has_a4(fc);
-
- skb = dev_alloc_skb(length + (need_padding ? 2 : 0));
-diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c
-index 0f0e0b9..a45b0c0 100644
---- a/drivers/parisc/ccio-dma.c
-+++ b/drivers/parisc/ccio-dma.c
-@@ -70,7 +70,6 @@
- #undef CCIO_COLLECT_STATS
- #endif
-
--#include <linux/proc_fs.h>
- #include <asm/runway.h> /* for proc_runway_root */
-
- #ifdef DEBUG_CCIO_INIT
-diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c
-index c590974..d69bde6 100644
---- a/drivers/parisc/dino.c
-+++ b/drivers/parisc/dino.c
-@@ -614,7 +614,7 @@ dino_fixup_bus(struct pci_bus *bus)
- dev_name(&bus->self->dev), i,
- bus->self->resource[i].start,
- bus->self->resource[i].end);
-- pci_assign_resource(bus->self, i);
-+ WARN_ON(pci_assign_resource(bus->self, i));
- DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n",
- dev_name(&bus->self->dev), i,
- bus->self->resource[i].start,
-diff --git a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c
-index 685d94e..8c0b26e 100644
---- a/drivers/parisc/eisa_eeprom.c
-+++ b/drivers/parisc/eisa_eeprom.c
-@@ -55,7 +55,7 @@ static ssize_t eisa_eeprom_read(struct file * file,
- ssize_t ret;
- int i;
-
-- if (*ppos >= HPEE_MAX_LENGTH)
-+ if (*ppos < 0 || *ppos >= HPEE_MAX_LENGTH)
- return 0;
-
- count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
-diff --git a/drivers/parisc/hppb.c b/drivers/parisc/hppb.c
-index 1385641..815db17 100644
---- a/drivers/parisc/hppb.c
-+++ b/drivers/parisc/hppb.c
-@@ -62,7 +62,8 @@ static int hppb_probe(struct parisc_device *dev)
- }
- card = card->next;
- }
-- printk(KERN_INFO "Found GeckoBoa at 0x%x\n", dev->hpa.start);
-+ printk(KERN_INFO "Found GeckoBoa at 0x%llx\n",
-+ (unsigned long long) dev->hpa.start);
-
- card->hpa = dev->hpa.start;
- card->mmio_region.name = "HP-PB Bus";
-@@ -73,8 +74,10 @@ static int hppb_probe(struct parisc_device *dev)
-
- status = ccio_request_resource(dev, &card->mmio_region);
- if(status < 0) {
-- printk(KERN_ERR "%s: failed to claim HP-PB bus space (%08x, %08x)\n",
-- __FILE__, card->mmio_region.start, card->mmio_region.end);
-+ printk(KERN_ERR "%s: failed to claim HP-PB "
-+ "bus space (0x%08llx, 0x%08llx)\n",
-+ __FILE__, (unsigned long long) card->mmio_region.start,
-+ (unsigned long long) card->mmio_region.end);
- }
-
- return 0;
-diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c
-index ede6146..3aeb327 100644
---- a/drivers/parisc/lba_pci.c
-+++ b/drivers/parisc/lba_pci.c
-@@ -992,7 +992,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
- return;
-
- io_pdc_cell = kzalloc(sizeof(pdc_pat_cell_mod_maddr_block_t), GFP_KERNEL);
-- if (!pa_pdc_cell) {
-+ if (!io_pdc_cell) {
- kfree(pa_pdc_cell);
- return;
- }
-diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c
-index f9f9a5f..13a64bc 100644
---- a/drivers/parisc/pdc_stable.c
-+++ b/drivers/parisc/pdc_stable.c
-@@ -370,7 +370,7 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf)
- if (!i) /* entry is not ready */
- return -ENODATA;
-
-- for (i = 0; devpath->layers[i] && (likely(i < 6)); i++)
-+ for (i = 0; i < 6 && devpath->layers[i]; i++)
- out += sprintf(out, "%u ", devpath->layers[i]);
-
- out += sprintf(out, "\n");
-diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
-index b711fb7..1898c7b 100644
---- a/drivers/pci/setup-res.c
-+++ b/drivers/pci/setup-res.c
-@@ -100,16 +100,16 @@ int pci_claim_resource(struct pci_dev *dev, int resource)
- {
- struct resource *res = &dev->resource[resource];
- struct resource *root;
-- char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge";
- int err;
-
- root = pci_find_parent_resource(dev, res);
-
- err = -EINVAL;
- if (root != NULL)
-- err = insert_resource(root, res);
-+ err = request_resource(root, res);
-
- if (err) {
-+ const char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge";
- dev_err(&dev->dev, "BAR %d: %s of %s %pR\n",
- resource,
- root ? "address space collision on" :
-diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
-index 46dad12..77c6097 100644
---- a/drivers/platform/x86/Kconfig
-+++ b/drivers/platform/x86/Kconfig
-@@ -277,31 +277,6 @@ config THINKPAD_ACPI_UNSAFE_LEDS
- Say N here, unless you are building a kernel for your own
- use, and need to control the important firmware LEDs.
-
--config THINKPAD_ACPI_DOCK
-- bool "Legacy Docking Station Support"
-- depends on THINKPAD_ACPI
-- depends on ACPI_DOCK=n
-- default n
-- ---help---
-- Allows the thinkpad_acpi driver to handle docking station events.
-- This support was made obsolete by the generic ACPI docking station
-- support (CONFIG_ACPI_DOCK). It will allow locking and removing the
-- laptop from the docking station, but will not properly connect PCI
-- devices.
--
-- If you are not sure, say N here.
--
--config THINKPAD_ACPI_BAY
-- bool "Legacy Removable Bay Support"
-- depends on THINKPAD_ACPI
-- default y
-- ---help---
-- Allows the thinkpad_acpi driver to handle removable bays. It will
-- electrically disable the device in the bay, and also generate
-- notifications when the bay lever is ejected or inserted.
--
-- If you are not sure, say Y here.
--
- config THINKPAD_ACPI_VIDEO
- bool "Video output control support"
- depends on THINKPAD_ACPI
-diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
-index ec560f1..222ffb8 100644
---- a/drivers/platform/x86/eeepc-laptop.c
-+++ b/drivers/platform/x86/eeepc-laptop.c
-@@ -143,6 +143,7 @@ struct eeepc_hotk {
- struct rfkill *bluetooth_rfkill;
- struct rfkill *wwan3g_rfkill;
- struct hotplug_slot *hotplug_slot;
-+ struct work_struct hotplug_work;
- };
-
- /* The actual device the driver binds to */
-@@ -660,7 +661,7 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot,
- return 0;
- }
-
--static void eeepc_rfkill_hotplug(void)
-+static void eeepc_hotplug_work(struct work_struct *work)
- {
- struct pci_dev *dev;
- struct pci_bus *bus = pci_find_bus(0, 1);
-@@ -701,7 +702,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
- if (event != ACPI_NOTIFY_BUS_CHECK)
- return;
-
-- eeepc_rfkill_hotplug();
-+ schedule_work(&ehotk->hotplug_work);
- }
-
- static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
-@@ -892,7 +893,7 @@ static int eeepc_hotk_resume(struct acpi_device *device)
-
- rfkill_set_sw_state(ehotk->wlan_rfkill, wlan != 1);
-
-- eeepc_rfkill_hotplug();
-+ schedule_work(&ehotk->hotplug_work);
- }
-
- if (ehotk->bluetooth_rfkill)
-@@ -1093,6 +1094,8 @@ static int eeepc_rfkill_init(struct device *dev)
- {
- int result = 0;
-
-+ INIT_WORK(&ehotk->hotplug_work, eeepc_hotplug_work);
-+
- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P6");
- eeepc_register_rfkill_notifier("\\_SB.PCI0.P0P7");
-
-diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
-index ca50856..a2ad53e 100644
---- a/drivers/platform/x86/hp-wmi.c
-+++ b/drivers/platform/x86/hp-wmi.c
-@@ -520,11 +520,13 @@ static int hp_wmi_resume_handler(struct platform_device *device)
- * the input layer will only actually pass it on if the state
- * changed.
- */
--
-- input_report_switch(hp_wmi_input_dev, SW_DOCK, hp_wmi_dock_state());
-- input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
-- hp_wmi_tablet_state());
-- input_sync(hp_wmi_input_dev);
-+ if (hp_wmi_input_dev) {
-+ input_report_switch(hp_wmi_input_dev, SW_DOCK,
-+ hp_wmi_dock_state());
-+ input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE,
-+ hp_wmi_tablet_state());
-+ input_sync(hp_wmi_input_dev);
-+ }
-
- return 0;
- }
-diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
-index a463fd7..e856008 100644
---- a/drivers/platform/x86/thinkpad_acpi.c
-+++ b/drivers/platform/x86/thinkpad_acpi.c
-@@ -239,12 +239,6 @@ struct ibm_init_struct {
- };
-
- static struct {
--#ifdef CONFIG_THINKPAD_ACPI_BAY
-- u32 bay_status:1;
-- u32 bay_eject:1;
-- u32 bay_status2:1;
-- u32 bay_eject2:1;
--#endif
- u32 bluetooth:1;
- u32 hotkey:1;
- u32 hotkey_mask:1;
-@@ -589,18 +583,6 @@ static int acpi_ec_write(int i, u8 v)
- return 1;
- }
-
--#if defined(CONFIG_THINKPAD_ACPI_DOCK) || defined(CONFIG_THINKPAD_ACPI_BAY)
--static int _sta(acpi_handle handle)
--{
-- int status;
--
-- if (!handle || !acpi_evalf(handle, &status, "_STA", "d"))
-- status = 0;
--
-- return status;
--}
--#endif
--
- static int issue_thinkpad_cmos_command(int cmos_cmd)
- {
- if (!cmos_handle)
-@@ -784,6 +766,8 @@ static int dispatch_procfs_write(struct file *file,
-
- if (!ibm || !ibm->write)
- return -EINVAL;
-+ if (count > PAGE_SIZE - 2)
-+ return -EINVAL;
-
- kernbuf = kmalloc(count + 2, GFP_KERNEL);
- if (!kernbuf)
-@@ -4442,293 +4426,6 @@ static struct ibm_struct light_driver_data = {
- };
-
- /*************************************************************************
-- * Dock subdriver
-- */
--
--#ifdef CONFIG_THINKPAD_ACPI_DOCK
--
--static void dock_notify(struct ibm_struct *ibm, u32 event);
--static int dock_read(char *p);
--static int dock_write(char *buf);
--
--TPACPI_HANDLE(dock, root, "\\_SB.GDCK", /* X30, X31, X40 */
-- "\\_SB.PCI0.DOCK", /* 600e/x,770e,770x,A2xm/p,T20-22,X20-21 */
-- "\\_SB.PCI0.PCI1.DOCK", /* all others */
-- "\\_SB.PCI.ISA.SLCE", /* 570 */
-- ); /* A21e,G4x,R30,R31,R32,R40,R40e,R50e */
--
--/* don't list other alternatives as we install a notify handler on the 570 */
--TPACPI_HANDLE(pci, root, "\\_SB.PCI"); /* 570 */
--
--static const struct acpi_device_id ibm_pci_device_ids[] = {
-- {PCI_ROOT_HID_STRING, 0},
-- {"", 0},
--};
--
--static struct tp_acpi_drv_struct ibm_dock_acpidriver[2] = {
-- {
-- .notify = dock_notify,
-- .handle = &dock_handle,
-- .type = ACPI_SYSTEM_NOTIFY,
-- },
-- {
-- /* THIS ONE MUST NEVER BE USED FOR DRIVER AUTOLOADING.
-- * We just use it to get notifications of dock hotplug
-- * in very old thinkpads */
-- .hid = ibm_pci_device_ids,
-- .notify = dock_notify,
-- .handle = &pci_handle,
-- .type = ACPI_SYSTEM_NOTIFY,
-- },
--};
--
--static struct ibm_struct dock_driver_data[2] = {
-- {
-- .name = "dock",
-- .read = dock_read,
-- .write = dock_write,
-- .acpi = &ibm_dock_acpidriver[0],
-- },
-- {
-- .name = "dock",
-- .acpi = &ibm_dock_acpidriver[1],
-- },
--};
--
--#define dock_docked() (_sta(dock_handle) & 1)
--
--static int __init dock_init(struct ibm_init_struct *iibm)
--{
-- vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver\n");
--
-- TPACPI_ACPIHANDLE_INIT(dock);
--
-- vdbg_printk(TPACPI_DBG_INIT, "dock is %s\n",
-- str_supported(dock_handle != NULL));
--
-- return (dock_handle)? 0 : 1;
--}
--
--static int __init dock_init2(struct ibm_init_struct *iibm)
--{
-- int dock2_needed;
--
-- vdbg_printk(TPACPI_DBG_INIT, "initializing dock subdriver part 2\n");
--
-- if (dock_driver_data[0].flags.acpi_driver_registered &&
-- dock_driver_data[0].flags.acpi_notify_installed) {
-- TPACPI_ACPIHANDLE_INIT(pci);
-- dock2_needed = (pci_handle != NULL);
-- vdbg_printk(TPACPI_DBG_INIT,
-- "dock PCI handler for the TP 570 is %s\n",
-- str_supported(dock2_needed));
-- } else {
-- vdbg_printk(TPACPI_DBG_INIT,
-- "dock subdriver part 2 not required\n");
-- dock2_needed = 0;
-- }
--
-- return (dock2_needed)? 0 : 1;
--}
--
--static void dock_notify(struct ibm_struct *ibm, u32 event)
--{
-- int docked = dock_docked();
-- int pci = ibm->acpi->hid && ibm->acpi->device &&
-- acpi_match_device_ids(ibm->acpi->device, ibm_pci_device_ids);
-- int data;
--
-- if (event == 1 && !pci) /* 570 */
-- data = 1; /* button */
-- else if (event == 1 && pci) /* 570 */
-- data = 3; /* dock */
-- else if (event == 3 && docked)
-- data = 1; /* button */
-- else if (event == 3 && !docked)
-- data = 2; /* undock */
-- else if (event == 0 && docked)
-- data = 3; /* dock */
-- else {
-- printk(TPACPI_ERR "unknown dock event %d, status %d\n",
-- event, _sta(dock_handle));
-- data = 0; /* unknown */
-- }
-- acpi_bus_generate_proc_event(ibm->acpi->device, event, data);
-- acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
-- dev_name(&ibm->acpi->device->dev),
-- event, data);
--}
--
--static int dock_read(char *p)
--{
-- int len = 0;
-- int docked = dock_docked();
--
-- if (!dock_handle)
-- len += sprintf(p + len, "status:\t\tnot supported\n");
-- else if (!docked)
-- len += sprintf(p + len, "status:\t\tundocked\n");
-- else {
-- len += sprintf(p + len, "status:\t\tdocked\n");
-- len += sprintf(p + len, "commands:\tdock, undock\n");
-- }
--
-- return len;
--}
--
--static int dock_write(char *buf)
--{
-- char *cmd;
--
-- if (!dock_docked())
-- return -ENODEV;
--
-- while ((cmd = next_cmd(&buf))) {
-- if (strlencmp(cmd, "undock") == 0) {
-- if (!acpi_evalf(dock_handle, NULL, "_DCK", "vd", 0) ||
-- !acpi_evalf(dock_handle, NULL, "_EJ0", "vd", 1))
-- return -EIO;
-- } else if (strlencmp(cmd, "dock") == 0) {
-- if (!acpi_evalf(dock_handle, NULL, "_DCK", "vd", 1))
-- return -EIO;
-- } else
-- return -EINVAL;
-- }
--
-- return 0;
--}
--
--#endif /* CONFIG_THINKPAD_ACPI_DOCK */
--
--/*************************************************************************
-- * Bay subdriver
-- */
--
--#ifdef CONFIG_THINKPAD_ACPI_BAY
--
--TPACPI_HANDLE(bay, root, "\\_SB.PCI.IDE.SECN.MAST", /* 570 */
-- "\\_SB.PCI0.IDE0.IDES.IDSM", /* 600e/x, 770e, 770x */
-- "\\_SB.PCI0.SATA.SCND.MSTR", /* T60, X60, Z60 */
-- "\\_SB.PCI0.IDE0.SCND.MSTR", /* all others */
-- ); /* A21e, R30, R31 */
--TPACPI_HANDLE(bay_ej, bay, "_EJ3", /* 600e/x, A2xm/p, A3x */
-- "_EJ0", /* all others */
-- ); /* 570,A21e,G4x,R30,R31,R32,R40e,R50e */
--TPACPI_HANDLE(bay2, root, "\\_SB.PCI0.IDE0.PRIM.SLAV", /* A3x, R32 */
-- "\\_SB.PCI0.IDE0.IDEP.IDPS", /* 600e/x, 770e, 770x */
-- ); /* all others */
--TPACPI_HANDLE(bay2_ej, bay2, "_EJ3", /* 600e/x, 770e, A3x */
-- "_EJ0", /* 770x */
-- ); /* all others */
--
--static int __init bay_init(struct ibm_init_struct *iibm)
--{
-- vdbg_printk(TPACPI_DBG_INIT, "initializing bay subdriver\n");
--
-- TPACPI_ACPIHANDLE_INIT(bay);
-- if (bay_handle)
-- TPACPI_ACPIHANDLE_INIT(bay_ej);
-- TPACPI_ACPIHANDLE_INIT(bay2);
-- if (bay2_handle)
-- TPACPI_ACPIHANDLE_INIT(bay2_ej);
--
-- tp_features.bay_status = bay_handle &&
-- acpi_evalf(bay_handle, NULL, "_STA", "qv");
-- tp_features.bay_status2 = bay2_handle &&
-- acpi_evalf(bay2_handle, NULL, "_STA", "qv");
--
-- tp_features.bay_eject = bay_handle && bay_ej_handle &&
-- (strlencmp(bay_ej_path, "_EJ0") == 0 || experimental);
-- tp_features.bay_eject2 = bay2_handle && bay2_ej_handle &&
-- (strlencmp(bay2_ej_path, "_EJ0") == 0 || experimental);
--
-- vdbg_printk(TPACPI_DBG_INIT,
-- "bay 1: status %s, eject %s; bay 2: status %s, eject %s\n",
-- str_supported(tp_features.bay_status),
-- str_supported(tp_features.bay_eject),
-- str_supported(tp_features.bay_status2),
-- str_supported(tp_features.bay_eject2));
--
-- return (tp_features.bay_status || tp_features.bay_eject ||
-- tp_features.bay_status2 || tp_features.bay_eject2)? 0 : 1;
--}
--
--static void bay_notify(struct ibm_struct *ibm, u32 event)
--{
-- acpi_bus_generate_proc_event(ibm->acpi->device, event, 0);
-- acpi_bus_generate_netlink_event(ibm->acpi->device->pnp.device_class,
-- dev_name(&ibm->acpi->device->dev),
-- event, 0);
--}
--
--#define bay_occupied(b) (_sta(b##_handle) & 1)
--
--static int bay_read(char *p)
--{
-- int len = 0;
-- int occupied = bay_occupied(bay);
-- int occupied2 = bay_occupied(bay2);
-- int eject, eject2;
--
-- len += sprintf(p + len, "status:\t\t%s\n",
-- tp_features.bay_status ?
-- (occupied ? "occupied" : "unoccupied") :
-- "not supported");
-- if (tp_features.bay_status2)
-- len += sprintf(p + len, "status2:\t%s\n", occupied2 ?
-- "occupied" : "unoccupied");
--
-- eject = tp_features.bay_eject && occupied;
-- eject2 = tp_features.bay_eject2 && occupied2;
--
-- if (eject && eject2)
-- len += sprintf(p + len, "commands:\teject, eject2\n");
-- else if (eject)
-- len += sprintf(p + len, "commands:\teject\n");
-- else if (eject2)
-- len += sprintf(p + len, "commands:\teject2\n");
--
-- return len;
--}
--
--static int bay_write(char *buf)
--{
-- char *cmd;
--
-- if (!tp_features.bay_eject && !tp_features.bay_eject2)
-- return -ENODEV;
--
-- while ((cmd = next_cmd(&buf))) {
-- if (tp_features.bay_eject && strlencmp(cmd, "eject") == 0) {
-- if (!acpi_evalf(bay_ej_handle, NULL, NULL, "vd", 1))
-- return -EIO;
-- } else if (tp_features.bay_eject2 &&
-- strlencmp(cmd, "eject2") == 0) {
-- if (!acpi_evalf(bay2_ej_handle, NULL, NULL, "vd", 1))
-- return -EIO;
-- } else
-- return -EINVAL;
-- }
--
-- return 0;
--}
--
--static struct tp_acpi_drv_struct ibm_bay_acpidriver = {
-- .notify = bay_notify,
-- .handle = &bay_handle,
-- .type = ACPI_SYSTEM_NOTIFY,
--};
--
--static struct ibm_struct bay_driver_data = {
-- .name = "bay",
-- .read = bay_read,
-- .write = bay_write,
-- .acpi = &ibm_bay_acpidriver,
--};
--
--#endif /* CONFIG_THINKPAD_ACPI_BAY */
--
--/*************************************************************************
- * CMOS subdriver
- */
-
-@@ -5945,14 +5642,48 @@ static struct backlight_ops ibm_backlight_data = {
-
- /* --------------------------------------------------------------------- */
-
-+/*
-+ * These are only useful for models that have only one possibility
-+ * of GPU. If the BIOS model handles both ATI and Intel, don't use
-+ * these quirks.
-+ */
-+#define TPACPI_BRGHT_Q_NOEC 0x0001 /* Must NOT use EC HBRV */
-+#define TPACPI_BRGHT_Q_EC 0x0002 /* Should or must use EC HBRV */
-+#define TPACPI_BRGHT_Q_ASK 0x8000 /* Ask for user report */
-+
-+static const struct tpacpi_quirk brightness_quirk_table[] __initconst = {
-+ /* Models with ATI GPUs known to require ECNVRAM mode */
-+ TPACPI_Q_IBM('1', 'Y', TPACPI_BRGHT_Q_EC), /* T43/p ATI */
-+
-+ /* Models with ATI GPUs (waiting confirmation) */
-+ TPACPI_Q_IBM('1', 'R', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
-+ TPACPI_Q_IBM('1', 'Q', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
-+ TPACPI_Q_IBM('7', '6', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
-+ TPACPI_Q_IBM('7', '8', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_EC),
-+
-+ /* Models with Intel Extreme Graphics 2 (waiting confirmation) */
-+ TPACPI_Q_IBM('1', 'V', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
-+ TPACPI_Q_IBM('1', 'W', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
-+ TPACPI_Q_IBM('1', 'U', TPACPI_BRGHT_Q_ASK|TPACPI_BRGHT_Q_NOEC),
-+
-+ /* Models with Intel GMA900 */
-+ TPACPI_Q_IBM('7', '0', TPACPI_BRGHT_Q_NOEC), /* T43, R52 */
-+ TPACPI_Q_IBM('7', '4', TPACPI_BRGHT_Q_NOEC), /* X41 */
-+ TPACPI_Q_IBM('7', '5', TPACPI_BRGHT_Q_NOEC), /* X41 Tablet */
-+};
-+
- static int __init brightness_init(struct ibm_init_struct *iibm)
- {
- int b;
-+ unsigned long quirks;
-
- vdbg_printk(TPACPI_DBG_INIT, "initializing brightness subdriver\n");
-
- mutex_init(&brightness_mutex);
-
-+ quirks = tpacpi_check_quirks(brightness_quirk_table,
-+ ARRAY_SIZE(brightness_quirk_table));
-+
- /*
- * We always attempt to detect acpi support, so as to switch
- * Lenovo Vista BIOS to ACPI brightness mode even if we are not
-@@ -6009,23 +5740,13 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
- /* TPACPI_BRGHT_MODE_AUTO not implemented yet, just use default */
- if (brightness_mode == TPACPI_BRGHT_MODE_AUTO ||
- brightness_mode == TPACPI_BRGHT_MODE_MAX) {
-- if (thinkpad_id.vendor == PCI_VENDOR_ID_IBM) {
-- /*
-- * IBM models that define HBRV probably have
-- * EC-based backlight level control
-- */
-- if (acpi_evalf(ec_handle, NULL, "HBRV", "qd"))
-- /* T40-T43, R50-R52, R50e, R51e, X31-X41 */
-- brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM;
-- else
-- /* all other IBM ThinkPads */
-- brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP;
-- } else
-- /* All Lenovo ThinkPads */
-+ if (quirks & TPACPI_BRGHT_Q_EC)
-+ brightness_mode = TPACPI_BRGHT_MODE_ECNVRAM;
-+ else
- brightness_mode = TPACPI_BRGHT_MODE_UCMS_STEP;
-
- dbg_printk(TPACPI_DBG_BRGHT,
-- "selected brightness_mode=%d\n",
-+ "driver auto-selected brightness_mode=%d\n",
- brightness_mode);
- }
-
-@@ -6052,6 +5773,15 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
- vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT,
- "brightness is supported\n");
-
-+ if (quirks & TPACPI_BRGHT_Q_ASK) {
-+ printk(TPACPI_NOTICE
-+ "brightness: will use unverified default: "
-+ "brightness_mode=%d\n", brightness_mode);
-+ printk(TPACPI_NOTICE
-+ "brightness: please report to %s whether it works well "
-+ "or not on your ThinkPad\n", TPACPI_MAIL);
-+ }
-+
- ibm_backlight_device->props.max_brightness =
- (tp_features.bright_16levels)? 15 : 7;
- ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK;
-@@ -7854,22 +7584,6 @@ static struct ibm_init_struct ibms_init[] __initdata = {
- .init = light_init,
- .data = &light_driver_data,
- },
--#ifdef CONFIG_THINKPAD_ACPI_DOCK
-- {
-- .init = dock_init,
-- .data = &dock_driver_data[0],
-- },
-- {
-- .init = dock_init2,
-- .data = &dock_driver_data[1],
-- },
--#endif
--#ifdef CONFIG_THINKPAD_ACPI_BAY
-- {
-- .init = bay_init,
-- .data = &bay_driver_data,
-- },
--#endif
- {
- .init = cmos_init,
- .data = &cmos_driver_data,
-@@ -7968,12 +7682,6 @@ TPACPI_PARAM(hotkey);
- TPACPI_PARAM(bluetooth);
- TPACPI_PARAM(video);
- TPACPI_PARAM(light);
--#ifdef CONFIG_THINKPAD_ACPI_DOCK
--TPACPI_PARAM(dock);
--#endif
--#ifdef CONFIG_THINKPAD_ACPI_BAY
--TPACPI_PARAM(bay);
--#endif /* CONFIG_THINKPAD_ACPI_BAY */
- TPACPI_PARAM(cmos);
- TPACPI_PARAM(led);
- TPACPI_PARAM(beep);
-diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
-index 8030e25..c75d6f3 100644
---- a/drivers/s390/scsi/zfcp_erp.c
-+++ b/drivers/s390/scsi/zfcp_erp.c
-@@ -553,40 +553,35 @@ static void _zfcp_erp_unit_reopen_all(struct zfcp_port *port, int clear,
- _zfcp_erp_unit_reopen(unit, clear, id, ref);
- }
-
--static void zfcp_erp_strategy_followup_actions(struct zfcp_erp_action *act)
-+static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
- {
-- struct zfcp_adapter *adapter = act->adapter;
-- struct zfcp_port *port = act->port;
-- struct zfcp_unit *unit = act->unit;
-- u32 status = act->status;
--
-- /* initiate follow-up actions depending on success of finished action */
- switch (act->action) {
--
- case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
-- if (status == ZFCP_ERP_SUCCEEDED)
-- _zfcp_erp_port_reopen_all(adapter, 0, "ersfa_1", NULL);
-- else
-- _zfcp_erp_adapter_reopen(adapter, 0, "ersfa_2", NULL);
-+ _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1", NULL);
- break;
--
- case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
-- if (status == ZFCP_ERP_SUCCEEDED)
-- _zfcp_erp_port_reopen(port, 0, "ersfa_3", NULL);
-- else
-- _zfcp_erp_adapter_reopen(adapter, 0, "ersfa_4", NULL);
-+ _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2", NULL);
- break;
--
- case ZFCP_ERP_ACTION_REOPEN_PORT:
-- if (status == ZFCP_ERP_SUCCEEDED)
-- _zfcp_erp_unit_reopen_all(port, 0, "ersfa_5", NULL);
-- else
-- _zfcp_erp_port_forced_reopen(port, 0, "ersfa_6", NULL);
-+ _zfcp_erp_port_reopen(act->port, 0, "ersff_3", NULL);
- break;
--
- case ZFCP_ERP_ACTION_REOPEN_UNIT:
-- if (status != ZFCP_ERP_SUCCEEDED)
-- _zfcp_erp_port_reopen(unit->port, 0, "ersfa_7", NULL);
-+ _zfcp_erp_unit_reopen(act->unit, 0, "ersff_4", NULL);
-+ break;
-+ }
-+}
-+
-+static void zfcp_erp_strategy_followup_success(struct zfcp_erp_action *act)
-+{
-+ switch (act->action) {
-+ case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
-+ _zfcp_erp_port_reopen_all(act->adapter, 0, "ersfs_1", NULL);
-+ break;
-+ case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
-+ _zfcp_erp_port_reopen(act->port, 0, "ersfs_2", NULL);
-+ break;
-+ case ZFCP_ERP_ACTION_REOPEN_PORT:
-+ _zfcp_erp_unit_reopen_all(act->port, 0, "ersfs_3", NULL);
- break;
- }
- }
-@@ -801,7 +796,7 @@ static int zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action)
- return ZFCP_ERP_FAILED;
-
- case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
-- if (status & ZFCP_STATUS_PORT_PHYS_OPEN)
-+ if (!(status & ZFCP_STATUS_PORT_PHYS_OPEN))
- return ZFCP_ERP_SUCCEEDED;
- }
- return ZFCP_ERP_FAILED;
-@@ -853,11 +848,17 @@ void zfcp_erp_port_strategy_open_lookup(struct work_struct *work)
- gid_pn_work);
-
- retval = zfcp_fc_ns_gid_pn(&port->erp_action);
-- if (retval == -ENOMEM)
-- zfcp_erp_notify(&port->erp_action, ZFCP_ERP_NOMEM);
-- port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
-- if (retval)
-- zfcp_erp_notify(&port->erp_action, ZFCP_ERP_FAILED);
-+ if (!retval) {
-+ port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
-+ goto out;
-+ }
-+ if (retval == -ENOMEM) {
-+ zfcp_erp_notify(&port->erp_action, ZFCP_STATUS_ERP_LOWMEM);
-+ goto out;
-+ }
-+ /* all other error condtions */
-+ zfcp_erp_notify(&port->erp_action, 0);
-+out:
- zfcp_port_put(port);
- }
-
-@@ -1289,7 +1290,10 @@ static int zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
- retval = zfcp_erp_strategy_statechange(erp_action, retval);
- if (retval == ZFCP_ERP_EXIT)
- goto unlock;
-- zfcp_erp_strategy_followup_actions(erp_action);
-+ if (retval == ZFCP_ERP_SUCCEEDED)
-+ zfcp_erp_strategy_followup_success(erp_action);
-+ if (retval == ZFCP_ERP_FAILED)
-+ zfcp_erp_strategy_followup_failed(erp_action);
-
- unlock:
- write_unlock(&adapter->erp_lock);
-diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c
-index 2f0705d..47daebf 100644
---- a/drivers/s390/scsi/zfcp_fc.c
-+++ b/drivers/s390/scsi/zfcp_fc.c
-@@ -79,11 +79,9 @@ static int zfcp_wka_port_get(struct zfcp_wka_port *wka_port)
-
- mutex_unlock(&wka_port->mutex);
-
-- wait_event_timeout(
-- wka_port->completion_wq,
-- wka_port->status == ZFCP_WKA_PORT_ONLINE ||
-- wka_port->status == ZFCP_WKA_PORT_OFFLINE,
-- HZ >> 1);
-+ wait_event(wka_port->completion_wq,
-+ wka_port->status == ZFCP_WKA_PORT_ONLINE ||
-+ wka_port->status == ZFCP_WKA_PORT_OFFLINE);
-
- if (wka_port->status == ZFCP_WKA_PORT_ONLINE) {
- atomic_inc(&wka_port->refcount);
-diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
-index c57658f..47795fb 100644
---- a/drivers/s390/scsi/zfcp_fsf.c
-+++ b/drivers/s390/scsi/zfcp_fsf.c
-@@ -670,8 +670,11 @@ static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
- zfcp_fsf_sbal_check(adapter), 5 * HZ);
- if (ret > 0)
- return 0;
-- if (!ret)
-+ if (!ret) {
- atomic_inc(&adapter->qdio_outb_full);
-+ /* assume hanging outbound queue, try queue recovery */
-+ zfcp_erp_adapter_reopen(adapter, 0, "fsrsg_1", NULL);
-+ }
-
- spin_lock_bh(&adapter->req_q_lock);
- return -EIO;
-@@ -722,7 +725,7 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_adapter *adapter,
- req = zfcp_fsf_alloc_qtcb(pool);
-
- if (unlikely(!req))
-- return ERR_PTR(-EIO);
-+ return ERR_PTR(-ENOMEM);
-
- if (adapter->req_no == 0)
- adapter->req_no++;
-@@ -1010,6 +1013,23 @@ skip_fsfstatus:
- send_ct->handler(send_ct->handler_data);
- }
-
-+static void zfcp_fsf_setup_ct_els_unchained(struct qdio_buffer_element *sbale,
-+ struct scatterlist *sg_req,
-+ struct scatterlist *sg_resp)
-+{
-+ sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE_READ;
-+ sbale[2].addr = sg_virt(sg_req);
-+ sbale[2].length = sg_req->length;
-+ sbale[3].addr = sg_virt(sg_resp);
-+ sbale[3].length = sg_resp->length;
-+ sbale[3].flags |= SBAL_FLAGS_LAST_ENTRY;
-+}
-+
-+static int zfcp_fsf_one_sbal(struct scatterlist *sg)
-+{
-+ return sg_is_last(sg) && sg->length <= PAGE_SIZE;
-+}
-+
- static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
- struct scatterlist *sg_req,
- struct scatterlist *sg_resp,
-@@ -1020,30 +1040,30 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
- int bytes;
-
- if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS)) {
-- if (sg_req->length > PAGE_SIZE || sg_resp->length > PAGE_SIZE ||
-- !sg_is_last(sg_req) || !sg_is_last(sg_resp))
-+ if (!zfcp_fsf_one_sbal(sg_req) || !zfcp_fsf_one_sbal(sg_resp))
- return -EOPNOTSUPP;
-
-- sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE_READ;
-- sbale[2].addr = sg_virt(sg_req);
-- sbale[2].length = sg_req->length;
-- sbale[3].addr = sg_virt(sg_resp);
-- sbale[3].length = sg_resp->length;
-- sbale[3].flags |= SBAL_FLAGS_LAST_ENTRY;
-+ zfcp_fsf_setup_ct_els_unchained(sbale, sg_req, sg_resp);
-+ return 0;
-+ }
-+
-+ /* use single, unchained SBAL if it can hold the request */
-+ if (zfcp_fsf_one_sbal(sg_req) && zfcp_fsf_one_sbal(sg_resp)) {
-+ zfcp_fsf_setup_ct_els_unchained(sbale, sg_req, sg_resp);
- return 0;
- }
-
- bytes = zfcp_qdio_sbals_from_sg(req, SBAL_FLAGS0_TYPE_WRITE_READ,
- sg_req, max_sbals);
- if (bytes <= 0)
-- return -ENOMEM;
-+ return -EIO;
- req->qtcb->bottom.support.req_buf_length = bytes;
- req->sbale_curr = ZFCP_LAST_SBALE_PER_SBAL;
-
- bytes = zfcp_qdio_sbals_from_sg(req, SBAL_FLAGS0_TYPE_WRITE_READ,
- sg_resp, max_sbals);
- if (bytes <= 0)
-- return -ENOMEM;
-+ return -EIO;
- req->qtcb->bottom.support.resp_buf_length = bytes;
-
- return 0;
-@@ -1607,10 +1627,10 @@ static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
- case FSF_ACCESS_DENIED:
- wka_port->status = ZFCP_WKA_PORT_OFFLINE;
- break;
-- case FSF_PORT_ALREADY_OPEN:
-- break;
- case FSF_GOOD:
- wka_port->handle = header->port_handle;
-+ /* fall through */
-+ case FSF_PORT_ALREADY_OPEN:
- wka_port->status = ZFCP_WKA_PORT_ONLINE;
- }
- out:
-@@ -1731,15 +1751,16 @@ static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req)
- zfcp_fsf_access_denied_port(req, port);
- break;
- case FSF_PORT_BOXED:
-- zfcp_erp_port_boxed(port, "fscpph2", req);
-- req->status |= ZFCP_STATUS_FSFREQ_ERROR |
-- ZFCP_STATUS_FSFREQ_RETRY;
- /* can't use generic zfcp_erp_modify_port_status because
- * ZFCP_STATUS_COMMON_OPEN must not be reset for the port */
- atomic_clear_mask(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status);
- list_for_each_entry(unit, &port->unit_list_head, list)
- atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN,
- &unit->status);
-+ zfcp_erp_port_boxed(port, "fscpph2", req);
-+ req->status |= ZFCP_STATUS_FSFREQ_ERROR |
-+ ZFCP_STATUS_FSFREQ_RETRY;
-+
- break;
- case FSF_ADAPTER_STATUS_AVAILABLE:
- switch (header->fsf_status_qual.word[0]) {
-@@ -2541,7 +2562,6 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
- bytes = zfcp_qdio_sbals_from_sg(req, direction, fsf_cfdc->sg,
- FSF_MAX_SBALS_PER_REQ);
- if (bytes != ZFCP_CFDC_MAX_SIZE) {
-- retval = -ENOMEM;
- zfcp_fsf_req_free(req);
- goto out;
- }
-diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
-index 967ede7..6925a17 100644
---- a/drivers/s390/scsi/zfcp_scsi.c
-+++ b/drivers/s390/scsi/zfcp_scsi.c
-@@ -167,20 +167,21 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
- struct zfcp_unit *unit = scpnt->device->hostdata;
- struct zfcp_fsf_req *old_req, *abrt_req;
- unsigned long flags;
-- unsigned long old_req_id = (unsigned long) scpnt->host_scribble;
-+ unsigned long old_reqid = (unsigned long) scpnt->host_scribble;
- int retval = SUCCESS;
- int retry = 3;
-+ char *dbf_tag;
-
- /* avoid race condition between late normal completion and abort */
- write_lock_irqsave(&adapter->abort_lock, flags);
-
- spin_lock(&adapter->req_list_lock);
-- old_req = zfcp_reqlist_find(adapter, old_req_id);
-+ old_req = zfcp_reqlist_find(adapter, old_reqid);
- spin_unlock(&adapter->req_list_lock);
- if (!old_req) {
- write_unlock_irqrestore(&adapter->abort_lock, flags);
- zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL,
-- old_req_id);
-+ old_reqid);
- return FAILED; /* completion could be in progress */
- }
- old_req->data = NULL;
-@@ -189,7 +190,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
- write_unlock_irqrestore(&adapter->abort_lock, flags);
-
- while (retry--) {
-- abrt_req = zfcp_fsf_abort_fcp_command(old_req_id, unit);
-+ abrt_req = zfcp_fsf_abort_fcp_command(old_reqid, unit);
- if (abrt_req)
- break;
-
-@@ -197,7 +198,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
- if (!(atomic_read(&adapter->status) &
- ZFCP_STATUS_COMMON_RUNNING)) {
- zfcp_scsi_dbf_event_abort("nres", adapter, scpnt, NULL,
-- old_req_id);
-+ old_reqid);
- return SUCCESS;
- }
- }
-@@ -208,13 +209,14 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
- abrt_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
-
- if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED)
-- zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, abrt_req, 0);
-+ dbf_tag = "okay";
- else if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED)
-- zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, abrt_req, 0);
-+ dbf_tag = "lte2";
- else {
-- zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, abrt_req, 0);
-+ dbf_tag = "fail";
- retval = FAILED;
- }
-+ zfcp_scsi_dbf_event_abort(dbf_tag, adapter, scpnt, abrt_req, old_reqid);
- zfcp_fsf_req_free(abrt_req);
- return retval;
- }
-@@ -534,6 +536,9 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port)
- struct fc_rport_identifiers ids;
- struct fc_rport *rport;
-
-+ if (port->rport)
-+ return;
-+
- ids.node_name = port->wwnn;
- ids.port_name = port->wwpn;
- ids.port_id = port->d_id;
-@@ -557,8 +562,10 @@ static void zfcp_scsi_rport_block(struct zfcp_port *port)
- {
- struct fc_rport *rport = port->rport;
-
-- if (rport)
-+ if (rport) {
- fc_remote_port_delete(rport);
-+ port->rport = NULL;
-+ }
- }
-
- void zfcp_scsi_schedule_rport_register(struct zfcp_port *port)
-diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
-index 3e51e64..0fe5cce 100644
---- a/drivers/s390/scsi/zfcp_sysfs.c
-+++ b/drivers/s390/scsi/zfcp_sysfs.c
-@@ -494,9 +494,14 @@ static ssize_t zfcp_sysfs_adapter_q_full_show(struct device *dev,
- struct Scsi_Host *scsi_host = class_to_shost(dev);
- struct zfcp_adapter *adapter =
- (struct zfcp_adapter *) scsi_host->hostdata[0];
-+ u64 util;
-+
-+ spin_lock_bh(&adapter->qdio_stat_lock);
-+ util = adapter->req_q_util;
-+ spin_unlock_bh(&adapter->qdio_stat_lock);
-
- return sprintf(buf, "%d %llu\n", atomic_read(&adapter->qdio_outb_full),
-- (unsigned long long)adapter->req_q_util);
-+ (unsigned long long)util);
- }
- static DEVICE_ATTR(queue_full, S_IRUGO, zfcp_sysfs_adapter_q_full_show, NULL);
-
-diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
-index 2bc22be..145ab9b 100644
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -415,9 +415,9 @@ static void fc_exch_timeout(struct work_struct *work)
- e_stat = ep->esb_stat;
- if (e_stat & ESB_ST_COMPLETE) {
- ep->esb_stat = e_stat & ~ESB_ST_REC_QUAL;
-+ spin_unlock_bh(&ep->ex_lock);
- if (e_stat & ESB_ST_REC_QUAL)
- fc_exch_rrq(ep);
-- spin_unlock_bh(&ep->ex_lock);
- goto done;
- } else {
- resp = ep->resp;
-@@ -1624,14 +1624,14 @@ static void fc_exch_rrq(struct fc_exch *ep)
- struct fc_lport *lp;
- struct fc_els_rrq *rrq;
- struct fc_frame *fp;
-- struct fc_seq *rrq_sp;
- u32 did;
-
- lp = ep->lp;
-
- fp = fc_frame_alloc(lp, sizeof(*rrq));
- if (!fp)
-- return;
-+ goto retry;
-+
- rrq = fc_frame_payload_get(fp, sizeof(*rrq));
- memset(rrq, 0, sizeof(*rrq));
- rrq->rrq_cmd = ELS_RRQ;
-@@ -1647,13 +1647,20 @@ static void fc_exch_rrq(struct fc_exch *ep)
- fc_host_port_id(lp->host), FC_TYPE_ELS,
- FC_FC_FIRST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT, 0);
-
-- rrq_sp = fc_exch_seq_send(lp, fp, fc_exch_rrq_resp, NULL, ep,
-- lp->e_d_tov);
-- if (!rrq_sp) {
-- ep->esb_stat |= ESB_ST_REC_QUAL;
-- fc_exch_timer_set_locked(ep, ep->r_a_tov);
-+ if (fc_exch_seq_send(lp, fp, fc_exch_rrq_resp, NULL, ep, lp->e_d_tov))
-+ return;
-+
-+retry:
-+ spin_lock_bh(&ep->ex_lock);
-+ if (ep->state & (FC_EX_RST_CLEANUP | FC_EX_DONE)) {
-+ spin_unlock_bh(&ep->ex_lock);
-+ /* drop hold for rec qual */
-+ fc_exch_release(ep);
- return;
- }
-+ ep->esb_stat |= ESB_ST_REC_QUAL;
-+ fc_exch_timer_set_locked(ep, ep->r_a_tov);
-+ spin_unlock_bh(&ep->ex_lock);
- }
-
-
-diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
-index 716cc34..a751f62 100644
---- a/drivers/scsi/libiscsi.c
-+++ b/drivers/scsi/libiscsi.c
-@@ -1974,10 +1974,10 @@ int iscsi_eh_abort(struct scsi_cmnd *sc)
- * good and have never sent us a successful tmf response
- * then sent more data for the cmd.
- */
-- spin_lock(&session->lock);
-+ spin_lock_bh(&session->lock);
- fail_scsi_task(task, DID_ABORT);
- conn->tmf_state = TMF_INITIAL;
-- spin_unlock(&session->lock);
-+ spin_unlock_bh(&session->lock);
- iscsi_start_tx(conn);
- goto success_unlocked;
- case TMF_TIMEDOUT:
-diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
-index 54fa1e4..b338195 100644
---- a/drivers/scsi/libsas/sas_expander.c
-+++ b/drivers/scsi/libsas/sas_expander.c
-@@ -766,6 +766,7 @@ static int sas_ex_join_wide_port(struct domain_device *parent, int phy_id)
- if (!memcmp(phy->attached_sas_addr, ephy->attached_sas_addr,
- SAS_ADDR_SIZE) && ephy->port) {
- sas_port_add_phy(ephy->port, phy->phy);
-+ phy->port = ephy->port;
- phy->phy_state = PHY_DEVICE_DISCOVERED;
- return 0;
- }
-@@ -945,11 +946,21 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
- if (ex->ex_phy[i].phy_state == PHY_VACANT ||
- ex->ex_phy[i].phy_state == PHY_NOT_PRESENT)
- continue;
--
-+ /*
-+ * Due to races, the phy might not get added to the
-+ * wide port, so we add the phy to the wide port here.
-+ */
- if (SAS_ADDR(ex->ex_phy[i].attached_sas_addr) ==
-- SAS_ADDR(child->sas_addr))
-+ SAS_ADDR(child->sas_addr)) {
- ex->ex_phy[i].phy_state= PHY_DEVICE_DISCOVERED;
-+ res = sas_ex_join_wide_port(dev, i);
-+ if (!res)
-+ SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n",
-+ i, SAS_ADDR(ex->ex_phy[i].attached_sas_addr));
-+
-+ }
- }
-+ res = 0;
- }
-
- return res;
-@@ -1598,7 +1609,7 @@ static int sas_get_phy_attached_sas_addr(struct domain_device *dev,
- }
-
- static int sas_find_bcast_phy(struct domain_device *dev, int *phy_id,
-- int from_phy)
-+ int from_phy, bool update)
- {
- struct expander_device *ex = &dev->ex_dev;
- int res = 0;
-@@ -1611,7 +1622,9 @@ static int sas_find_bcast_phy(struct domain_device *dev, int *phy_id,
- if (res)
- goto out;
- else if (phy_change_count != ex->ex_phy[i].phy_change_count) {
-- ex->ex_phy[i].phy_change_count = phy_change_count;
-+ if (update)
-+ ex->ex_phy[i].phy_change_count =
-+ phy_change_count;
- *phy_id = i;
- return 0;
- }
-@@ -1653,31 +1666,52 @@ out:
- kfree(rg_req);
- return res;
- }
-+/**
-+ * sas_find_bcast_dev - find the device issue BROADCAST(CHANGE).
-+ * @dev:domain device to be detect.
-+ * @src_dev: the device which originated BROADCAST(CHANGE).
-+ *
-+ * Add self-configuration expander suport. Suppose two expander cascading,
-+ * when the first level expander is self-configuring, hotplug the disks in
-+ * second level expander, BROADCAST(CHANGE) will not only be originated
-+ * in the second level expander, but also be originated in the first level
-+ * expander (see SAS protocol SAS 2r-14, 7.11 for detail), it is to say,
-+ * expander changed count in two level expanders will all increment at least
-+ * once, but the phy which chang count has changed is the source device which
-+ * we concerned.
-+ */
-
- static int sas_find_bcast_dev(struct domain_device *dev,
- struct domain_device **src_dev)
- {
- struct expander_device *ex = &dev->ex_dev;
- int ex_change_count = -1;
-+ int phy_id = -1;
- int res;
-+ struct domain_device *ch;
-
- res = sas_get_ex_change_count(dev, &ex_change_count);
- if (res)
- goto out;
-- if (ex_change_count != -1 &&
-- ex_change_count != ex->ex_change_count) {
-- *src_dev = dev;
-- ex->ex_change_count = ex_change_count;
-- } else {
-- struct domain_device *ch;
--
-- list_for_each_entry(ch, &ex->children, siblings) {
-- if (ch->dev_type == EDGE_DEV ||
-- ch->dev_type == FANOUT_DEV) {
-- res = sas_find_bcast_dev(ch, src_dev);
-- if (src_dev)
-- return res;
-- }
-+ if (ex_change_count != -1 && ex_change_count != ex->ex_change_count) {
-+ /* Just detect if this expander phys phy change count changed,
-+ * in order to determine if this expander originate BROADCAST,
-+ * and do not update phy change count field in our structure.
-+ */
-+ res = sas_find_bcast_phy(dev, &phy_id, 0, false);
-+ if (phy_id != -1) {
-+ *src_dev = dev;
-+ ex->ex_change_count = ex_change_count;
-+ SAS_DPRINTK("Expander phy change count has changed\n");
-+ return res;
-+ } else
-+ SAS_DPRINTK("Expander phys DID NOT change\n");
-+ }
-+ list_for_each_entry(ch, &ex->children, siblings) {
-+ if (ch->dev_type == EDGE_DEV || ch->dev_type == FANOUT_DEV) {
-+ res = sas_find_bcast_dev(ch, src_dev);
-+ if (src_dev)
-+ return res;
- }
- }
- out:
-@@ -1700,24 +1734,26 @@ static void sas_unregister_ex_tree(struct domain_device *dev)
- }
-
- static void sas_unregister_devs_sas_addr(struct domain_device *parent,
-- int phy_id)
-+ int phy_id, bool last)
- {
- struct expander_device *ex_dev = &parent->ex_dev;
- struct ex_phy *phy = &ex_dev->ex_phy[phy_id];
- struct domain_device *child, *n;
--
-- list_for_each_entry_safe(child, n, &ex_dev->children, siblings) {
-- if (SAS_ADDR(child->sas_addr) ==
-- SAS_ADDR(phy->attached_sas_addr)) {
-- if (child->dev_type == EDGE_DEV ||
-- child->dev_type == FANOUT_DEV)
-- sas_unregister_ex_tree(child);
-- else
-- sas_unregister_dev(child);
-- break;
-+ if (last) {
-+ list_for_each_entry_safe(child, n,
-+ &ex_dev->children, siblings) {
-+ if (SAS_ADDR(child->sas_addr) ==
-+ SAS_ADDR(phy->attached_sas_addr)) {
-+ if (child->dev_type == EDGE_DEV ||
-+ child->dev_type == FANOUT_DEV)
-+ sas_unregister_ex_tree(child);
-+ else
-+ sas_unregister_dev(child);
-+ break;
-+ }
- }
-+ sas_disable_routing(parent, phy->attached_sas_addr);
- }
-- sas_disable_routing(parent, phy->attached_sas_addr);
- memset(phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
- sas_port_delete_phy(phy->port, phy->phy);
- if (phy->port->num_phys == 0)
-@@ -1770,15 +1806,31 @@ static int sas_discover_new(struct domain_device *dev, int phy_id)
- {
- struct ex_phy *ex_phy = &dev->ex_dev.ex_phy[phy_id];
- struct domain_device *child;
-- int res;
-+ bool found = false;
-+ int res, i;
-
- SAS_DPRINTK("ex %016llx phy%d new device attached\n",
- SAS_ADDR(dev->sas_addr), phy_id);
- res = sas_ex_phy_discover(dev, phy_id);
- if (res)
- goto out;
-+ /* to support the wide port inserted */
-+ for (i = 0; i < dev->ex_dev.num_phys; i++) {
-+ struct ex_phy *ex_phy_temp = &dev->ex_dev.ex_phy[i];
-+ if (i == phy_id)
-+ continue;
-+ if (SAS_ADDR(ex_phy_temp->attached_sas_addr) ==
-+ SAS_ADDR(ex_phy->attached_sas_addr)) {
-+ found = true;
-+ break;
-+ }
-+ }
-+ if (found) {
-+ sas_ex_join_wide_port(dev, phy_id);
-+ return 0;
-+ }
- res = sas_ex_discover_devices(dev, phy_id);
-- if (res)
-+ if (!res)
- goto out;
- list_for_each_entry(child, &dev->ex_dev.children, siblings) {
- if (SAS_ADDR(child->sas_addr) ==
-@@ -1793,7 +1845,7 @@ out:
- return res;
- }
-
--static int sas_rediscover_dev(struct domain_device *dev, int phy_id)
-+static int sas_rediscover_dev(struct domain_device *dev, int phy_id, bool last)
- {
- struct expander_device *ex = &dev->ex_dev;
- struct ex_phy *phy = &ex->ex_phy[phy_id];
-@@ -1804,11 +1856,11 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id)
- switch (res) {
- case SMP_RESP_NO_PHY:
- phy->phy_state = PHY_NOT_PRESENT;
-- sas_unregister_devs_sas_addr(dev, phy_id);
-+ sas_unregister_devs_sas_addr(dev, phy_id, last);
- goto out; break;
- case SMP_RESP_PHY_VACANT:
- phy->phy_state = PHY_VACANT;
-- sas_unregister_devs_sas_addr(dev, phy_id);
-+ sas_unregister_devs_sas_addr(dev, phy_id, last);
- goto out; break;
- case SMP_RESP_FUNC_ACC:
- break;
-@@ -1816,7 +1868,7 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id)
-
- if (SAS_ADDR(attached_sas_addr) == 0) {
- phy->phy_state = PHY_EMPTY;
-- sas_unregister_devs_sas_addr(dev, phy_id);
-+ sas_unregister_devs_sas_addr(dev, phy_id, last);
- } else if (SAS_ADDR(attached_sas_addr) ==
- SAS_ADDR(phy->attached_sas_addr)) {
- SAS_DPRINTK("ex %016llx phy 0x%x broadcast flutter\n",
-@@ -1828,12 +1880,27 @@ out:
- return res;
- }
-
-+/**
-+ * sas_rediscover - revalidate the domain.
-+ * @dev:domain device to be detect.
-+ * @phy_id: the phy id will be detected.
-+ *
-+ * NOTE: this process _must_ quit (return) as soon as any connection
-+ * errors are encountered. Connection recovery is done elsewhere.
-+ * Discover process only interrogates devices in order to discover the
-+ * domain.For plugging out, we un-register the device only when it is
-+ * the last phy in the port, for other phys in this port, we just delete it
-+ * from the port.For inserting, we do discovery when it is the
-+ * first phy,for other phys in this port, we add it to the port to
-+ * forming the wide-port.
-+ */
- static int sas_rediscover(struct domain_device *dev, const int phy_id)
- {
- struct expander_device *ex = &dev->ex_dev;
- struct ex_phy *changed_phy = &ex->ex_phy[phy_id];
- int res = 0;
- int i;
-+ bool last = true; /* is this the last phy of the port */
-
- SAS_DPRINTK("ex %016llx phy%d originated BROADCAST(CHANGE)\n",
- SAS_ADDR(dev->sas_addr), phy_id);
-@@ -1848,13 +1915,13 @@ static int sas_rediscover(struct domain_device *dev, const int phy_id)
- SAS_ADDR(changed_phy->attached_sas_addr)) {
- SAS_DPRINTK("phy%d part of wide port with "
- "phy%d\n", phy_id, i);
-- goto out;
-+ last = false;
-+ break;
- }
- }
-- res = sas_rediscover_dev(dev, phy_id);
-+ res = sas_rediscover_dev(dev, phy_id, last);
- } else
- res = sas_discover_new(dev, phy_id);
--out:
- return res;
- }
-
-@@ -1881,7 +1948,7 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev)
-
- do {
- phy_id = -1;
-- res = sas_find_bcast_phy(dev, &phy_id, i);
-+ res = sas_find_bcast_phy(dev, &phy_id, i, true);
- if (phy_id == -1)
- break;
- res = sas_rediscover(dev, phy_id);
-diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
-index e6ac59c..fe8b74c 100644
---- a/drivers/scsi/libsas/sas_port.c
-+++ b/drivers/scsi/libsas/sas_port.c
-@@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
- }
- }
-
-- /* find a port */
-+ /* see if the phy should be part of a wide port */
- spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
- for (i = 0; i < sas_ha->num_phys; i++) {
- port = sas_ha->sas_port[i];
-@@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy)
- SAS_DPRINTK("phy%d matched wide port%d\n", phy->id,
- port->id);
- break;
-- } else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) {
-- memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE);
-- break;
- }
- spin_unlock(&port->phy_list_lock);
- }
-+ /* The phy does not match any existing port, create a new one */
-+ if (i == sas_ha->num_phys) {
-+ for (i = 0; i < sas_ha->num_phys; i++) {
-+ port = sas_ha->sas_port[i];
-+ spin_lock(&port->phy_list_lock);
-+ if (*(u64 *)port->sas_addr == 0
-+ && port->num_phys == 0) {
-+ memcpy(port->sas_addr, phy->sas_addr,
-+ SAS_ADDR_SIZE);
-+ break;
-+ }
-+ spin_unlock(&port->phy_list_lock);
-+ }
-+ }
-
- if (i >= sas_ha->num_phys) {
- printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
-diff --git a/drivers/scsi/qla4xxx/ql4_dbg.c b/drivers/scsi/qla4xxx/ql4_dbg.c
-index fcc184c..cbceb0e 100644
---- a/drivers/scsi/qla4xxx/ql4_dbg.c
-+++ b/drivers/scsi/qla4xxx/ql4_dbg.c
-@@ -15,19 +15,18 @@ void qla4xxx_dump_buffer(void *b, uint32_t size)
- uint32_t cnt;
- uint8_t *c = b;
-
-- printk(" 0 1 2 3 4 5 6 7 8 9 Ah Bh Ch Dh Eh "
-+ printk(" 0 1 2 3 4 5 6 7 8 9 Ah Bh Ch Dh Eh "
- "Fh\n");
- printk("------------------------------------------------------------"
- "--\n");
-- for (cnt = 0; cnt < size; cnt++, c++) {
-- printk(KERN_DEBUG "%02x", *c);
-- if (!(cnt % 16))
-- printk(KERN_DEBUG "\n");
-+ for (cnt = 0; cnt < size; c++) {
-+ printk(KERN_INFO "%02x", *c);
-+ if (!(++cnt % 16))
-+ printk(KERN_INFO "\n");
-
- else
-- printk(KERN_DEBUG " ");
-+ printk(KERN_INFO " ");
- }
-- if (cnt % 16)
-- printk(KERN_DEBUG "\n");
-+ printk(KERN_INFO "\n");
- }
-
-diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
-index b586f27..81b5f29 100644
---- a/drivers/scsi/qla4xxx/ql4_def.h
-+++ b/drivers/scsi/qla4xxx/ql4_def.h
-@@ -100,7 +100,6 @@
- #define MAX_SRBS MAX_CMDS_TO_RISC
- #define MBOX_AEN_REG_COUNT 5
- #define MAX_INIT_RETRIES 5
--#define IOCB_HIWAT_CUSHION 16
-
- /*
- * Buffer sizes
-@@ -184,6 +183,11 @@ struct srb {
- uint16_t cc_stat;
- u_long r_start; /* Time we recieve a cmd from OS */
- u_long u_start; /* Time when we handed the cmd to F/W */
-+
-+ /* Used for extended sense / status continuation */
-+ uint8_t *req_sense_ptr;
-+ uint16_t req_sense_len;
-+ uint16_t reserved2;
- };
-
- /*
-@@ -302,7 +306,6 @@ struct scsi_qla_host {
- uint32_t tot_ddbs;
-
- uint16_t iocb_cnt;
-- uint16_t iocb_hiwat;
-
- /* SRB cache. */
- #define SRB_MIN_REQ 128
-@@ -436,6 +439,8 @@ struct scsi_qla_host {
- /* Map ddb_list entry by FW ddb index */
- struct ddb_entry *fw_ddb_index_map[MAX_DDB_ENTRIES];
-
-+ /* Saved srb for status continuation entry processing */
-+ struct srb *status_srb;
- };
-
- static inline int is_qla4010(struct scsi_qla_host *ha)
-diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h
-index 1b667a7..9cd7a60 100644
---- a/drivers/scsi/qla4xxx/ql4_fw.h
-+++ b/drivers/scsi/qla4xxx/ql4_fw.h
-@@ -572,6 +572,7 @@ struct conn_event_log_entry {
- *************************************************************************/
- #define IOCB_MAX_CDB_LEN 16 /* Bytes in a CBD */
- #define IOCB_MAX_SENSEDATA_LEN 32 /* Bytes of sense data */
-+#define IOCB_MAX_EXT_SENSEDATA_LEN 60 /* Bytes of extended sense data */
-
- /* IOCB header structure */
- struct qla4_header {
-@@ -733,6 +734,12 @@ struct status_entry {
-
- };
-
-+/* Status Continuation entry */
-+struct status_cont_entry {
-+ struct qla4_header hdr; /* 00-03 */
-+ uint8_t ext_sense_data[IOCB_MAX_EXT_SENSEDATA_LEN]; /* 04-63 */
-+};
-+
- struct passthru0 {
- struct qla4_header hdr; /* 00-03 */
- uint32_t handle; /* 04-07 */
-diff --git a/drivers/scsi/qla4xxx/ql4_iocb.c b/drivers/scsi/qla4xxx/ql4_iocb.c
-index 912a674..e0c3215 100644
---- a/drivers/scsi/qla4xxx/ql4_iocb.c
-+++ b/drivers/scsi/qla4xxx/ql4_iocb.c
-@@ -10,9 +10,42 @@
- #include "ql4_dbg.h"
- #include "ql4_inline.h"
-
--
- #include <scsi/scsi_tcq.h>
-
-+static int
-+qla4xxx_space_in_req_ring(struct scsi_qla_host *ha, uint16_t req_cnt)
-+{
-+ uint16_t cnt;
-+
-+ /* Calculate number of free request entries. */
-+ if ((req_cnt + 2) >= ha->req_q_count) {
-+ cnt = (uint16_t) le32_to_cpu(ha->shadow_regs->req_q_out);
-+ if (ha->request_in < cnt)
-+ ha->req_q_count = cnt - ha->request_in;
-+ else
-+ ha->req_q_count = REQUEST_QUEUE_DEPTH -
-+ (ha->request_in - cnt);
-+ }
-+
-+ /* Check if room for request in request ring. */
-+ if ((req_cnt + 2) < ha->req_q_count)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static void qla4xxx_advance_req_ring_ptr(struct scsi_qla_host *ha)
-+{
-+ /* Advance request queue pointer */
-+ if (ha->request_in == (REQUEST_QUEUE_DEPTH - 1)) {
-+ ha->request_in = 0;
-+ ha->request_ptr = ha->request_ring;
-+ } else {
-+ ha->request_in++;
-+ ha->request_ptr++;
-+ }
-+}
-+
- /**
- * qla4xxx_get_req_pkt - returns a valid entry in request queue.
- * @ha: Pointer to host adapter structure.
-@@ -26,35 +59,18 @@
- static int qla4xxx_get_req_pkt(struct scsi_qla_host *ha,
- struct queue_entry **queue_entry)
- {
-- uint16_t request_in;
-- uint8_t status = QLA_SUCCESS;
--
-- *queue_entry = ha->request_ptr;
-+ uint16_t req_cnt = 1;
-
-- /* get the latest request_in and request_out index */
-- request_in = ha->request_in;
-- ha->request_out = (uint16_t) le32_to_cpu(ha->shadow_regs->req_q_out);
--
-- /* Advance request queue pointer and check for queue full */
-- if (request_in == (REQUEST_QUEUE_DEPTH - 1)) {
-- request_in = 0;
-- ha->request_ptr = ha->request_ring;
-- } else {
-- request_in++;
-- ha->request_ptr++;
-- }
--
-- /* request queue is full, try again later */
-- if ((ha->iocb_cnt + 1) >= ha->iocb_hiwat) {
-- /* restore request pointer */
-- ha->request_ptr = *queue_entry;
-- status = QLA_ERROR;
-- } else {
-- ha->request_in = request_in;
-+ if (qla4xxx_space_in_req_ring(ha, req_cnt)) {
-+ *queue_entry = ha->request_ptr;
- memset(*queue_entry, 0, sizeof(**queue_entry));
-+
-+ qla4xxx_advance_req_ring_ptr(ha);
-+ ha->req_q_count -= req_cnt;
-+ return QLA_SUCCESS;
- }
-
-- return status;
-+ return QLA_ERROR;
- }
-
- /**
-@@ -100,21 +116,14 @@ exit_send_marker:
- return status;
- }
-
--static struct continuation_t1_entry* qla4xxx_alloc_cont_entry(
-- struct scsi_qla_host *ha)
-+static struct continuation_t1_entry *
-+qla4xxx_alloc_cont_entry(struct scsi_qla_host *ha)
- {
- struct continuation_t1_entry *cont_entry;
-
- cont_entry = (struct continuation_t1_entry *)ha->request_ptr;
-
-- /* Advance request queue pointer */
-- if (ha->request_in == (REQUEST_QUEUE_DEPTH - 1)) {
-- ha->request_in = 0;
-- ha->request_ptr = ha->request_ring;
-- } else {
-- ha->request_in++;
-- ha->request_ptr++;
-- }
-+ qla4xxx_advance_req_ring_ptr(ha);
-
- /* Load packet defaults */
- cont_entry->hdr.entryType = ET_CONTINUE;
-@@ -197,13 +206,10 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)
- struct scsi_cmnd *cmd = srb->cmd;
- struct ddb_entry *ddb_entry;
- struct command_t3_entry *cmd_entry;
--
- int nseg;
- uint16_t tot_dsds;
- uint16_t req_cnt;
--
- unsigned long flags;
-- uint16_t cnt;
- uint32_t index;
- char tag[2];
-
-@@ -217,6 +223,19 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)
-
- index = (uint32_t)cmd->request->tag;
-
-+ /*
-+ * Check to see if adapter is online before placing request on
-+ * request queue. If a reset occurs and a request is in the queue,
-+ * the firmware will still attempt to process the request, retrieving
-+ * garbage for pointers.
-+ */
-+ if (!test_bit(AF_ONLINE, &ha->flags)) {
-+ DEBUG2(printk("scsi%ld: %s: Adapter OFFLINE! "
-+ "Do not issue command.\n",
-+ ha->host_no, __func__));
-+ goto queuing_error;
-+ }
-+
- /* Calculate the number of request entries needed. */
- nseg = scsi_dma_map(cmd);
- if (nseg < 0)
-@@ -224,17 +243,7 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)
- tot_dsds = nseg;
-
- req_cnt = qla4xxx_calc_request_entries(tot_dsds);
--
-- if (ha->req_q_count < (req_cnt + 2)) {
-- cnt = (uint16_t) le32_to_cpu(ha->shadow_regs->req_q_out);
-- if (ha->request_in < cnt)
-- ha->req_q_count = cnt - ha->request_in;
-- else
-- ha->req_q_count = REQUEST_QUEUE_DEPTH -
-- (ha->request_in - cnt);
-- }
--
-- if (ha->req_q_count < (req_cnt + 2))
-+ if (!qla4xxx_space_in_req_ring(ha, req_cnt))
- goto queuing_error;
-
- /* total iocbs active */
-@@ -286,32 +295,10 @@ int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb * srb)
- break;
- }
-
--
-- /* Advance request queue pointer */
-- ha->request_in++;
-- if (ha->request_in == REQUEST_QUEUE_DEPTH) {
-- ha->request_in = 0;
-- ha->request_ptr = ha->request_ring;
-- } else
-- ha->request_ptr++;
--
--
-+ qla4xxx_advance_req_ring_ptr(ha);
- qla4xxx_build_scsi_iocbs(srb, cmd_entry, tot_dsds);
- wmb();
-
-- /*
-- * Check to see if adapter is online before placing request on
-- * request queue. If a reset occurs and a request is in the queue,
-- * the firmware will still attempt to process the request, retrieving
-- * garbage for pointers.
-- */
-- if (!test_bit(AF_ONLINE, &ha->flags)) {
-- DEBUG2(printk("scsi%ld: %s: Adapter OFFLINE! "
-- "Do not issue command.\n",
-- ha->host_no, __func__));
-- goto queuing_error;
-- }
--
- srb->cmd->host_scribble = (unsigned char *)srb;
-
- /* update counters */
-diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
-index 799120f..8025ee1 100644
---- a/drivers/scsi/qla4xxx/ql4_isr.c
-+++ b/drivers/scsi/qla4xxx/ql4_isr.c
-@@ -11,6 +11,98 @@
- #include "ql4_inline.h"
-
- /**
-+ * qla4xxx_copy_sense - copy sense data into cmd sense buffer
-+ * @ha: Pointer to host adapter structure.
-+ * @sts_entry: Pointer to status entry structure.
-+ * @srb: Pointer to srb structure.
-+ **/
-+static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
-+ struct status_entry *sts_entry,
-+ struct srb *srb)
-+{
-+ struct scsi_cmnd *cmd = srb->cmd;
-+ uint16_t sense_len;
-+
-+ memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
-+ sense_len = le16_to_cpu(sts_entry->senseDataByteCnt);
-+ if (sense_len == 0)
-+ return;
-+
-+ /* Save total available sense length,
-+ * not to exceed cmd's sense buffer size */
-+ sense_len = min_t(uint16_t, sense_len, SCSI_SENSE_BUFFERSIZE);
-+ srb->req_sense_ptr = cmd->sense_buffer;
-+ srb->req_sense_len = sense_len;
-+
-+ /* Copy sense from sts_entry pkt */
-+ sense_len = min_t(uint16_t, sense_len, IOCB_MAX_SENSEDATA_LEN);
-+ memcpy(cmd->sense_buffer, sts_entry->senseData, sense_len);
-+
-+ DEBUG2(printk(KERN_INFO "scsi%ld:%d:%d:%d: %s: sense key = %x, "
-+ "ASL= %02x, ASC/ASCQ = %02x/%02x\n", ha->host_no,
-+ cmd->device->channel, cmd->device->id,
-+ cmd->device->lun, __func__,
-+ sts_entry->senseData[2] & 0x0f,
-+ sts_entry->senseData[7],
-+ sts_entry->senseData[12],
-+ sts_entry->senseData[13]));
-+
-+ DEBUG5(qla4xxx_dump_buffer(cmd->sense_buffer, sense_len));
-+ srb->flags |= SRB_GOT_SENSE;
-+
-+ /* Update srb, in case a sts_cont pkt follows */
-+ srb->req_sense_ptr += sense_len;
-+ srb->req_sense_len -= sense_len;
-+ if (srb->req_sense_len != 0)
-+ ha->status_srb = srb;
-+ else
-+ ha->status_srb = NULL;
-+}
-+
-+/**
-+ * qla4xxx_status_cont_entry - Process a Status Continuations entry.
-+ * @ha: SCSI driver HA context
-+ * @sts_cont: Entry pointer
-+ *
-+ * Extended sense data.
-+ */
-+static void
-+qla4xxx_status_cont_entry(struct scsi_qla_host *ha,
-+ struct status_cont_entry *sts_cont)
-+{
-+ struct srb *srb = ha->status_srb;
-+ struct scsi_cmnd *cmd;
-+ uint8_t sense_len;
-+
-+ if (srb == NULL)
-+ return;
-+
-+ cmd = srb->cmd;
-+ if (cmd == NULL) {
-+ DEBUG2(printk(KERN_INFO "scsi%ld: %s: Cmd already returned "
-+ "back to OS srb=%p srb->state:%d\n", ha->host_no,
-+ __func__, srb, srb->state));
-+ ha->status_srb = NULL;
-+ return;
-+ }
-+
-+ /* Copy sense data. */
-+ sense_len = min_t(uint16_t, srb->req_sense_len,
-+ IOCB_MAX_EXT_SENSEDATA_LEN);
-+ memcpy(srb->req_sense_ptr, sts_cont->ext_sense_data, sense_len);
-+ DEBUG5(qla4xxx_dump_buffer(srb->req_sense_ptr, sense_len));
-+
-+ srb->req_sense_ptr += sense_len;
-+ srb->req_sense_len -= sense_len;
-+
-+ /* Place command on done queue. */
-+ if (srb->req_sense_len == 0) {
-+ qla4xxx_srb_compl(ha, srb);
-+ ha->status_srb = NULL;
-+ }
-+}
-+
-+/**
- * qla4xxx_status_entry - processes status IOCBs
- * @ha: Pointer to host adapter structure.
- * @sts_entry: Pointer to status entry structure.
-@@ -23,7 +115,6 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
- struct srb *srb;
- struct ddb_entry *ddb_entry;
- uint32_t residual;
-- uint16_t sensebytecnt;
-
- srb = qla4xxx_del_from_active_array(ha, le32_to_cpu(sts_entry->handle));
- if (!srb) {
-@@ -92,24 +183,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
- break;
-
- /* Copy Sense Data into sense buffer. */
-- memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
--
-- sensebytecnt = le16_to_cpu(sts_entry->senseDataByteCnt);
-- if (sensebytecnt == 0)
-- break;
--
-- memcpy(cmd->sense_buffer, sts_entry->senseData,
-- min_t(uint16_t, sensebytecnt, SCSI_SENSE_BUFFERSIZE));
--
-- DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, "
-- "ASC/ASCQ = %02x/%02x\n", ha->host_no,
-- cmd->device->channel, cmd->device->id,
-- cmd->device->lun, __func__,
-- sts_entry->senseData[2] & 0x0f,
-- sts_entry->senseData[12],
-- sts_entry->senseData[13]));
--
-- srb->flags |= SRB_GOT_SENSE;
-+ qla4xxx_copy_sense(ha, sts_entry, srb);
- break;
-
- case SCS_INCOMPLETE:
-@@ -176,23 +250,7 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
- break;
-
- /* Copy Sense Data into sense buffer. */
-- memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
--
-- sensebytecnt =
-- le16_to_cpu(sts_entry->senseDataByteCnt);
-- if (sensebytecnt == 0)
-- break;
--
-- memcpy(cmd->sense_buffer, sts_entry->senseData,
-- min_t(uint16_t, sensebytecnt, SCSI_SENSE_BUFFERSIZE));
--
-- DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, "
-- "ASC/ASCQ = %02x/%02x\n", ha->host_no,
-- cmd->device->channel, cmd->device->id,
-- cmd->device->lun, __func__,
-- sts_entry->senseData[2] & 0x0f,
-- sts_entry->senseData[12],
-- sts_entry->senseData[13]));
-+ qla4xxx_copy_sense(ha, sts_entry, srb);
- } else {
- /*
- * If RISC reports underrun and target does not
-@@ -268,9 +326,10 @@ static void qla4xxx_status_entry(struct scsi_qla_host *ha,
-
- status_entry_exit:
-
-- /* complete the request */
-+ /* complete the request, if not waiting for status_continuation pkt */
- srb->cc_stat = sts_entry->completionStatus;
-- qla4xxx_srb_compl(ha, srb);
-+ if (ha->status_srb == NULL)
-+ qla4xxx_srb_compl(ha, srb);
- }
-
- /**
-@@ -305,10 +364,7 @@ static void qla4xxx_process_response_queue(struct scsi_qla_host * ha)
- /* process entry */
- switch (sts_entry->hdr.entryType) {
- case ET_STATUS:
-- /*
-- * Common status - Single completion posted in single
-- * IOSB.
-- */
-+ /* Common status */
- qla4xxx_status_entry(ha, sts_entry);
- break;
-
-@@ -316,9 +372,8 @@ static void qla4xxx_process_response_queue(struct scsi_qla_host * ha)
- break;
-
- case ET_STATUS_CONTINUATION:
-- /* Just throw away the status continuation entries */
-- DEBUG2(printk("scsi%ld: %s: Status Continuation entry "
-- "- ignoring\n", ha->host_no, __func__));
-+ qla4xxx_status_cont_entry(ha,
-+ (struct status_cont_entry *) sts_entry);
- break;
-
- case ET_COMMAND:
-diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
-index 051b0f5..09d6d4b 100644
---- a/drivers/scsi/qla4xxx/ql4_mbx.c
-+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
-@@ -385,16 +385,6 @@ int qla4xxx_get_firmware_status(struct scsi_qla_host * ha)
- mbox_sts[0]));
- return QLA_ERROR;
- }
--
-- /* High-water mark of IOCBs */
-- ha->iocb_hiwat = mbox_sts[2];
-- if (ha->iocb_hiwat > IOCB_HIWAT_CUSHION)
-- ha->iocb_hiwat -= IOCB_HIWAT_CUSHION;
-- else
-- dev_info(&ha->pdev->dev, "WARNING!!! You have less than %d "
-- "firmware IOCBs available (%d).\n",
-- IOCB_HIWAT_CUSHION, ha->iocb_hiwat);
--
- return QLA_SUCCESS;
- }
-
-diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
-index ec9da6c..40e3caf 100644
---- a/drivers/scsi/qla4xxx/ql4_os.c
-+++ b/drivers/scsi/qla4xxx/ql4_os.c
-@@ -66,6 +66,7 @@ static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
- static int qla4xxx_host_get_param(struct Scsi_Host *shost,
- enum iscsi_host_param param, char *buf);
- static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session);
-+static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc);
-
- /*
- * SCSI host template entry points
-@@ -89,6 +90,7 @@ static struct scsi_host_template qla4xxx_driver_template = {
- .eh_device_reset_handler = qla4xxx_eh_device_reset,
- .eh_target_reset_handler = qla4xxx_eh_target_reset,
- .eh_host_reset_handler = qla4xxx_eh_host_reset,
-+ .eh_timed_out = qla4xxx_eh_cmd_timed_out,
-
- .slave_configure = qla4xxx_slave_configure,
- .slave_alloc = qla4xxx_slave_alloc,
-@@ -124,6 +126,21 @@ static struct iscsi_transport qla4xxx_iscsi_transport = {
-
- static struct scsi_transport_template *qla4xxx_scsi_transport;
-
-+static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
-+{
-+ struct iscsi_cls_session *session;
-+ struct ddb_entry *ddb_entry;
-+
-+ session = starget_to_session(scsi_target(sc->device));
-+ ddb_entry = session->dd_data;
-+
-+ /* if we are not logged in then the LLD is going to clean up the cmd */
-+ if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)
-+ return BLK_EH_RESET_TIMER;
-+ else
-+ return BLK_EH_NOT_HANDLED;
-+}
-+
- static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
- {
- struct ddb_entry *ddb_entry = session->dd_data;
-@@ -904,18 +921,17 @@ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha,
- /* Flush any pending ddb changed AENs */
- qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
-
-+ qla4xxx_flush_active_srbs(ha);
-+
- /* Reset the firmware. If successful, function
- * returns with ISP interrupts enabled.
- */
-- if (status == QLA_SUCCESS) {
-- DEBUG2(printk("scsi%ld: %s - Performing soft reset..\n",
-- ha->host_no, __func__));
-- qla4xxx_flush_active_srbs(ha);
-- if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS)
-- status = qla4xxx_soft_reset(ha);
-- else
-- status = QLA_ERROR;
-- }
-+ DEBUG2(printk("scsi%ld: %s - Performing soft reset..\n",
-+ ha->host_no, __func__));
-+ if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS)
-+ status = qla4xxx_soft_reset(ha);
-+ else
-+ status = QLA_ERROR;
-
- /* Flush any pending ddb changed AENs */
- qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
-@@ -1527,11 +1543,9 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
- {
- struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
- struct ddb_entry *ddb_entry = cmd->device->hostdata;
-- struct srb *sp;
- int ret = FAILED, stat;
-
-- sp = (struct srb *) cmd->SCp.ptr;
-- if (!sp || !ddb_entry)
-+ if (!ddb_entry)
- return ret;
-
- dev_info(&ha->pdev->dev,
-@@ -1644,7 +1658,7 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
- ha = (struct scsi_qla_host *) cmd->device->host->hostdata;
-
- dev_info(&ha->pdev->dev,
-- "scsi(%ld:%d:%d:%d): ADAPTER RESET ISSUED.\n", ha->host_no,
-+ "scsi(%ld:%d:%d:%d): HOST RESET ISSUED.\n", ha->host_no,
- cmd->device->channel, cmd->device->id, cmd->device->lun);
-
- if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) {
-diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h
-index ab984cb..6980cb2 100644
---- a/drivers/scsi/qla4xxx/ql4_version.h
-+++ b/drivers/scsi/qla4xxx/ql4_version.h
-@@ -5,5 +5,5 @@
- * See LICENSE.qla4xxx for copyright and licensing details.
- */
-
--#define QLA4XXX_DRIVER_VERSION "5.01.00-k8"
-+#define QLA4XXX_DRIVER_VERSION "5.01.00-k9"
-
-diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
-index 783e33c..b47240c 100644
---- a/drivers/scsi/scsi_transport_iscsi.c
-+++ b/drivers/scsi/scsi_transport_iscsi.c
-@@ -990,7 +990,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,
- struct iscsi_uevent *ev;
- int len = NLMSG_SPACE(sizeof(*ev) + data_size);
-
-- skb = alloc_skb(len, GFP_NOIO);
-+ skb = alloc_skb(len, GFP_ATOMIC);
- if (!skb) {
- printk(KERN_ERR "can not deliver iscsi offload message:OOM\n");
- return -ENOMEM;
-@@ -1012,7 +1012,7 @@ int iscsi_offload_mesg(struct Scsi_Host *shost,
-
- memcpy((char *)ev + sizeof(*ev), data, data_size);
-
-- return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_NOIO);
-+ return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC);
- }
- EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
-
-diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
-index 5616cd7..b7b9fec 100644
---- a/drivers/scsi/sd.c
-+++ b/drivers/scsi/sd.c
-@@ -1840,6 +1840,18 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
- kfree(buffer);
- }
-
-+static int sd_try_extended_inquiry(struct scsi_device *sdp)
-+{
-+ /*
-+ * Although VPD inquiries can go to SCSI-2 type devices,
-+ * some USB ones crash on receiving them, and the pages
-+ * we currently ask for are for SPC-3 and beyond
-+ */
-+ if (sdp->scsi_level > SCSI_SPC_2)
-+ return 1;
-+ return 0;
-+}
-+
- /**
- * sd_revalidate_disk - called the first time a new disk is seen,
- * performs disk spin up, read_capacity, etc.
-@@ -1877,8 +1889,12 @@ static int sd_revalidate_disk(struct gendisk *disk)
- */
- if (sdkp->media_present) {
- sd_read_capacity(sdkp, buffer);
-- sd_read_block_limits(sdkp);
-- sd_read_block_characteristics(sdkp);
-+
-+ if (sd_try_extended_inquiry(sdp)) {
-+ sd_read_block_limits(sdkp);
-+ sd_read_block_characteristics(sdkp);
-+ }
-+
- sd_read_write_protect_flag(sdkp, buffer);
- sd_read_cache_type(sdkp, buffer);
- sd_read_app_tag_own(sdkp, buffer);
-diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c
-index ef7870f..857b366 100644
---- a/drivers/video/console/sticore.c
-+++ b/drivers/video/console/sticore.c
-@@ -957,9 +957,14 @@ static int __devinit sticore_pci_init(struct pci_dev *pd,
- #ifdef CONFIG_PCI
- unsigned long fb_base, rom_base;
- unsigned int fb_len, rom_len;
-+ int err;
- struct sti_struct *sti;
-
-- pci_enable_device(pd);
-+ err = pci_enable_device(pd);
-+ if (err < 0) {
-+ dev_err(&pd->dev, "Cannot enable PCI device\n");
-+ return err;
-+ }
-
- fb_base = pci_resource_start(pd, 0);
- fb_len = pci_resource_len(pd, 0);
-@@ -1048,7 +1053,7 @@ static void __devinit sti_init_roms(void)
-
- /* Register drivers for native & PCI cards */
- register_parisc_driver(&pa_sti_driver);
-- pci_register_driver(&pci_sti_driver);
-+ WARN_ON(pci_register_driver(&pci_sti_driver));
-
- /* if we didn't find the given default sti, take the first one */
- if (!default_sti)
-diff --git a/drivers/watchdog/coh901327_wdt.c b/drivers/watchdog/coh901327_wdt.c
-index fecb307..aec7cef 100644
---- a/drivers/watchdog/coh901327_wdt.c
-+++ b/drivers/watchdog/coh901327_wdt.c
-@@ -18,6 +18,7 @@
- #include <linux/bitops.h>
- #include <linux/uaccess.h>
- #include <linux/clk.h>
-+#include <linux/delay.h>
-
- #define DRV_NAME "WDOG COH 901 327"
-
-@@ -92,6 +93,8 @@ static struct clk *clk;
- static void coh901327_enable(u16 timeout)
- {
- u16 val;
-+ unsigned long freq;
-+ unsigned long delay_ns;
-
- clk_enable(clk);
- /* Restart timer if it is disabled */
-@@ -102,6 +105,14 @@ static void coh901327_enable(u16 timeout)
- /* Acknowledge any pending interrupt so it doesn't just fire off */
- writew(U300_WDOG_IER_WILL_BARK_IRQ_ACK_ENABLE,
- virtbase + U300_WDOG_IER);
-+ /*
-+ * The interrupt is cleared in the 32 kHz clock domain.
-+ * Wait 3 32 kHz cycles for it to take effect
-+ */
-+ freq = clk_get_rate(clk);
-+ delay_ns = (1000000000 + freq - 1) / freq; /* Freq to ns and round up */
-+ delay_ns = 3 * delay_ns; /* Wait 3 cycles */
-+ ndelay(delay_ns);
- /* Enable the watchdog interrupt */
- writew(U300_WDOG_IMR_WILL_BARK_IRQ_ENABLE, virtbase + U300_WDOG_IMR);
- /* Activate the watchdog timer */
-diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
-index 92888aa..e85b1e4 100644
---- a/fs/cifs/CHANGES
-+++ b/fs/cifs/CHANGES
-@@ -1,3 +1,10 @@
-+Version 1.60
-+-------------
-+Fix memory leak in reconnect. Fix oops in DFS mount error path.
-+Set s_maxbytes to smaller (the max that vfs can handle) so that
-+sendfile will now work over cifs mounts again. Add noforcegid
-+and noforceuid mount parameters.
-+
- Version 1.59
- ------------
- Client uses server inode numbers (which are persistent) rather than
-diff --git a/fs/cifs/README b/fs/cifs/README
-index ad92921..79c1a93 100644
---- a/fs/cifs/README
-+++ b/fs/cifs/README
-@@ -262,11 +262,11 @@ A partial list of the supported mount options follows:
- mount.
- domain Set the SMB/CIFS workgroup name prepended to the
- username during CIFS session establishment
-- forceuid Set the default uid for inodes based on the uid
-- passed in. For mounts to servers
-+ forceuid Set the default uid for inodes to the uid
-+ passed in on mount. For mounts to servers
- which do support the CIFS Unix extensions, such as a
- properly configured Samba server, the server provides
-- the uid, gid and mode so this parameter should not be
-+ the uid, gid and mode so this parameter should not be
- specified unless the server and clients uid and gid
- numbering differ. If the server and client are in the
- same domain (e.g. running winbind or nss_ldap) and
-@@ -278,11 +278,7 @@ A partial list of the supported mount options follows:
- of existing files will be the uid (gid) of the person
- who executed the mount (root, except when mount.cifs
- is configured setuid for user mounts) unless the "uid="
-- (gid) mount option is specified. For the uid (gid) of newly
-- created files and directories, ie files created since
-- the last mount of the server share, the expected uid
-- (gid) is cached as long as the inode remains in
-- memory on the client. Also note that permission
-+ (gid) mount option is specified. Also note that permission
- checks (authorization checks) on accesses to a file occur
- at the server, but there are cases in which an administrator
- may want to restrict at the client as well. For those
-@@ -290,12 +286,15 @@ A partial list of the supported mount options follows:
- (such as Windows), permissions can also be checked at the
- client, and a crude form of client side permission checking
- can be enabled by specifying file_mode and dir_mode on
-- the client. Note that the mount.cifs helper must be
-- at version 1.10 or higher to support specifying the uid
-- (or gid) in non-numeric form.
-- forcegid (similar to above but for the groupid instead of uid)
-+ the client. (default)
-+ forcegid (similar to above but for the groupid instead of uid) (default)
-+ noforceuid Fill in file owner information (uid) by requesting it from
-+ the server if possible. With this option, the value given in
-+ the uid= option (on mount) will only be used if the server
-+ can not support returning uids on inodes.
-+ noforcegid (similar to above but for the group owner, gid, instead of uid)
- uid Set the default uid for inodes, and indicate to the
-- cifs kernel driver which local user mounted . If the server
-+ cifs kernel driver which local user mounted. If the server
- supports the unix extensions the default uid is
- not used to fill in the owner fields of inodes (files)
- unless the "forceuid" parameter is specified.
-diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
-index 3bb11be..606912d 100644
---- a/fs/cifs/cifs_dfs_ref.c
-+++ b/fs/cifs/cifs_dfs_ref.c
-@@ -55,7 +55,7 @@ void cifs_dfs_release_automount_timer(void)
- * i.e. strips from UNC trailing path that is not part of share
- * name and fixup missing '\' in the begining of DFS node refferal
- * if neccessary.
-- * Returns pointer to share name on success or NULL on error.
-+ * Returns pointer to share name on success or ERR_PTR on error.
- * Caller is responsible for freeing returned string.
- */
- static char *cifs_get_share_name(const char *node_name)
-@@ -68,7 +68,7 @@ static char *cifs_get_share_name(const char *node_name)
- UNC = kmalloc(len+2 /*for term null and additional \ if it's missed */,
- GFP_KERNEL);
- if (!UNC)
-- return NULL;
-+ return ERR_PTR(-ENOMEM);
-
- /* get share name and server name */
- if (node_name[1] != '\\') {
-@@ -87,7 +87,7 @@ static char *cifs_get_share_name(const char *node_name)
- cERROR(1, ("%s: no server name end in node name: %s",
- __func__, node_name));
- kfree(UNC);
-- return NULL;
-+ return ERR_PTR(-EINVAL);
- }
-
- /* find sharename end */
-@@ -133,6 +133,12 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
- return ERR_PTR(-EINVAL);
-
- *devname = cifs_get_share_name(ref->node_name);
-+ if (IS_ERR(*devname)) {
-+ rc = PTR_ERR(*devname);
-+ *devname = NULL;
-+ goto compose_mount_options_err;
-+ }
-+
- rc = dns_resolve_server_name_to_ip(*devname, &srvIP);
- if (rc != 0) {
- cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d",
-diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
-index 60e3c42..714a542 100644
---- a/fs/cifs/cifs_unicode.c
-+++ b/fs/cifs/cifs_unicode.c
-@@ -44,7 +44,7 @@ cifs_ucs2_bytes(const __le16 *from, int maxbytes,
- int maxwords = maxbytes / 2;
- char tmp[NLS_MAX_CHARSET_SIZE];
-
-- for (i = 0; from[i] && i < maxwords; i++) {
-+ for (i = 0; i < maxwords && from[i]; i++) {
- charlen = codepage->uni2char(le16_to_cpu(from[i]), tmp,
- NLS_MAX_CHARSET_SIZE);
- if (charlen > 0)
-diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
-index 44f3050..84b7525 100644
---- a/fs/cifs/cifsfs.c
-+++ b/fs/cifs/cifsfs.c
-@@ -376,10 +376,14 @@ cifs_show_options(struct seq_file *s, struct vfsmount *m)
- seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
- seq_printf(s, ",forceuid");
-+ else
-+ seq_printf(s, ",noforceuid");
-
- seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
- seq_printf(s, ",forcegid");
-+ else
-+ seq_printf(s, ",noforcegid");
-
- cifs_show_address(s, tcon->ses->server);
-
-diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
-index fc44d31..1f3345d 100644
---- a/fs/cifs/connect.c
-+++ b/fs/cifs/connect.c
-@@ -803,6 +803,10 @@ cifs_parse_mount_options(char *options, const char *devname,
- char *data;
- unsigned int temp_len, i, j;
- char separator[2];
-+ short int override_uid = -1;
-+ short int override_gid = -1;
-+ bool uid_specified = false;
-+ bool gid_specified = false;
-
- separator[0] = ',';
- separator[1] = 0;
-@@ -1093,18 +1097,20 @@ cifs_parse_mount_options(char *options, const char *devname,
- "too long.\n");
- return 1;
- }
-- } else if (strnicmp(data, "uid", 3) == 0) {
-- if (value && *value)
-- vol->linux_uid =
-- simple_strtoul(value, &value, 0);
-- } else if (strnicmp(data, "forceuid", 8) == 0) {
-- vol->override_uid = 1;
-- } else if (strnicmp(data, "gid", 3) == 0) {
-- if (value && *value)
-- vol->linux_gid =
-- simple_strtoul(value, &value, 0);
-- } else if (strnicmp(data, "forcegid", 8) == 0) {
-- vol->override_gid = 1;
-+ } else if (!strnicmp(data, "uid", 3) && value && *value) {
-+ vol->linux_uid = simple_strtoul(value, &value, 0);
-+ uid_specified = true;
-+ } else if (!strnicmp(data, "forceuid", 8)) {
-+ override_uid = 1;
-+ } else if (!strnicmp(data, "noforceuid", 10)) {
-+ override_uid = 0;
-+ } else if (!strnicmp(data, "gid", 3) && value && *value) {
-+ vol->linux_gid = simple_strtoul(value, &value, 0);
-+ gid_specified = true;
-+ } else if (!strnicmp(data, "forcegid", 8)) {
-+ override_gid = 1;
-+ } else if (!strnicmp(data, "noforcegid", 10)) {
-+ override_gid = 0;
- } else if (strnicmp(data, "file_mode", 4) == 0) {
- if (value && *value) {
- vol->file_mode =
-@@ -1355,6 +1361,18 @@ cifs_parse_mount_options(char *options, const char *devname,
- if (vol->UNCip == NULL)
- vol->UNCip = &vol->UNC[2];
-
-+ if (uid_specified)
-+ vol->override_uid = override_uid;
-+ else if (override_uid == 1)
-+ printk(KERN_NOTICE "CIFS: ignoring forceuid mount option "
-+ "specified with no uid= option.\n");
-+
-+ if (gid_specified)
-+ vol->override_gid = override_gid;
-+ else if (override_gid == 1)
-+ printk(KERN_NOTICE "CIFS: ignoring forcegid mount option "
-+ "specified with no gid= option.\n");
-+
- return 0;
- }
-
-@@ -2544,11 +2562,20 @@ remote_path_check:
-
- if (mount_data != mount_data_global)
- kfree(mount_data);
-+
- mount_data = cifs_compose_mount_options(
- cifs_sb->mountdata, full_path + 1,
- referrals, &fake_devname);
-- kfree(fake_devname);
-+
- free_dfs_info_array(referrals, num_referrals);
-+ kfree(fake_devname);
-+ kfree(full_path);
-+
-+ if (IS_ERR(mount_data)) {
-+ rc = PTR_ERR(mount_data);
-+ mount_data = NULL;
-+ goto mount_fail_check;
-+ }
-
- if (tcon)
- cifs_put_tcon(tcon);
-@@ -2556,8 +2583,6 @@ remote_path_check:
- cifs_put_smb_ses(pSesInfo);
-
- cleanup_volume_info(&volume_info);
-- FreeXid(xid);
-- kfree(full_path);
- referral_walks_count++;
- goto try_mount_again;
- }
-diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
-index 3d3ddb3..2dfd477 100644
---- a/fs/nilfs2/mdt.c
-+++ b/fs/nilfs2/mdt.c
-@@ -412,8 +412,10 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
- return 0; /* Do not request flush for shadow page cache */
- if (!sb) {
- writer = nilfs_get_writer(NILFS_MDT(inode)->mi_nilfs);
-- if (!writer)
-+ if (!writer) {
-+ nilfs_put_writer(NILFS_MDT(inode)->mi_nilfs);
- return -EROFS;
-+ }
- sb = writer->s_super;
- }
-
-diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
-index 8b5e477..51ff3d0 100644
---- a/fs/nilfs2/segment.c
-+++ b/fs/nilfs2/segment.c
-@@ -1859,12 +1859,26 @@ static void nilfs_end_page_io(struct page *page, int err)
- if (!page)
- return;
-
-- if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page))
-+ if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) {
- /*
- * For b-tree node pages, this function may be called twice
- * or more because they might be split in a segment.
- */
-+ if (PageDirty(page)) {
-+ /*
-+ * For pages holding split b-tree node buffers, dirty
-+ * flag on the buffers may be cleared discretely.
-+ * In that case, the page is once redirtied for
-+ * remaining buffers, and it must be cancelled if
-+ * all the buffers get cleaned later.
-+ */
-+ lock_page(page);
-+ if (nilfs_page_buffers_clean(page))
-+ __nilfs_clear_page_dirty(page);
-+ unlock_page(page);
-+ }
- return;
-+ }
-
- __nilfs_end_page_io(page, err);
- }
-diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h
-index 3e79859..ab0b85c 100644
---- a/include/acpi/acpiosxf.h
-+++ b/include/acpi/acpiosxf.h
-@@ -242,6 +242,10 @@ acpi_os_derive_pci_id(acpi_handle rhandle,
- acpi_status acpi_os_validate_interface(char *interface);
- acpi_status acpi_osi_invalidate(char* interface);
-
-+acpi_status
-+acpi_os_validate_address(u8 space_id, acpi_physical_address address,
-+ acpi_size length, char *name);
-+
- u64 acpi_os_get_timer(void);
-
- acpi_status acpi_os_signal(u32 function, void *info);
-diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
-index 7174818..9d4c004 100644
---- a/include/drm/drm_pciids.h
-+++ b/include/drm/drm_pciids.h
-@@ -257,9 +257,12 @@
- {0x1002, 0x940F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x94A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x94A1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
-+ {0x1002, 0x94A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x94B1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x94B3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_NEW_MEMMAP}, \
-+ {0x1002, 0x94B4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x94B5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_NEW_MEMMAP}, \
-+ {0x1002, 0x94B9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV740|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9441, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9442, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
-@@ -288,6 +291,7 @@
- {0x1002, 0x948F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9490, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9491, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
-+ {0x1002, 0x9495, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9498, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x949C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x949E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
-@@ -325,6 +329,7 @@
- {0x1002, 0x9552, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9553, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9555, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
-+ {0x1002, 0x9557, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9580, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9581, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
- {0x1002, 0x9583, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
-diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
-index e7cb5db..69103e0 100644
---- a/include/linux/blkdev.h
-+++ b/include/linux/blkdev.h
-@@ -913,6 +913,7 @@ extern void blk_queue_logical_block_size(struct request_queue *, unsigned short)
- extern void blk_queue_physical_block_size(struct request_queue *, unsigned short);
- extern void blk_queue_alignment_offset(struct request_queue *q,
- unsigned int alignment);
-+extern void blk_limits_io_min(struct queue_limits *limits, unsigned int min);
- extern void blk_queue_io_min(struct request_queue *q, unsigned int min);
- extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);
- extern void blk_set_default_limits(struct queue_limits *lim);
-diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
-index acef2a7..ad27c7d 100644
---- a/include/linux/inetdevice.h
-+++ b/include/linux/inetdevice.h
-@@ -82,7 +82,7 @@ static inline void ipv4_devconf_setall(struct in_device *in_dev)
-
- #define IN_DEV_FORWARD(in_dev) IN_DEV_CONF_GET((in_dev), FORWARDING)
- #define IN_DEV_MFORWARD(in_dev) IN_DEV_ANDCONF((in_dev), MC_FORWARDING)
--#define IN_DEV_RPFILTER(in_dev) IN_DEV_ANDCONF((in_dev), RP_FILTER)
-+#define IN_DEV_RPFILTER(in_dev) IN_DEV_MAXCONF((in_dev), RP_FILTER)
- #define IN_DEV_SOURCE_ROUTE(in_dev) IN_DEV_ANDCONF((in_dev), \
- ACCEPT_SOURCE_ROUTE)
- #define IN_DEV_BOOTP_RELAY(in_dev) IN_DEV_ANDCONF((in_dev), BOOTP_RELAY)
-diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h
-index bd15d7a..e604e6e 100644
---- a/include/linux/perf_counter.h
-+++ b/include/linux/perf_counter.h
-@@ -181,8 +181,9 @@ struct perf_counter_attr {
- freq : 1, /* use freq, not period */
- inherit_stat : 1, /* per task counts */
- enable_on_exec : 1, /* next exec enables */
-+ task : 1, /* trace fork/exit */
-
-- __reserved_1 : 51;
-+ __reserved_1 : 50;
-
- __u32 wakeup_events; /* wakeup every n events */
- __u32 __reserved_2;
-@@ -311,6 +312,15 @@ enum perf_event_type {
- /*
- * struct {
- * struct perf_event_header header;
-+ * u32 pid, ppid;
-+ * u32 tid, ptid;
-+ * };
-+ */
-+ PERF_EVENT_EXIT = 4,
-+
-+ /*
-+ * struct {
-+ * struct perf_event_header header;
- * u64 time;
- * u64 id;
- * u64 stream_id;
-@@ -323,6 +333,7 @@ enum perf_event_type {
- * struct {
- * struct perf_event_header header;
- * u32 pid, ppid;
-+ * u32 tid, ptid;
- * };
- */
- PERF_EVENT_FORK = 7,
-diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h
-index 40f38d8..0c4ee9b 100644
---- a/include/linux/tty_ldisc.h
-+++ b/include/linux/tty_ldisc.h
-@@ -144,7 +144,7 @@ struct tty_ldisc_ops {
-
- struct tty_ldisc {
- struct tty_ldisc_ops *ops;
-- int refcount;
-+ atomic_t users;
- };
-
- #define TTY_LDISC_MAGIC 0x5403
-diff --git a/include/net/bluetooth/rfcomm.h b/include/net/bluetooth/rfcomm.h
-index 8007261..c274993 100644
---- a/include/net/bluetooth/rfcomm.h
-+++ b/include/net/bluetooth/rfcomm.h
-@@ -355,7 +355,17 @@ struct rfcomm_dev_list_req {
- };
-
- int rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
-+
-+#ifdef CONFIG_BT_RFCOMM_TTY
- int rfcomm_init_ttys(void);
- void rfcomm_cleanup_ttys(void);
--
-+#else
-+static inline int rfcomm_init_ttys(void)
-+{
-+ return 0;
-+}
-+static inline void rfcomm_cleanup_ttys(void)
-+{
-+}
-+#endif
- #endif /* __RFCOMM_H */
-diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
-index 1a21895..d1892d6 100644
---- a/include/net/cfg80211.h
-+++ b/include/net/cfg80211.h
-@@ -979,6 +979,10 @@ struct cfg80211_ops {
- * channels at a later time. This can be used for devices which do not
- * have calibration information gauranteed for frequencies or settings
- * outside of its regulatory domain.
-+ * @disable_beacon_hints: enable this if your driver needs to ensure that
-+ * passive scan flags and beaconing flags may not be lifted by cfg80211
-+ * due to regulatory beacon hints. For more information on beacon
-+ * hints read the documenation for regulatory_hint_found_beacon()
- * @reg_notifier: the driver's regulatory notification callback
- * @regd: the driver's regulatory domain, if one was requested via
- * the regulatory_hint() API. This can be used by the driver
-@@ -1004,6 +1008,7 @@ struct wiphy {
-
- bool custom_regulatory;
- bool strict_regulatory;
-+ bool disable_beacon_hints;
-
- enum cfg80211_signal_type signal_type;
-
-diff --git a/init/Kconfig b/init/Kconfig
-index cb2c092..3f7e609 100644
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -940,6 +940,7 @@ menu "Performance Counters"
-
- config PERF_COUNTERS
- bool "Kernel Performance Counters"
-+ default y if PROFILING
- depends on HAVE_PERF_COUNTERS
- select ANON_INODES
- help
-@@ -961,9 +962,17 @@ config PERF_COUNTERS
- Say Y if unsure.
-
- config EVENT_PROFILE
-- bool "Tracepoint profile sources"
-+ bool "Tracepoint profiling sources"
- depends on PERF_COUNTERS && EVENT_TRACING
- default y
-+ help
-+ Allow the use of tracepoints as software performance counters.
-+
-+ When this is enabled, you can create perf counters based on
-+ tracepoints using PERF_TYPE_TRACEPOINT and the tracepoint ID
-+ found in debugfs://tracing/events/*/*/id. (The -e/--events
-+ option to the perf tool can parse and interpret symbolic
-+ tracepoints, in the subsystem:tracepoint_name format.)
-
- endmenu
-
-diff --git a/kernel/fork.c b/kernel/fork.c
-index 29b532e..466531e 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -1269,6 +1269,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
- write_unlock_irq(&tasklist_lock);
- proc_fork_connector(p);
- cgroup_post_fork(p);
-+ perf_counter_fork(p);
- return p;
-
- bad_fork_free_pid:
-@@ -1410,9 +1411,6 @@ long do_fork(unsigned long clone_flags,
- init_completion(&vfork);
- }
-
-- if (!(clone_flags & CLONE_THREAD))
-- perf_counter_fork(p);
--
- audit_finish_fork(p);
- tracehook_report_clone(regs, clone_flags, nr, p);
-
-diff --git a/kernel/panic.c b/kernel/panic.c
-index 984b3ec..512ab73 100644
---- a/kernel/panic.c
-+++ b/kernel/panic.c
-@@ -301,6 +301,7 @@ int oops_may_print(void)
- */
- void oops_enter(void)
- {
-+ tracing_off();
- /* can't trust the integrity of the kernel anymore: */
- debug_locks_off();
- do_oops_enter_exit();
-diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
-index 9509310..199ed47 100644
---- a/kernel/perf_counter.c
-+++ b/kernel/perf_counter.c
-@@ -42,6 +42,7 @@ static int perf_overcommit __read_mostly = 1;
- static atomic_t nr_counters __read_mostly;
- static atomic_t nr_mmap_counters __read_mostly;
- static atomic_t nr_comm_counters __read_mostly;
-+static atomic_t nr_task_counters __read_mostly;
-
- /*
- * perf counter paranoia level:
-@@ -1654,6 +1655,8 @@ static void free_counter(struct perf_counter *counter)
- atomic_dec(&nr_mmap_counters);
- if (counter->attr.comm)
- atomic_dec(&nr_comm_counters);
-+ if (counter->attr.task)
-+ atomic_dec(&nr_task_counters);
- }
-
- if (counter->destroy)
-@@ -1688,6 +1691,18 @@ static int perf_release(struct inode *inode, struct file *file)
- return 0;
- }
-
-+static u64 perf_counter_read_tree(struct perf_counter *counter)
-+{
-+ struct perf_counter *child;
-+ u64 total = 0;
-+
-+ total += perf_counter_read(counter);
-+ list_for_each_entry(child, &counter->child_list, child_list)
-+ total += perf_counter_read(child);
-+
-+ return total;
-+}
-+
- /*
- * Read the performance counter - simple non blocking version for now
- */
-@@ -1707,7 +1722,7 @@ perf_read_hw(struct perf_counter *counter, char __user *buf, size_t count)
-
- WARN_ON_ONCE(counter->ctx->parent_ctx);
- mutex_lock(&counter->child_mutex);
-- values[0] = perf_counter_read(counter);
-+ values[0] = perf_counter_read_tree(counter);
- n = 1;
- if (counter->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
- values[n++] = counter->total_time_enabled +
-@@ -2819,10 +2834,12 @@ perf_counter_read_event(struct perf_counter *counter,
- }
-
- /*
-- * fork tracking
-+ * task tracking -- fork/exit
-+ *
-+ * enabled by: attr.comm | attr.mmap | attr.task
- */
-
--struct perf_fork_event {
-+struct perf_task_event {
- struct task_struct *task;
-
- struct {
-@@ -2830,37 +2847,42 @@ struct perf_fork_event {
-
- u32 pid;
- u32 ppid;
-+ u32 tid;
-+ u32 ptid;
- } event;
- };
-
--static void perf_counter_fork_output(struct perf_counter *counter,
-- struct perf_fork_event *fork_event)
-+static void perf_counter_task_output(struct perf_counter *counter,
-+ struct perf_task_event *task_event)
- {
- struct perf_output_handle handle;
-- int size = fork_event->event.header.size;
-- struct task_struct *task = fork_event->task;
-+ int size = task_event->event.header.size;
-+ struct task_struct *task = task_event->task;
- int ret = perf_output_begin(&handle, counter, size, 0, 0);
-
- if (ret)
- return;
-
-- fork_event->event.pid = perf_counter_pid(counter, task);
-- fork_event->event.ppid = perf_counter_pid(counter, task->real_parent);
-+ task_event->event.pid = perf_counter_pid(counter, task);
-+ task_event->event.ppid = perf_counter_pid(counter, task->real_parent);
-
-- perf_output_put(&handle, fork_event->event);
-+ task_event->event.tid = perf_counter_tid(counter, task);
-+ task_event->event.ptid = perf_counter_tid(counter, task->real_parent);
-+
-+ perf_output_put(&handle, task_event->event);
- perf_output_end(&handle);
- }
-
--static int perf_counter_fork_match(struct perf_counter *counter)
-+static int perf_counter_task_match(struct perf_counter *counter)
- {
-- if (counter->attr.comm || counter->attr.mmap)
-+ if (counter->attr.comm || counter->attr.mmap || counter->attr.task)
- return 1;
-
- return 0;
- }
-
--static void perf_counter_fork_ctx(struct perf_counter_context *ctx,
-- struct perf_fork_event *fork_event)
-+static void perf_counter_task_ctx(struct perf_counter_context *ctx,
-+ struct perf_task_event *task_event)
- {
- struct perf_counter *counter;
-
-@@ -2869,19 +2891,19 @@ static void perf_counter_fork_ctx(struct perf_counter_context *ctx,
-
- rcu_read_lock();
- list_for_each_entry_rcu(counter, &ctx->event_list, event_entry) {
-- if (perf_counter_fork_match(counter))
-- perf_counter_fork_output(counter, fork_event);
-+ if (perf_counter_task_match(counter))
-+ perf_counter_task_output(counter, task_event);
- }
- rcu_read_unlock();
- }
-
--static void perf_counter_fork_event(struct perf_fork_event *fork_event)
-+static void perf_counter_task_event(struct perf_task_event *task_event)
- {
- struct perf_cpu_context *cpuctx;
- struct perf_counter_context *ctx;
-
- cpuctx = &get_cpu_var(perf_cpu_context);
-- perf_counter_fork_ctx(&cpuctx->ctx, fork_event);
-+ perf_counter_task_ctx(&cpuctx->ctx, task_event);
- put_cpu_var(perf_cpu_context);
-
- rcu_read_lock();
-@@ -2891,32 +2913,40 @@ static void perf_counter_fork_event(struct perf_fork_event *fork_event)
- */
- ctx = rcu_dereference(current->perf_counter_ctxp);
- if (ctx)
-- perf_counter_fork_ctx(ctx, fork_event);
-+ perf_counter_task_ctx(ctx, task_event);
- rcu_read_unlock();
- }
-
--void perf_counter_fork(struct task_struct *task)
-+static void perf_counter_task(struct task_struct *task, int new)
- {
-- struct perf_fork_event fork_event;
-+ struct perf_task_event task_event;
-
- if (!atomic_read(&nr_comm_counters) &&
-- !atomic_read(&nr_mmap_counters))
-+ !atomic_read(&nr_mmap_counters) &&
-+ !atomic_read(&nr_task_counters))
- return;
-
-- fork_event = (struct perf_fork_event){
-+ task_event = (struct perf_task_event){
- .task = task,
- .event = {
- .header = {
-- .type = PERF_EVENT_FORK,
-+ .type = new ? PERF_EVENT_FORK : PERF_EVENT_EXIT,
- .misc = 0,
-- .size = sizeof(fork_event.event),
-+ .size = sizeof(task_event.event),
- },
- /* .pid */
- /* .ppid */
-+ /* .tid */
-+ /* .ptid */
- },
- };
-
-- perf_counter_fork_event(&fork_event);
-+ perf_counter_task_event(&task_event);
-+}
-+
-+void perf_counter_fork(struct task_struct *task)
-+{
-+ perf_counter_task(task, 1);
- }
-
- /*
-@@ -3875,6 +3905,8 @@ done:
- atomic_inc(&nr_mmap_counters);
- if (counter->attr.comm)
- atomic_inc(&nr_comm_counters);
-+ if (counter->attr.task)
-+ atomic_inc(&nr_task_counters);
- }
-
- return counter;
-@@ -4236,8 +4268,10 @@ void perf_counter_exit_task(struct task_struct *child)
- struct perf_counter_context *child_ctx;
- unsigned long flags;
-
-- if (likely(!child->perf_counter_ctxp))
-+ if (likely(!child->perf_counter_ctxp)) {
-+ perf_counter_task(child, 0);
- return;
-+ }
-
- local_irq_save(flags);
- /*
-@@ -4255,15 +4289,22 @@ void perf_counter_exit_task(struct task_struct *child)
- * incremented the context's refcount before we do put_ctx below.
- */
- spin_lock(&child_ctx->lock);
-- child->perf_counter_ctxp = NULL;
- /*
- * If this context is a clone; unclone it so it can't get
- * swapped to another process while we're removing all
- * the counters from it.
- */
- unclone_ctx(child_ctx);
-- spin_unlock(&child_ctx->lock);
-- local_irq_restore(flags);
-+ spin_unlock_irqrestore(&child_ctx->lock, flags);
-+
-+ /*
-+ * Report the task dead after unscheduling the counters so that we
-+ * won't get any samples after PERF_EVENT_EXIT. We can however still
-+ * get a few PERF_EVENT_READ events.
-+ */
-+ perf_counter_task(child, 0);
-+
-+ child->perf_counter_ctxp = NULL;
-
- /*
- * We can recurse on the same lock type through:
-diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
-index 052ec4d..d089d05 100644
---- a/kernel/posix-timers.c
-+++ b/kernel/posix-timers.c
-@@ -202,6 +202,12 @@ static int no_timer_create(struct k_itimer *new_timer)
- return -EOPNOTSUPP;
- }
-
-+static int no_nsleep(const clockid_t which_clock, int flags,
-+ struct timespec *tsave, struct timespec __user *rmtp)
-+{
-+ return -EOPNOTSUPP;
-+}
-+
- /*
- * Return nonzero if we know a priori this clockid_t value is bogus.
- */
-@@ -254,6 +260,7 @@ static __init int init_posix_timers(void)
- .clock_get = posix_get_monotonic_raw,
- .clock_set = do_posix_clock_nosettime,
- .timer_create = no_timer_create,
-+ .nsleep = no_nsleep,
- };
-
- register_posix_clock(CLOCK_REALTIME, &clock_realtime);
-diff --git a/kernel/sched_cpupri.c b/kernel/sched_cpupri.c
-index e6c2517..d014efb 100644
---- a/kernel/sched_cpupri.c
-+++ b/kernel/sched_cpupri.c
-@@ -81,8 +81,21 @@ int cpupri_find(struct cpupri *cp, struct task_struct *p,
- if (cpumask_any_and(&p->cpus_allowed, vec->mask) >= nr_cpu_ids)
- continue;
-
-- if (lowest_mask)
-+ if (lowest_mask) {
- cpumask_and(lowest_mask, &p->cpus_allowed, vec->mask);
-+
-+ /*
-+ * We have to ensure that we have at least one bit
-+ * still set in the array, since the map could have
-+ * been concurrently emptied between the first and
-+ * second reads of vec->mask. If we hit this
-+ * condition, simply act as though we never hit this
-+ * priority level and continue on.
-+ */
-+ if (cpumask_any(lowest_mask) >= nr_cpu_ids)
-+ continue;
-+ }
-+
- return 1;
- }
-
-diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
-index 9ffb2b2..652e8bd 100644
---- a/kernel/sched_fair.c
-+++ b/kernel/sched_fair.c
-@@ -611,9 +611,13 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
- static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
- {
- #ifdef CONFIG_SCHEDSTATS
-+ struct task_struct *tsk = NULL;
-+
-+ if (entity_is_task(se))
-+ tsk = task_of(se);
-+
- if (se->sleep_start) {
- u64 delta = rq_of(cfs_rq)->clock - se->sleep_start;
-- struct task_struct *tsk = task_of(se);
-
- if ((s64)delta < 0)
- delta = 0;
-@@ -624,11 +628,11 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
- se->sleep_start = 0;
- se->sum_sleep_runtime += delta;
-
-- account_scheduler_latency(tsk, delta >> 10, 1);
-+ if (tsk)
-+ account_scheduler_latency(tsk, delta >> 10, 1);
- }
- if (se->block_start) {
- u64 delta = rq_of(cfs_rq)->clock - se->block_start;
-- struct task_struct *tsk = task_of(se);
-
- if ((s64)delta < 0)
- delta = 0;
-@@ -639,17 +643,19 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se)
- se->block_start = 0;
- se->sum_sleep_runtime += delta;
-
-- /*
-- * Blocking time is in units of nanosecs, so shift by 20 to
-- * get a milliseconds-range estimation of the amount of
-- * time that the task spent sleeping:
-- */
-- if (unlikely(prof_on == SLEEP_PROFILING)) {
--
-- profile_hits(SLEEP_PROFILING, (void *)get_wchan(tsk),
-- delta >> 20);
-+ if (tsk) {
-+ /*
-+ * Blocking time is in units of nanosecs, so shift by
-+ * 20 to get a milliseconds-range estimation of the
-+ * amount of time that the task spent sleeping:
-+ */
-+ if (unlikely(prof_on == SLEEP_PROFILING)) {
-+ profile_hits(SLEEP_PROFILING,
-+ (void *)get_wchan(tsk),
-+ delta >> 20);
-+ }
-+ account_scheduler_latency(tsk, delta >> 10, 0);
- }
-- account_scheduler_latency(tsk, delta >> 10, 0);
- }
- #endif
- }
-diff --git a/kernel/signal.c b/kernel/signal.c
-index ccf1cee..64c5dee 100644
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -2454,11 +2454,9 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
- stack_t oss;
- int error;
-
-- if (uoss) {
-- oss.ss_sp = (void __user *) current->sas_ss_sp;
-- oss.ss_size = current->sas_ss_size;
-- oss.ss_flags = sas_ss_flags(sp);
-- }
-+ oss.ss_sp = (void __user *) current->sas_ss_sp;
-+ oss.ss_size = current->sas_ss_size;
-+ oss.ss_flags = sas_ss_flags(sp);
-
- if (uss) {
- void __user *ss_sp;
-@@ -2466,10 +2464,12 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
- int ss_flags;
-
- error = -EFAULT;
-- if (!access_ok(VERIFY_READ, uss, sizeof(*uss))
-- || __get_user(ss_sp, &uss->ss_sp)
-- || __get_user(ss_flags, &uss->ss_flags)
-- || __get_user(ss_size, &uss->ss_size))
-+ if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
-+ goto out;
-+ error = __get_user(ss_sp, &uss->ss_sp) |
-+ __get_user(ss_flags, &uss->ss_flags) |
-+ __get_user(ss_size, &uss->ss_size);
-+ if (error)
- goto out;
-
- error = -EPERM;
-@@ -2501,13 +2501,16 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
- current->sas_ss_size = ss_size;
- }
-
-+ error = 0;
- if (uoss) {
- error = -EFAULT;
-- if (copy_to_user(uoss, &oss, sizeof(oss)))
-+ if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
- goto out;
-+ error = __put_user(oss.ss_sp, &uoss->ss_sp) |
-+ __put_user(oss.ss_size, &uoss->ss_size) |
-+ __put_user(oss.ss_flags, &uoss->ss_flags);
- }
-
-- error = 0;
- out:
- return error;
- }
-diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
-index 1f3ec2a..1e1d23c 100644
---- a/kernel/trace/ftrace.c
-+++ b/kernel/trace/ftrace.c
-@@ -1662,7 +1662,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable)
-
- mutex_lock(&ftrace_regex_lock);
- if ((file->f_mode & FMODE_WRITE) &&
-- !(file->f_flags & O_APPEND))
-+ (file->f_flags & O_TRUNC))
- ftrace_filter_reset(enable);
-
- if (file->f_mode & FMODE_READ) {
-@@ -2577,7 +2577,7 @@ ftrace_graph_open(struct inode *inode, struct file *file)
-
- mutex_lock(&graph_lock);
- if ((file->f_mode & FMODE_WRITE) &&
-- !(file->f_flags & O_APPEND)) {
-+ (file->f_flags & O_TRUNC)) {
- ftrace_graph_count = 0;
- memset(ftrace_graph_funcs, 0, sizeof(ftrace_graph_funcs));
- }
-diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
-index 8bc8d8a..8930e39 100644
---- a/kernel/trace/trace.c
-+++ b/kernel/trace/trace.c
-@@ -2031,7 +2031,7 @@ static int tracing_open(struct inode *inode, struct file *file)
-
- /* If this file was open for write, then erase contents */
- if ((file->f_mode & FMODE_WRITE) &&
-- !(file->f_flags & O_APPEND)) {
-+ (file->f_flags & O_TRUNC)) {
- long cpu = (long) inode->i_private;
-
- if (cpu == TRACE_PIPE_ALL_CPU)
-@@ -3085,7 +3085,8 @@ tracing_fill_pipe_page(size_t rem, struct trace_iterator *iter)
- break;
- }
-
-- trace_consume(iter);
-+ if (ret != TRACE_TYPE_NO_CONSUME)
-+ trace_consume(iter);
- rem -= count;
- if (!find_next_entry_inc(iter)) {
- rem = 0;
-@@ -4233,8 +4234,11 @@ static void __ftrace_dump(bool disable_tracing)
- iter.pos = -1;
-
- if (find_next_entry_inc(&iter) != NULL) {
-- print_trace_line(&iter);
-- trace_consume(&iter);
-+ int ret;
-+
-+ ret = print_trace_line(&iter);
-+ if (ret != TRACE_TYPE_NO_CONSUME)
-+ trace_consume(&iter);
- }
-
- trace_printk_seq(&iter.seq);
-diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
-index 53c8fd3..23d2972 100644
---- a/kernel/trace/trace_events.c
-+++ b/kernel/trace/trace_events.c
-@@ -376,7 +376,7 @@ ftrace_event_seq_open(struct inode *inode, struct file *file)
- const struct seq_operations *seq_ops;
-
- if ((file->f_mode & FMODE_WRITE) &&
-- !(file->f_flags & O_APPEND))
-+ (file->f_flags & O_TRUNC))
- ftrace_clear_events();
-
- seq_ops = inode->i_private;
-diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
-index d2249ab..420ec34 100644
---- a/kernel/trace/trace_functions_graph.c
-+++ b/kernel/trace/trace_functions_graph.c
-@@ -843,9 +843,16 @@ print_graph_function(struct trace_iterator *iter)
-
- switch (entry->type) {
- case TRACE_GRAPH_ENT: {
-- struct ftrace_graph_ent_entry *field;
-+ /*
-+ * print_graph_entry() may consume the current event,
-+ * thus @field may become invalid, so we need to save it.
-+ * sizeof(struct ftrace_graph_ent_entry) is very small,
-+ * it can be safely saved at the stack.
-+ */
-+ struct ftrace_graph_ent_entry *field, saved;
- trace_assign_type(field, entry);
-- return print_graph_entry(field, s, iter);
-+ saved = *field;
-+ return print_graph_entry(&saved, s, iter);
- }
- case TRACE_GRAPH_RET: {
- struct ftrace_graph_ret_entry *field;
-diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c
-index 7b62781..687699d 100644
---- a/kernel/trace/trace_printk.c
-+++ b/kernel/trace/trace_printk.c
-@@ -176,7 +176,7 @@ static int t_show(struct seq_file *m, void *v)
- const char *str = *fmt;
- int i;
-
-- seq_printf(m, "0x%lx : \"", (unsigned long)fmt);
-+ seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt);
-
- /*
- * Tabs and new lines need to be converted.
-diff --git a/lib/flex_array.c b/lib/flex_array.c
-index 0e7894c..08f1636 100644
---- a/lib/flex_array.c
-+++ b/lib/flex_array.c
-@@ -254,7 +254,6 @@ void *flex_array_get(struct flex_array *fa, int element_nr)
- {
- int part_nr = fa_element_to_part_nr(fa, element_nr);
- struct flex_array_part *part;
-- int index;
-
- if (element_nr >= fa->total_nr_elements)
- return NULL;
-@@ -264,6 +263,5 @@ void *flex_array_get(struct flex_array *fa, int element_nr)
- part = (struct flex_array_part *)&fa->parts[0];
- else
- part = fa->parts[part_nr];
-- index = index_inside_part(fa, element_nr);
- return &part->elements[index_inside_part(fa, element_nr)];
- }
-diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
-index e50566e..94b3388 100644
---- a/net/bluetooth/rfcomm/core.c
-+++ b/net/bluetooth/rfcomm/core.c
-@@ -2080,28 +2080,41 @@ static CLASS_ATTR(rfcomm_dlc, S_IRUGO, rfcomm_dlc_sysfs_show, NULL);
- /* ---- Initialization ---- */
- static int __init rfcomm_init(void)
- {
-+ int ret;
-+
- l2cap_load();
-
- hci_register_cb(&rfcomm_cb);
-
- rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
- if (IS_ERR(rfcomm_thread)) {
-- hci_unregister_cb(&rfcomm_cb);
-- return PTR_ERR(rfcomm_thread);
-+ ret = PTR_ERR(rfcomm_thread);
-+ goto out_thread;
- }
-
- if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0)
- BT_ERR("Failed to create RFCOMM info file");
-
-- rfcomm_init_sockets();
-+ ret = rfcomm_init_ttys();
-+ if (ret)
-+ goto out_tty;
-
--#ifdef CONFIG_BT_RFCOMM_TTY
-- rfcomm_init_ttys();
--#endif
-+ ret = rfcomm_init_sockets();
-+ if (ret)
-+ goto out_sock;
-
- BT_INFO("RFCOMM ver %s", VERSION);
-
- return 0;
-+
-+out_sock:
-+ rfcomm_cleanup_ttys();
-+out_tty:
-+ kthread_stop(rfcomm_thread);
-+out_thread:
-+ hci_unregister_cb(&rfcomm_cb);
-+
-+ return ret;
- }
-
- static void __exit rfcomm_exit(void)
-@@ -2112,9 +2125,7 @@ static void __exit rfcomm_exit(void)
-
- kthread_stop(rfcomm_thread);
-
--#ifdef CONFIG_BT_RFCOMM_TTY
- rfcomm_cleanup_ttys();
--#endif
-
- rfcomm_cleanup_sockets();
- }
-diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
-index 7f48278..0b85e81 100644
---- a/net/bluetooth/rfcomm/sock.c
-+++ b/net/bluetooth/rfcomm/sock.c
-@@ -1132,7 +1132,7 @@ error:
- return err;
- }
-
--void __exit rfcomm_cleanup_sockets(void)
-+void rfcomm_cleanup_sockets(void)
- {
- class_remove_file(bt_class, &class_attr_rfcomm);
-
-diff --git a/net/core/dev.c b/net/core/dev.c
-index 70c27e0..43e61ba 100644
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -3865,10 +3865,12 @@ int dev_unicast_delete(struct net_device *dev, void *addr)
-
- ASSERT_RTNL();
-
-+ netif_addr_lock_bh(dev);
- err = __hw_addr_del(&dev->uc, addr, dev->addr_len,
- NETDEV_HW_ADDR_T_UNICAST);
- if (!err)
- __dev_set_rx_mode(dev);
-+ netif_addr_unlock_bh(dev);
- return err;
- }
- EXPORT_SYMBOL(dev_unicast_delete);
-@@ -3889,10 +3891,12 @@ int dev_unicast_add(struct net_device *dev, void *addr)
-
- ASSERT_RTNL();
-
-+ netif_addr_lock_bh(dev);
- err = __hw_addr_add(&dev->uc, addr, dev->addr_len,
- NETDEV_HW_ADDR_T_UNICAST);
- if (!err)
- __dev_set_rx_mode(dev);
-+ netif_addr_unlock_bh(dev);
- return err;
- }
- EXPORT_SYMBOL(dev_unicast_add);
-@@ -3949,7 +3953,8 @@ void __dev_addr_unsync(struct dev_addr_list **to, int *to_count,
- * @from: source device
- *
- * Add newly added addresses to the destination device and release
-- * addresses that have no users left.
-+ * addresses that have no users left. The source device must be
-+ * locked by netif_tx_lock_bh.
- *
- * This function is intended to be called from the dev->set_rx_mode
- * function of layered software devices.
-@@ -3958,14 +3963,14 @@ int dev_unicast_sync(struct net_device *to, struct net_device *from)
- {
- int err = 0;
-
-- ASSERT_RTNL();
--
- if (to->addr_len != from->addr_len)
- return -EINVAL;
-
-+ netif_addr_lock_bh(to);
- err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len);
- if (!err)
- __dev_set_rx_mode(to);
-+ netif_addr_unlock_bh(to);
- return err;
- }
- EXPORT_SYMBOL(dev_unicast_sync);
-@@ -3981,28 +3986,30 @@ EXPORT_SYMBOL(dev_unicast_sync);
- */
- void dev_unicast_unsync(struct net_device *to, struct net_device *from)
- {
-- ASSERT_RTNL();
--
- if (to->addr_len != from->addr_len)
- return;
-
-+ netif_addr_lock_bh(from);
-+ netif_addr_lock(to);
- __hw_addr_unsync(&to->uc, &from->uc, to->addr_len);
- __dev_set_rx_mode(to);
-+ netif_addr_unlock(to);
-+ netif_addr_unlock_bh(from);
- }
- EXPORT_SYMBOL(dev_unicast_unsync);
-
- static void dev_unicast_flush(struct net_device *dev)
- {
-- /* rtnl_mutex must be held here */
--
-+ netif_addr_lock_bh(dev);
- __hw_addr_flush(&dev->uc);
-+ netif_addr_unlock_bh(dev);
- }
-
- static void dev_unicast_init(struct net_device *dev)
- {
-- /* rtnl_mutex must be held here */
--
-+ netif_addr_lock_bh(dev);
- __hw_addr_init(&dev->uc);
-+ netif_addr_unlock_bh(dev);
- }
-
-
-diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
-index b7292a2..1972830 100644
---- a/net/core/net_namespace.c
-+++ b/net/core/net_namespace.c
-@@ -488,7 +488,7 @@ int net_assign_generic(struct net *net, int id, void *data)
- */
-
- ng->len = id;
-- memcpy(&ng->ptr, &old_ng->ptr, old_ng->len);
-+ memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*));
-
- rcu_assign_pointer(net->gen, ng);
- call_rcu(&old_ng->rcu, net_generic_release);
-diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
-index c29d75d..090e999 100644
---- a/net/ipv4/arp.c
-+++ b/net/ipv4/arp.c
-@@ -1304,7 +1304,9 @@ static void arp_format_neigh_entry(struct seq_file *seq,
- hbuffer[k++] = hex_asc_lo(n->ha[j]);
- hbuffer[k++] = ':';
- }
-- hbuffer[--k] = 0;
-+ if (k != 0)
-+ --k;
-+ hbuffer[k] = 0;
- #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
- }
- #endif
-diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
-index aca22b0..07e7e41 100644
---- a/net/mac80211/mlme.c
-+++ b/net/mac80211/mlme.c
-@@ -721,7 +721,7 @@ void ieee80211_dynamic_ps_timer(unsigned long data)
- {
- struct ieee80211_local *local = (void *) data;
-
-- if (local->quiescing)
-+ if (local->quiescing || local->suspended)
- return;
-
- queue_work(local->hw.workqueue, &local->dynamic_ps_enable_work);
-diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
-index 7a549f9..5e3d476 100644
---- a/net/mac80211/pm.c
-+++ b/net/mac80211/pm.c
-@@ -55,15 +55,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
-
- rcu_read_unlock();
-
-- /* flush again, in case driver queued work */
-- flush_workqueue(local->hw.workqueue);
--
-- /* stop hardware - this must stop RX */
-- if (local->open_count) {
-- ieee80211_led_radio(local, false);
-- drv_stop(local);
-- }
--
- /* remove STAs */
- spin_lock_irqsave(&local->sta_lock, flags);
- list_for_each_entry(sta, &local->sta_list, list) {
-@@ -111,7 +102,22 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
- drv_remove_interface(local, &conf);
- }
-
-+ /* stop hardware - this must stop RX */
-+ if (local->open_count) {
-+ ieee80211_led_radio(local, false);
-+ drv_stop(local);
-+ }
-+
-+ /*
-+ * flush again, in case driver queued work -- it
-+ * shouldn't be doing (or cancel everything in the
-+ * stop callback) that but better safe than sorry.
-+ */
-+ flush_workqueue(local->hw.workqueue);
-+
- local->suspended = true;
-+ /* need suspended to be visible before quiescing is false */
-+ barrier();
- local->quiescing = false;
-
- return 0;
-diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
-index de5bba7..0936fc2 100644
---- a/net/mac80211/rx.c
-+++ b/net/mac80211/rx.c
-@@ -2453,6 +2453,18 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
- return;
- }
-
-+ /*
-+ * If we're suspending, it is possible although not too likely
-+ * that we'd be receiving frames after having already partially
-+ * quiesced the stack. We can't process such frames then since
-+ * that might, for example, cause stations to be added or other
-+ * driver callbacks be invoked.
-+ */
-+ if (unlikely(local->quiescing || local->suspended)) {
-+ kfree_skb(skb);
-+ return;
-+ }
-+
- if (status->flag & RX_FLAG_HT) {
- /* rate_idx is MCS index */
- if (WARN_ON(status->rate_idx < 0 ||
-diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c
-index b0e582f..16e6c43 100644
---- a/net/netlabel/netlabel_kapi.c
-+++ b/net/netlabel/netlabel_kapi.c
-@@ -151,7 +151,7 @@ int netlbl_cfg_unlbl_map_add(const char *domain,
- addr6 = addr;
- mask6 = mask;
- map6 = kzalloc(sizeof(*map6), GFP_ATOMIC);
-- if (map4 == NULL)
-+ if (map6 == NULL)
- goto cfg_unlbl_map_add_failure;
- map6->type = NETLBL_NLTYPE_UNLABELED;
- ipv6_addr_copy(&map6->list.addr, addr6);
-diff --git a/net/wireless/reg.c b/net/wireless/reg.c
-index 5e14371..75a406d 100644
---- a/net/wireless/reg.c
-+++ b/net/wireless/reg.c
-@@ -1089,17 +1089,18 @@ static void handle_reg_beacon(struct wiphy *wiphy,
-
- chan->beacon_found = true;
-
-+ if (wiphy->disable_beacon_hints)
-+ return;
-+
- chan_before.center_freq = chan->center_freq;
- chan_before.flags = chan->flags;
-
-- if ((chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
-- !(chan->orig_flags & IEEE80211_CHAN_PASSIVE_SCAN)) {
-+ if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) {
- chan->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
- channel_changed = true;
- }
-
-- if ((chan->flags & IEEE80211_CHAN_NO_IBSS) &&
-- !(chan->orig_flags & IEEE80211_CHAN_NO_IBSS)) {
-+ if (chan->flags & IEEE80211_CHAN_NO_IBSS) {
- chan->flags &= ~IEEE80211_CHAN_NO_IBSS;
- channel_changed = true;
- }
-diff --git a/net/wireless/reg.h b/net/wireless/reg.h
-index e37829a..4e167a8 100644
---- a/net/wireless/reg.h
-+++ b/net/wireless/reg.h
-@@ -30,7 +30,8 @@ int set_regdom(const struct ieee80211_regdomain *rd);
- * non-radar 5 GHz channels.
- *
- * Drivers do not need to call this, cfg80211 will do it for after a scan
-- * on a newly found BSS.
-+ * on a newly found BSS. If you cannot make use of this feature you can
-+ * set the wiphy->disable_beacon_hints to true.
- */
- int regulatory_hint_found_beacon(struct wiphy *wiphy,
- struct ieee80211_channel *beacon_chan,
-diff --git a/net/wireless/scan.c b/net/wireless/scan.c
-index 9271118..7e595ce 100644
---- a/net/wireless/scan.c
-+++ b/net/wireless/scan.c
-@@ -118,7 +118,7 @@ static int cmp_ies(u8 num, u8 *ies1, size_t len1, u8 *ies2, size_t len2)
-
- if (!ie1 && !ie2)
- return 0;
-- if (!ie1)
-+ if (!ie1 || !ie2)
- return -1;
-
- r = memcmp(ie1 + 2, ie2 + 2, min(ie1[1], ie2[1]));
-@@ -171,6 +171,8 @@ static bool is_mesh(struct cfg80211_bss *a,
- ie = find_ie(WLAN_EID_MESH_CONFIG,
- a->information_elements,
- a->len_information_elements);
-+ if (!ie)
-+ return false;
- if (ie[1] != IEEE80211_MESH_CONFIG_LEN)
- return false;
-
-diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
-index 7109e2b..d29baa2 100755
---- a/scripts/recordmcount.pl
-+++ b/scripts/recordmcount.pl
-@@ -403,7 +403,6 @@ while (<IN>) {
- # section found, now is this a start of a function?
- } elsif ($read_function && /$function_regex/) {
- $text_found = 1;
-- $offset = hex $1;
- $text = $2;
-
- # if this is either a local function or a weak function
-@@ -412,10 +411,12 @@ while (<IN>) {
- if (!defined($locals{$text}) && !defined($weak{$text})) {
- $ref_func = $text;
- $read_function = 0;
-+ $offset = hex $1;
- } else {
- # if we already have a function, and this is weak, skip it
-- if (!defined($ref_func) || !defined($weak{$text})) {
-+ if (!defined($ref_func) && !defined($weak{$text})) {
- $ref_func = $text;
-+ $offset = hex $1;
- }
- }
- } elsif ($read_headers && /$mcount_section/) {
-diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
-index 88480c0..c7df01b 100644
---- a/sound/pci/hda/hda_codec.c
-+++ b/sound/pci/hda/hda_codec.c
-@@ -174,7 +174,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,
- mutex_lock(&bus->cmd_mutex);
- err = bus->ops.command(bus, cmd);
- if (!err && res)
-- *res = bus->ops.get_response(bus);
-+ *res = bus->ops.get_response(bus, codec->addr);
- mutex_unlock(&bus->cmd_mutex);
- snd_hda_power_down(codec);
- if (res && *res == -1 && bus->rirb_error) {
-diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
-index cad79ef..1b75f28 100644
---- a/sound/pci/hda/hda_codec.h
-+++ b/sound/pci/hda/hda_codec.h
-@@ -568,7 +568,7 @@ struct hda_bus_ops {
- /* send a single command */
- int (*command)(struct hda_bus *bus, unsigned int cmd);
- /* get a response from the last command */
-- unsigned int (*get_response)(struct hda_bus *bus);
-+ unsigned int (*get_response)(struct hda_bus *bus, unsigned int addr);
- /* free the private data */
- void (*private_free)(struct hda_bus *);
- /* attach a PCM stream */
-diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
-index 77c1b84..175f07a 100644
---- a/sound/pci/hda/hda_intel.c
-+++ b/sound/pci/hda/hda_intel.c
-@@ -253,7 +253,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
-
- /* STATESTS int mask: S3,SD2,SD1,SD0 */
- #define AZX_MAX_CODECS 4
--#define STATESTS_INT_MASK 0x0f
-+#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
-
- /* SD_CTL bits */
- #define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
-@@ -361,8 +361,8 @@ struct azx_rb {
- dma_addr_t addr; /* physical address of CORB/RIRB buffer */
- /* for RIRB */
- unsigned short rp, wp; /* read/write pointers */
-- int cmds; /* number of pending requests */
-- u32 res; /* last read value */
-+ int cmds[AZX_MAX_CODECS]; /* number of pending requests */
-+ u32 res[AZX_MAX_CODECS]; /* last read value */
- };
-
- struct azx {
-@@ -418,7 +418,7 @@ struct azx {
- unsigned int probing :1; /* codec probing phase */
-
- /* for debugging */
-- unsigned int last_cmd; /* last issued command (to sync) */
-+ unsigned int last_cmd[AZX_MAX_CODECS];
-
- /* for pending irqs */
- struct work_struct irq_pending_work;
-@@ -513,6 +513,7 @@ static int azx_alloc_cmd_io(struct azx *chip)
-
- static void azx_init_cmd_io(struct azx *chip)
- {
-+ spin_lock_irq(&chip->reg_lock);
- /* CORB set up */
- chip->corb.addr = chip->rb.addr;
- chip->corb.buf = (u32 *)chip->rb.area;
-@@ -531,7 +532,8 @@ static void azx_init_cmd_io(struct azx *chip)
- /* RIRB set up */
- chip->rirb.addr = chip->rb.addr + 2048;
- chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
-- chip->rirb.wp = chip->rirb.rp = chip->rirb.cmds = 0;
-+ chip->rirb.wp = chip->rirb.rp = 0;
-+ memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
- azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
- azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
-
-@@ -543,30 +545,60 @@ static void azx_init_cmd_io(struct azx *chip)
- azx_writew(chip, RINTCNT, 1);
- /* enable rirb dma and response irq */
- azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
-+ spin_unlock_irq(&chip->reg_lock);
- }
-
- static void azx_free_cmd_io(struct azx *chip)
- {
-+ spin_lock_irq(&chip->reg_lock);
- /* disable ringbuffer DMAs */
- azx_writeb(chip, RIRBCTL, 0);
- azx_writeb(chip, CORBCTL, 0);
-+ spin_unlock_irq(&chip->reg_lock);
-+}
-+
-+static unsigned int azx_command_addr(u32 cmd)
-+{
-+ unsigned int addr = cmd >> 28;
-+
-+ if (addr >= AZX_MAX_CODECS) {
-+ snd_BUG();
-+ addr = 0;
-+ }
-+
-+ return addr;
-+}
-+
-+static unsigned int azx_response_addr(u32 res)
-+{
-+ unsigned int addr = res & 0xf;
-+
-+ if (addr >= AZX_MAX_CODECS) {
-+ snd_BUG();
-+ addr = 0;
-+ }
-+
-+ return addr;
- }
-
- /* send a command */
- static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
- {
- struct azx *chip = bus->private_data;
-+ unsigned int addr = azx_command_addr(val);
- unsigned int wp;
-
-+ spin_lock_irq(&chip->reg_lock);
-+
- /* add command to corb */
- wp = azx_readb(chip, CORBWP);
- wp++;
- wp %= ICH6_MAX_CORB_ENTRIES;
-
-- spin_lock_irq(&chip->reg_lock);
-- chip->rirb.cmds++;
-+ chip->rirb.cmds[addr]++;
- chip->corb.buf[wp] = cpu_to_le32(val);
- azx_writel(chip, CORBWP, wp);
-+
- spin_unlock_irq(&chip->reg_lock);
-
- return 0;
-@@ -578,13 +610,14 @@ static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
- static void azx_update_rirb(struct azx *chip)
- {
- unsigned int rp, wp;
-+ unsigned int addr;
- u32 res, res_ex;
-
- wp = azx_readb(chip, RIRBWP);
- if (wp == chip->rirb.wp)
- return;
- chip->rirb.wp = wp;
--
-+
- while (chip->rirb.rp != wp) {
- chip->rirb.rp++;
- chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
-@@ -592,18 +625,24 @@ static void azx_update_rirb(struct azx *chip)
- rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
- res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
- res = le32_to_cpu(chip->rirb.buf[rp]);
-+ addr = azx_response_addr(res_ex);
- if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
- snd_hda_queue_unsol_event(chip->bus, res, res_ex);
-- else if (chip->rirb.cmds) {
-- chip->rirb.res = res;
-+ else if (chip->rirb.cmds[addr]) {
-+ chip->rirb.res[addr] = res;
- smp_wmb();
-- chip->rirb.cmds--;
-- }
-+ chip->rirb.cmds[addr]--;
-+ } else
-+ snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
-+ "last cmd=%#08x\n",
-+ res, res_ex,
-+ chip->last_cmd[addr]);
- }
- }
-
- /* receive a response */
--static unsigned int azx_rirb_get_response(struct hda_bus *bus)
-+static unsigned int azx_rirb_get_response(struct hda_bus *bus,
-+ unsigned int addr)
- {
- struct azx *chip = bus->private_data;
- unsigned long timeout;
-@@ -616,10 +655,10 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
- azx_update_rirb(chip);
- spin_unlock_irq(&chip->reg_lock);
- }
-- if (!chip->rirb.cmds) {
-+ if (!chip->rirb.cmds[addr]) {
- smp_rmb();
- bus->rirb_error = 0;
-- return chip->rirb.res; /* the last value */
-+ return chip->rirb.res[addr]; /* the last value */
- }
- if (time_after(jiffies, timeout))
- break;
-@@ -633,7 +672,8 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
-
- if (chip->msi) {
- snd_printk(KERN_WARNING SFX "No response from codec, "
-- "disabling MSI: last cmd=0x%08x\n", chip->last_cmd);
-+ "disabling MSI: last cmd=0x%08x\n",
-+ chip->last_cmd[addr]);
- free_irq(chip->irq, chip);
- chip->irq = -1;
- pci_disable_msi(chip->pci);
-@@ -648,7 +688,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
- if (!chip->polling_mode) {
- snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
- "switching to polling mode: last cmd=0x%08x\n",
-- chip->last_cmd);
-+ chip->last_cmd[addr]);
- chip->polling_mode = 1;
- goto again;
- }
-@@ -672,7 +712,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
-
- snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
- "switching to single_cmd mode: last cmd=0x%08x\n",
-- chip->last_cmd);
-+ chip->last_cmd[addr]);
- chip->single_cmd = 1;
- bus->response_reset = 0;
- /* re-initialize CORB/RIRB */
-@@ -692,7 +732,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus)
- */
-
- /* receive a response */
--static int azx_single_wait_for_response(struct azx *chip)
-+static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
- {
- int timeout = 50;
-
-@@ -700,7 +740,7 @@ static int azx_single_wait_for_response(struct azx *chip)
- /* check IRV busy bit */
- if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
- /* reuse rirb.res as the response return value */
-- chip->rirb.res = azx_readl(chip, IR);
-+ chip->rirb.res[addr] = azx_readl(chip, IR);
- return 0;
- }
- udelay(1);
-@@ -708,7 +748,7 @@ static int azx_single_wait_for_response(struct azx *chip)
- if (printk_ratelimit())
- snd_printd(SFX "get_response timeout: IRS=0x%x\n",
- azx_readw(chip, IRS));
-- chip->rirb.res = -1;
-+ chip->rirb.res[addr] = -1;
- return -EIO;
- }
-
-@@ -716,6 +756,7 @@ static int azx_single_wait_for_response(struct azx *chip)
- static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
- {
- struct azx *chip = bus->private_data;
-+ unsigned int addr = azx_command_addr(val);
- int timeout = 50;
-
- bus->rirb_error = 0;
-@@ -728,7 +769,7 @@ static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
- azx_writel(chip, IC, val);
- azx_writew(chip, IRS, azx_readw(chip, IRS) |
- ICH6_IRS_BUSY);
-- return azx_single_wait_for_response(chip);
-+ return azx_single_wait_for_response(chip, addr);
- }
- udelay(1);
- }
-@@ -739,10 +780,11 @@ static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
- }
-
- /* receive a response */
--static unsigned int azx_single_get_response(struct hda_bus *bus)
-+static unsigned int azx_single_get_response(struct hda_bus *bus,
-+ unsigned int addr)
- {
- struct azx *chip = bus->private_data;
-- return chip->rirb.res;
-+ return chip->rirb.res[addr];
- }
-
- /*
-@@ -757,7 +799,7 @@ static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
- {
- struct azx *chip = bus->private_data;
-
-- chip->last_cmd = val;
-+ chip->last_cmd[azx_command_addr(val)] = val;
- if (chip->single_cmd)
- return azx_single_send_cmd(bus, val);
- else
-@@ -765,13 +807,14 @@ static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
- }
-
- /* get a response */
--static unsigned int azx_get_response(struct hda_bus *bus)
-+static unsigned int azx_get_response(struct hda_bus *bus,
-+ unsigned int addr)
- {
- struct azx *chip = bus->private_data;
- if (chip->single_cmd)
-- return azx_single_get_response(bus);
-+ return azx_single_get_response(bus, addr);
- else
-- return azx_rirb_get_response(bus);
-+ return azx_rirb_get_response(bus, addr);
- }
-
- #ifdef CONFIG_SND_HDA_POWER_SAVE
-@@ -1243,10 +1286,12 @@ static int probe_codec(struct azx *chip, int addr)
- (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
- unsigned int res;
-
-+ mutex_lock(&chip->bus->cmd_mutex);
- chip->probing = 1;
- azx_send_cmd(chip->bus, cmd);
-- res = azx_get_response(chip->bus);
-+ res = azx_get_response(chip->bus, addr);
- chip->probing = 0;
-+ mutex_unlock(&chip->bus->cmd_mutex);
- if (res == -1)
- return -EIO;
- snd_printdd(SFX "codec #%d probed OK\n", addr);
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index b95df5d..51c44fd 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -559,7 +559,7 @@ static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
-
- /* Find enumerated value for current pinctl setting */
- i = alc_pin_mode_min(dir);
-- while (alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir))
-+ while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
- i++;
- *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
- return 0;
-@@ -15157,7 +15157,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
- SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
- SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
- /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
-- SND_PCI_QUIRK(0x1179, 0xff01, "DALLAS", ALC861VD_DALLAS),
-+ SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
- SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
- SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
- SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
-diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
-index 5383d8c..456ef6a 100644
---- a/sound/pci/hda/patch_sigmatel.c
-+++ b/sound/pci/hda/patch_sigmatel.c
-@@ -2266,7 +2266,7 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = {
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS),
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS),
-- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_3ST),
-+ SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS),
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS),
- SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
-@@ -5645,6 +5645,13 @@ static int patch_stac927x(struct hda_codec *codec)
- /* GPIO2 High = Enable EAPD */
- spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
- spec->gpio_data = 0x04;
-+ switch (codec->subsystem_id) {
-+ case 0x1028022f:
-+ /* correct EAPD to be GPIO0 */
-+ spec->eapd_mask = spec->gpio_mask = 0x01;
-+ spec->gpio_dir = spec->gpio_data = 0x01;
-+ break;
-+ };
- spec->dmic_nids = stac927x_dmic_nids;
- spec->num_dmics = STAC927X_NUM_DMICS;
-
-diff --git a/tools/perf/Makefile b/tools/perf/Makefile
-index a5e9b87..4b20fa4 100644
---- a/tools/perf/Makefile
-+++ b/tools/perf/Makefile
-@@ -345,7 +345,7 @@ BUILTIN_OBJS += builtin-stat.o
- BUILTIN_OBJS += builtin-top.o
-
- PERFLIBS = $(LIB_FILE)
--EXTLIBS = -lbfd
-+EXTLIBS = -lbfd -liberty
-
- #
- # Platform specific tweaks
-diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
-index b20a4b6..ce4f286 100644
---- a/tools/perf/builtin-report.c
-+++ b/tools/perf/builtin-report.c
-@@ -99,6 +99,7 @@ struct comm_event {
- struct fork_event {
- struct perf_event_header header;
- u32 pid, ppid;
-+ u32 tid, ptid;
- };
-
- struct lost_event {
-@@ -252,7 +253,7 @@ static int strcommon(const char *pathname)
- {
- int n = 0;
-
-- while (pathname[n] == cwd[n] && n < cwdlen)
-+ while (n < cwdlen && pathname[n] == cwd[n])
- ++n;
-
- return n;
-@@ -1608,15 +1609,27 @@ process_comm_event(event_t *event, unsigned long offset, unsigned long head)
- }
-
- static int
--process_fork_event(event_t *event, unsigned long offset, unsigned long head)
-+process_task_event(event_t *event, unsigned long offset, unsigned long head)
- {
- struct thread *thread = threads__findnew(event->fork.pid);
- struct thread *parent = threads__findnew(event->fork.ppid);
-
-- dprintf("%p [%p]: PERF_EVENT_FORK: %d:%d\n",
-+ dprintf("%p [%p]: PERF_EVENT_%s: (%d:%d):(%d:%d)\n",
- (void *)(offset + head),
- (void *)(long)(event->header.size),
-- event->fork.pid, event->fork.ppid);
-+ event->header.type == PERF_EVENT_FORK ? "FORK" : "EXIT",
-+ event->fork.pid, event->fork.tid,
-+ event->fork.ppid, event->fork.ptid);
-+
-+ /*
-+ * A thread clone will have the same PID for both
-+ * parent and child.
-+ */
-+ if (thread == parent)
-+ return 0;
-+
-+ if (event->header.type == PERF_EVENT_EXIT)
-+ return 0;
-
- if (!thread || !parent || thread__fork(thread, parent)) {
- dprintf("problem processing PERF_EVENT_FORK, skipping event.\n");
-@@ -1706,7 +1719,8 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
- return process_comm_event(event, offset, head);
-
- case PERF_EVENT_FORK:
-- return process_fork_event(event, offset, head);
-+ case PERF_EVENT_EXIT:
-+ return process_task_event(event, offset, head);
-
- case PERF_EVENT_LOST:
- return process_lost_event(event, offset, head);
-diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
-index c0a4230..f139f1a 100644
---- a/tools/perf/builtin-top.c
-+++ b/tools/perf/builtin-top.c
-@@ -285,6 +285,7 @@ static const char *skip_symbols[] = {
- "enter_idle",
- "exit_idle",
- "mwait_idle",
-+ "mwait_idle_with_hints",
- "ppc64_runlatch_off",
- "pseries_dedicated_idle_sleep",
- NULL
-diff --git a/tools/perf/util/quote.c b/tools/perf/util/quote.c
-index c6e5dc0..2726fe4 100644
---- a/tools/perf/util/quote.c
-+++ b/tools/perf/util/quote.c
-@@ -318,7 +318,7 @@ char *quote_path_relative(const char *in, int len,
- strbuf_addch(out, '"');
- if (prefix) {
- int off = 0;
-- while (prefix[off] && off < len && prefix[off] == in[off])
-+ while (off < len && prefix[off] && prefix[off] == in[off])
- if (prefix[off] == '/') {
- prefix += off + 1;
- in += off + 1;
-diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
-index 2810605..b4fe057 100644
---- a/tools/perf/util/symbol.c
-+++ b/tools/perf/util/symbol.c
-@@ -565,7 +565,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
- goto out_elf_end;
-
- secstrs = elf_getdata(sec_strndx, NULL);
-- if (symstrs == NULL)
-+ if (secstrs == NULL)
- goto out_elf_end;
-
- nr_syms = shdr.sh_size / shdr.sh_entsize;
diff --git a/patches.kernel.org/patch-2.6.31-rc5-git3-git9 b/patches.kernel.org/patch-2.6.31-rc5-git3-git9
deleted file mode 100644
index cc5fb8bf31..0000000000
--- a/patches.kernel.org/patch-2.6.31-rc5-git3-git9
+++ /dev/null
@@ -1,12317 +0,0 @@
-From: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
-Subject: Linux: 2.6.31-rc5-git9
-Patch-mainline: 2.6.31-rc5-git9
-
- This patch contains the differences between 2.6.31-rc5-git3 and -git9.
-
-Acked-by: Jeff Mahoney <jeffm@suse.com>
----
-
- Documentation/arm/memory.txt | 2
- Documentation/ioctl/ioctl-number.txt | 1
- Documentation/kernel-parameters.txt | 4
- Documentation/lockdep-design.txt | 6
- Makefile | 2
- arch/arm/boot/compressed/misc.c | 1
- arch/arm/common/clkdev.c | 1
- arch/arm/configs/mx27_defconfig | 270 +++++--
- arch/arm/configs/mx3_defconfig | 151 ++--
- arch/arm/configs/omap3_evm_defconfig | 2
- arch/arm/include/asm/atomic.h | 2
- arch/arm/kernel/entry-common.S | 2
- arch/arm/kernel/signal.c | 4
- arch/arm/mach-davinci/board-dm355-evm.c | 1
- arch/arm/mach-davinci/board-dm355-leopard.c | 1
- arch/arm/mach-davinci/board-dm644x-evm.c | 1
- arch/arm/mach-davinci/board-dm646x-evm.c | 1
- arch/arm/mach-davinci/board-sffsdr.c | 1
- arch/arm/mach-ep93xx/include/mach/ts72xx.h | 3
- arch/arm/mach-ep93xx/ts72xx.c | 18
- arch/arm/mach-ks8695/include/mach/hardware.h | 5
- arch/arm/mach-ks8695/include/mach/timex.h | 5
- arch/arm/mach-ks8695/pci.c | 3
- arch/arm/mach-omap1/mcbsp.c | 1
- arch/arm/mach-omap2/board-omap3evm.c | 5
- arch/arm/mach-omap2/mcbsp.c | 1
- arch/arm/mach-omap2/usb-musb.c | 21
- arch/arm/mach-pxa/em-x270.c | 4
- arch/arm/mach-pxa/palmld.c | 4
- arch/arm/mach-pxa/palmt5.c | 4
- arch/arm/mach-pxa/palmtx.c | 4
- arch/arm/mach-pxa/treo680.c | 2
- arch/arm/mach-pxa/zylonite_pxa300.c | 2
- arch/arm/mach-pxa/zylonite_pxa320.c | 2
- arch/arm/mach-s3c2410/include/mach/gpio-core.h | 2
- arch/arm/plat-s3c24xx/pwm.c | 4
- arch/arm/plat-s3c64xx/pm.c | 2
- arch/arm/plat-s3c64xx/s3c6400-clock.c | 4
- arch/arm/plat-stmp3xxx/pinmux.c | 1
- arch/ia64/Makefile | 5
- arch/ia64/include/asm/bitops.h | 2
- arch/ia64/include/asm/pgtable.h | 1
- arch/ia64/kernel/ia64_ksyms.c | 4
- arch/ia64/kernel/iosapic.c | 4
- arch/ia64/kernel/pci-dma.c | 5
- arch/ia64/kernel/topology.c | 6
- arch/ia64/kvm/mmio.c | 6
- arch/ia64/kvm/vcpu.c | 6
- arch/ia64/kvm/vcpu.h | 13
- arch/mn10300/include/asm/pci.h | 1
- arch/powerpc/include/asm/kvm_host.h | 2
- arch/powerpc/kernel/dma.c | 6
- arch/powerpc/kernel/mpc7450-pmu.c | 3
- arch/powerpc/kernel/perf_counter.c | 8
- arch/powerpc/kernel/power4-pmu.c | 3
- arch/powerpc/kernel/power5+-pmu.c | 5
- arch/powerpc/kernel/power5-pmu.c | 3
- arch/powerpc/kernel/power6-pmu.c | 3
- arch/powerpc/kernel/power7-pmu.c | 3
- arch/powerpc/kernel/ppc970-pmu.c | 5
- arch/s390/kernel/early.c | 3
- arch/s390/kvm/interrupt.c | 2
- arch/s390/kvm/sigp.c | 7
- arch/x86/kernel/apic/x2apic_cluster.c | 8
- arch/x86/kernel/apic/x2apic_phys.c | 8
- arch/x86/kernel/efi.c | 2
- arch/x86/kernel/reboot.c | 10
- arch/x86/kernel/tsc.c | 29
- arch/x86/kernel/vmi_32.c | 2
- arch/x86/kvm/i8254.c | 3
- arch/x86/kvm/mmu.c | 48 -
- arch/x86/kvm/svm.c | 6
- arch/x86/kvm/vmx.c | 6
- arch/x86/kvm/x86.c | 44 +
- drivers/ata/ahci.c | 79 ++
- drivers/ata/libata-core.c | 3
- drivers/ata/pata_at91.c | 17
- drivers/ata/pata_atiixp.c | 19
- drivers/ata/sata_nv.c | 8
- drivers/base/platform.c | 3
- drivers/char/pty.c | 2
- drivers/gpu/drm/drm_irq.c | 2
- drivers/gpu/drm/drm_modes.c | 2
- drivers/gpu/drm/i915/i915_dma.c | 15
- drivers/gpu/drm/i915/i915_drv.h | 4
- drivers/gpu/drm/i915/i915_gem.c | 4
- drivers/gpu/drm/i915/i915_gem_debugfs.c | 2
- drivers/gpu/drm/i915/i915_irq.c | 239 ++++--
- drivers/gpu/drm/i915/i915_reg.h | 45 +
- drivers/gpu/drm/i915/i915_suspend.c | 2
- drivers/gpu/drm/i915/intel_bios.c | 40 -
- drivers/gpu/drm/i915/intel_bios.h | 45 +
- drivers/gpu/drm/i915/intel_crt.c | 12
- drivers/gpu/drm/i915/intel_display.c | 763 ++++++++++++++-------
- drivers/gpu/drm/i915/intel_dp.c | 216 +++++
- drivers/gpu/drm/i915/intel_drv.h | 3
- drivers/gpu/drm/i915/intel_hdmi.c | 64 -
- drivers/gpu/drm/i915/intel_lvds.c | 12
- drivers/gpu/drm/i915/intel_sdvo.c | 254 ++++--
- drivers/gpu/drm/i915/intel_tv.c | 22
- drivers/gpu/drm/radeon/r600_cp.c | 22
- drivers/gpu/drm/radeon/radeon_device.c | 4
- drivers/gpu/drm/radeon/radeon_drv.h | 1
- drivers/gpu/drm/radeon/radeon_object.c | 2
- drivers/input/keyboard/matrix_keypad.c | 18
- drivers/input/misc/wistron_btns.c | 16
- drivers/input/serio/i8042-x86ia64io.h | 8
- drivers/mmc/host/sdhci-of.c | 2
- drivers/mtd/maps/Kconfig | 7
- drivers/mtd/maps/Makefile | 1
- drivers/mtd/maps/sbc8240.c | 250 ------
- drivers/mtd/mtd_blkdevs.c | 6
- drivers/mtd/mtdblock.c | 16
- drivers/mtd/mtdcore.c | 7
- drivers/mtd/onenand/omap2.c | 3
- drivers/mtd/ubi/eba.c | 1
- drivers/mtd/ubi/scan.c | 13
- drivers/pci/hotplug/sgi_hotplug.c | 7
- drivers/pci/intel-iommu.c | 25
- drivers/serial/s3c2400.c | 8
- drivers/serial/s3c2410.c | 8
- drivers/serial/s3c2412.c | 8
- drivers/serial/s3c2440.c | 8
- drivers/serial/s3c24a0.c | 8
- drivers/serial/s3c6400.c | 8
- drivers/serial/serial_ks8695.c | 2
- drivers/staging/b3dfg/Kconfig | 1
- drivers/staging/heci/Kconfig | 1
- drivers/staging/rspiusb/rspiusb.c | 2
- drivers/staging/rt2860/rt_linux.h | 13
- drivers/staging/rt2870/2870_main_dev.c | 67 +
- drivers/staging/rt2870/common/2870_rtmp_init.c | 33
- drivers/staging/rt2870/common/rtusb_io.c | 3
- drivers/staging/rt2870/rt2870.h | 9
- drivers/staging/rtl8192su/ieee80211.h | 2
- drivers/staging/rtl8192su/ieee80211/ieee80211.h | 2
- drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c | 3
- drivers/staging/rtl8192su/r8192U_core.c | 2
- drivers/usb/class/cdc-acm.c | 10
- drivers/usb/class/cdc-acm.h | 2
- drivers/usb/core/devio.c | 10
- drivers/usb/host/ehci-hcd.c | 3
- drivers/usb/host/ehci-q.c | 15
- drivers/usb/host/ehci-sched.c | 1
- drivers/usb/musb/Kconfig | 1
- drivers/usb/serial/ftdi_sio.c | 3
- drivers/usb/serial/ftdi_sio.h | 14
- drivers/usb/serial/pl2303.c | 1
- drivers/usb/serial/pl2303.h | 4
- drivers/usb/storage/unusual_devs.h | 7
- drivers/video/console/fbcon.c | 6
- drivers/video/console/fbcon_rotate.h | 2
- drivers/video/mx3fb.c | 86 +-
- drivers/video/via/hw.c | 4
- drivers/video/via/lcd.c | 15
- drivers/video/via/viafbdev.c | 101 +-
- drivers/video/via/viafbdev.h | 3
- drivers/w1/masters/omap_hdq.c | 1
- drivers/watchdog/ks8695_wdt.c | 4
- fs/binfmt_flat.c | 17
- fs/btrfs/extent-tree.c | 21
- fs/btrfs/free-space-cache.c | 73 +-
- fs/btrfs/inode.c | 3
- fs/btrfs/relocation.c | 9
- fs/btrfs/zlib.c | 6
- fs/compat_ioctl.c | 1
- fs/inode.c | 40 -
- fs/jffs2/file.c | 2
- fs/namespace.c | 3
- fs/nfs/direct.c | 20
- fs/nfs/read.c | 6
- fs/nfs/write.c | 6
- fs/proc/base.c | 27
- fs/proc/task_mmu.c | 1
- fs/proc/task_nommu.c | 1
- fs/xfs/linux-2.6/xfs_buf.c | 2
- fs/xfs/xfs_attr.c | 8
- fs/xfs/xfs_bmap.c | 2
- fs/xfs/xfs_btree.c | 4
- fs/xfs/xfs_da_btree.c | 6
- fs/xfs/xfs_dir2.c | 2
- fs/xfs/xfs_fsops.c | 20
- fs/xfs/xfs_iget.c | 142 ++-
- fs/xfs/xfs_inode.c | 10
- fs/xfs/xfs_inode.h | 17
- fs/xfs/xfs_log.c | 2
- fs/xfs/xfs_vnodeops.c | 4
- include/drm/drm_pciids.h | 5
- include/linux/decompress/generic.h | 32
- include/linux/fs.h | 3
- include/linux/ftrace_event.h | 12
- include/linux/input/matrix_keypad.h | 13
- include/linux/kvm_host.h | 1
- include/linux/mtd/mtd.h | 2
- include/linux/mtd/partitions.h | 2
- include/linux/nfs_fs.h | 5
- include/linux/nodemask.h | 28
- include/linux/perf_counter.h | 11
- include/trace/ftrace.h | 183 ++++-
- kernel/fork.c | 22
- kernel/irq/numa_migrate.c | 4
- kernel/lockdep_proc.c | 3
- kernel/perf_counter.c | 245 ++++--
- kernel/posix-cpu-timers.c | 7
- kernel/rtmutex.c | 4
- kernel/smp.c | 2
- kernel/trace/blktrace.c | 12
- kernel/trace/ring_buffer.c | 15
- kernel/trace/trace.c | 1
- kernel/trace/trace.h | 4
- kernel/trace/trace_event_profile.c | 2
- kernel/trace/trace_events.c | 2
- kernel/trace/trace_events_filter.c | 20
- lib/decompress_bunzip2.c | 24
- lib/decompress_inflate.c | 10
- lib/decompress_unlzma.c | 23
- mm/mempolicy.c | 84 +-
- mm/mempool.c | 4
- net/core/dev.c | 2
- scripts/recordmcount.pl | 9
- security/selinux/hooks.c | 3
- sound/pci/hda/patch_realtek.c | 20
- sound/soc/fsl/efika-audio-fabric.c | 2
- sound/soc/fsl/pcm030-audio-fabric.c | 2
- tools/perf/Documentation/perf-examples.txt | 225 ++++++
- tools/perf/Documentation/perf-record.txt | 60 +
- tools/perf/Documentation/perf-stat.txt | 2
- tools/perf/Documentation/perf-top.txt | 112 ++-
- tools/perf/Makefile | 33
- tools/perf/builtin-record.c | 13
- tools/perf/builtin-report.c | 103 ++
- tools/perf/builtin-stat.c | 2
- tools/perf/builtin-top.c | 552 +++++++++++++--
- tools/perf/util/callchain.c | 32
- tools/perf/util/callchain.h | 8
- tools/perf/util/header.c | 5
- tools/perf/util/parse-events.c | 26
- tools/perf/util/parse-events.h | 1
- tools/perf/util/symbol.c | 134 +++
- tools/perf/util/symbol.h | 2
- virt/kvm/ioapic.c | 10
- virt/kvm/irq_comm.c | 4
- 242 files changed, 4313 insertions(+), 1878 deletions(-)
---- a/Documentation/arm/memory.txt
-+++ b/Documentation/arm/memory.txt
-@@ -21,6 +21,8 @@ ffff8000 ffffffff copy_user_page / clear
- For SA11xx and Xscale, this is used to
- setup a minicache mapping.
-
-+ffff4000 ffffffff cache aliasing on ARMv6 and later CPUs.
-+
- ffff1000 ffff7fff Reserved.
- Platforms must not use this address range.
-
---- a/Documentation/ioctl/ioctl-number.txt
-+++ b/Documentation/ioctl/ioctl-number.txt
-@@ -139,6 +139,7 @@ Code Seq# Include File Comments
- 'm' all linux/synclink.h conflict!
- 'm' 00-1F net/irda/irmod.h conflict!
- 'n' 00-7F linux/ncp_fs.h
-+'n' 80-8F linux/nilfs2_fs.h NILFS2
- 'n' E0-FF video/matrox.h matroxfb
- 'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
- 'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -1115,6 +1115,10 @@ and is between 256 and 4096 characters.
- libata.dma=4 Compact Flash DMA only
- Combinations also work, so libata.dma=3 enables DMA
- for disks and CDROMs, but not CFs.
-+
-+ libata.ignore_hpa= [LIBATA] Ignore HPA limit
-+ libata.ignore_hpa=0 keep BIOS limits (default)
-+ libata.ignore_hpa=1 ignore limits, using full disk
-
- libata.noacpi [LIBATA] Disables use of ACPI in libata suspend/resume
- when set.
---- a/Documentation/lockdep-design.txt
-+++ b/Documentation/lockdep-design.txt
-@@ -30,9 +30,9 @@ State
- The validator tracks lock-class usage history into 4n + 1 separate state bits:
-
- - 'ever held in STATE context'
--- 'ever head as readlock in STATE context'
--- 'ever head with STATE enabled'
--- 'ever head as readlock with STATE enabled'
-+- 'ever held as readlock in STATE context'
-+- 'ever held with STATE enabled'
-+- 'ever held as readlock with STATE enabled'
-
- Where STATE can be either one of (kernel/lockdep_states.h)
- - hardirq
---- a/Makefile
-+++ b/Makefile
-@@ -1,7 +1,7 @@
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 31
--EXTRAVERSION = -rc5-git3
-+EXTRAVERSION = -rc5-git9
- NAME = Man-Eating Seals of Antiquity
-
- # *DOCUMENTATION*
---- a/arch/arm/boot/compressed/misc.c
-+++ b/arch/arm/boot/compressed/misc.c
-@@ -29,7 +29,6 @@ unsigned int __machine_arch_type;
-
- static void putstr(const char *ptr);
-
--#include <linux/compiler.h>
- #include <mach/uncompress.h>
-
- #ifdef CONFIG_DEBUG_ICEDCC
---- a/arch/arm/common/clkdev.c
-+++ b/arch/arm/common/clkdev.c
-@@ -17,6 +17,7 @@
- #include <linux/err.h>
- #include <linux/string.h>
- #include <linux/mutex.h>
-+#include <linux/clk.h>
-
- #include <asm/clkdev.h>
- #include <mach/clkdev.h>
---- a/arch/arm/configs/mx27_defconfig
-+++ b/arch/arm/configs/mx27_defconfig
-@@ -1,15 +1,15 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.30-rc1
--# Wed Apr 8 10:18:06 2009
-+# Linux kernel version: 2.6.31-rc4
-+# Fri Jul 24 16:08:06 2009
- #
- CONFIG_ARM=y
-+CONFIG_HAVE_PWM=y
- CONFIG_SYS_SUPPORTS_APM_EMULATION=y
- CONFIG_GENERIC_GPIO=y
- CONFIG_GENERIC_TIME=y
- CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_MMU=y
--# CONFIG_NO_IOPORT is not set
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_STACKTRACE_SUPPORT=y
- CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-@@ -18,14 +18,13 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
- CONFIG_HARDIRQS_SW_RESEND=y
- CONFIG_GENERIC_IRQ_PROBE=y
- CONFIG_RWSEM_GENERIC_SPINLOCK=y
--# CONFIG_ARCH_HAS_ILOG2_U32 is not set
--# CONFIG_ARCH_HAS_ILOG2_U64 is not set
- CONFIG_GENERIC_HWEIGHT=y
- CONFIG_GENERIC_CALIBRATE_DELAY=y
- CONFIG_ARCH_MTD_XIP=y
- CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
- CONFIG_VECTORS_BASE=0xffff0000
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+CONFIG_CONSTRUCTORS=y
-
- #
- # General setup
-@@ -85,7 +84,12 @@ CONFIG_TIMERFD=y
- CONFIG_EVENTFD=y
- CONFIG_SHMEM=y
- CONFIG_AIO=y
-+
-+#
-+# Performance Counters
-+#
- CONFIG_VM_EVENT_COUNTERS=y
-+# CONFIG_STRIP_ASM_SYMS is not set
- # CONFIG_COMPAT_BRK is not set
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
-@@ -99,6 +103,12 @@ CONFIG_KPROBES=y
- CONFIG_KRETPROBES=y
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+CONFIG_HAVE_CLK=y
-+
-+#
-+# GCOV-based kernel profiling
-+#
-+# CONFIG_GCOV_KERNEL is not set
- # CONFIG_SLOW_WORK is not set
- CONFIG_HAVE_GENERIC_DMA_COHERENT=y
- CONFIG_SLABINFO=y
-@@ -111,7 +121,7 @@ CONFIG_MODULE_UNLOAD=y
- # CONFIG_MODVERSIONS is not set
- # CONFIG_MODULE_SRCVERSION_ALL is not set
- CONFIG_BLOCK=y
--# CONFIG_LBD is not set
-+CONFIG_LBDAF=y
- # CONFIG_BLK_DEV_BSG is not set
- # CONFIG_BLK_DEV_INTEGRITY is not set
-
-@@ -138,13 +148,14 @@ CONFIG_FREEZER=y
- # CONFIG_ARCH_VERSATILE is not set
- # CONFIG_ARCH_AT91 is not set
- # CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_GEMINI is not set
- # CONFIG_ARCH_EBSA110 is not set
- # CONFIG_ARCH_EP93XX is not set
--# CONFIG_ARCH_GEMINI is not set
- # CONFIG_ARCH_FOOTBRIDGE is not set
-+CONFIG_ARCH_MXC=y
-+# CONFIG_ARCH_STMP3XXX is not set
- # CONFIG_ARCH_NETX is not set
- # CONFIG_ARCH_H720X is not set
--# CONFIG_ARCH_IMX is not set
- # CONFIG_ARCH_IOP13XX is not set
- # CONFIG_ARCH_IOP32X is not set
- # CONFIG_ARCH_IOP33X is not set
-@@ -153,25 +164,25 @@ CONFIG_FREEZER=y
- # CONFIG_ARCH_IXP4XX is not set
- # CONFIG_ARCH_L7200 is not set
- # CONFIG_ARCH_KIRKWOOD is not set
--# CONFIG_ARCH_KS8695 is not set
--# CONFIG_ARCH_NS9XXX is not set
- # CONFIG_ARCH_LOKI is not set
- # CONFIG_ARCH_MV78XX0 is not set
--CONFIG_ARCH_MXC=y
- # CONFIG_ARCH_ORION5X is not set
-+# CONFIG_ARCH_MMP is not set
-+# CONFIG_ARCH_KS8695 is not set
-+# CONFIG_ARCH_NS9XXX is not set
-+# CONFIG_ARCH_W90X900 is not set
- # CONFIG_ARCH_PNX4008 is not set
- # CONFIG_ARCH_PXA is not set
--# CONFIG_ARCH_MMP is not set
-+# CONFIG_ARCH_MSM is not set
- # CONFIG_ARCH_RPC is not set
- # CONFIG_ARCH_SA1100 is not set
- # CONFIG_ARCH_S3C2410 is not set
- # CONFIG_ARCH_S3C64XX is not set
- # CONFIG_ARCH_SHARK is not set
- # CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_U300 is not set
- # CONFIG_ARCH_DAVINCI is not set
- # CONFIG_ARCH_OMAP is not set
--# CONFIG_ARCH_MSM is not set
--# CONFIG_ARCH_W90X900 is not set
-
- #
- # Freescale MXC Implementations
-@@ -188,6 +199,8 @@ CONFIG_MACH_MX27=y
- CONFIG_MACH_MX27ADS=y
- CONFIG_MACH_PCM038=y
- CONFIG_MACH_PCM970_BASEBOARD=y
-+CONFIG_MACH_MX27_3DS=y
-+CONFIG_MACH_MX27LITE=y
- CONFIG_MXC_IRQ_PRIOR=y
- CONFIG_MXC_PWM=y
-
-@@ -213,7 +226,6 @@ CONFIG_ARM_THUMB=y
- # CONFIG_CPU_DCACHE_DISABLE is not set
- # CONFIG_CPU_DCACHE_WRITETHROUGH is not set
- # CONFIG_CPU_CACHE_ROUND_ROBIN is not set
--# CONFIG_OUTER_CACHE is not set
- CONFIG_COMMON_CLKDEV=y
-
- #
-@@ -238,7 +250,6 @@ CONFIG_PREEMPT=y
- CONFIG_HZ=100
- CONFIG_AEABI=y
- CONFIG_OABI_COMPAT=y
--CONFIG_ARCH_FLATMEM_HAS_HOLES=y
- # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
- # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
- # CONFIG_HIGHMEM is not set
-@@ -253,10 +264,11 @@ CONFIG_SPLIT_PTLOCK_CPUS=4096
- # CONFIG_PHYS_ADDR_T_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=0
- CONFIG_VIRT_TO_BUS=y
--CONFIG_UNEVICTABLE_LRU=y
- CONFIG_HAVE_MLOCK=y
- CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
- CONFIG_ALIGNMENT_TRAP=y
-+# CONFIG_UACCESS_WITH_MEMCPY is not set
-
- #
- # Boot options
-@@ -361,6 +373,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_ECONET is not set
- # CONFIG_WAN_ROUTER is not set
- # CONFIG_PHONET is not set
-+# CONFIG_IEEE802154 is not set
- # CONFIG_NET_SCHED is not set
- # CONFIG_DCB is not set
-
-@@ -474,7 +487,16 @@ CONFIG_MTD_PHYSMAP=y
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
-+CONFIG_MTD_NAND=y
-+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+# CONFIG_MTD_NAND_GPIO is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+CONFIG_MTD_NAND_MXC=y
- # CONFIG_MTD_ONENAND is not set
-
- #
-@@ -485,7 +507,15 @@ CONFIG_MTD_PHYSMAP=y
- #
- # UBI - Unsorted block images
- #
--# CONFIG_MTD_UBI is not set
-+CONFIG_MTD_UBI=y
-+CONFIG_MTD_UBI_WL_THRESHOLD=4096
-+CONFIG_MTD_UBI_BEB_RESERVE=1
-+# CONFIG_MTD_UBI_GLUEBI is not set
-+
-+#
-+# UBI debugging options
-+#
-+# CONFIG_MTD_UBI_DEBUG is not set
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_COW_COMMON is not set
-@@ -494,7 +524,21 @@ CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_RAM is not set
- # CONFIG_CDROM_PKTCDVD is not set
- # CONFIG_ATA_OVER_ETH is not set
--# CONFIG_MISC_DEVICES is not set
-+# CONFIG_MG_DISK is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_ICS932S401 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_ISL29003 is not set
-+# CONFIG_C2PORT is not set
-+
-+#
-+# EEPROM support
-+#
-+CONFIG_EEPROM_AT24=y
-+# CONFIG_EEPROM_AT25 is not set
-+# CONFIG_EEPROM_LEGACY is not set
-+# CONFIG_EEPROM_MAX6875 is not set
-+# CONFIG_EEPROM_93CX6 is not set
- CONFIG_HAVE_IDE=y
- # CONFIG_IDE is not set
-
-@@ -508,7 +552,6 @@ CONFIG_HAVE_IDE=y
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
- CONFIG_NETDEVICES=y
--CONFIG_COMPAT_NET_DEV_OPS=y
- # CONFIG_DUMMY is not set
- # CONFIG_BONDING is not set
- # CONFIG_MACVLAN is not set
-@@ -534,6 +577,8 @@ CONFIG_NET_ETHERNET=y
- # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
- # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
- # CONFIG_B44 is not set
-+# CONFIG_KS8842 is not set
-+# CONFIG_KS8851 is not set
- CONFIG_FEC=y
- # CONFIG_FEC2 is not set
- # CONFIG_NETDEV_1000 is not set
-@@ -580,6 +625,11 @@ CONFIG_INPUT_EVDEV=y
- # CONFIG_INPUT_TABLET is not set
- CONFIG_INPUT_TOUCHSCREEN=y
- # CONFIG_TOUCHSCREEN_ADS7846 is not set
-+# CONFIG_TOUCHSCREEN_AD7877 is not set
-+# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
-+# CONFIG_TOUCHSCREEN_AD7879_SPI is not set
-+# CONFIG_TOUCHSCREEN_AD7879 is not set
-+# CONFIG_TOUCHSCREEN_EETI is not set
- # CONFIG_TOUCHSCREEN_FUJITSU is not set
- # CONFIG_TOUCHSCREEN_GUNZE is not set
- # CONFIG_TOUCHSCREEN_ELO is not set
-@@ -592,6 +642,7 @@ CONFIG_INPUT_TOUCHSCREEN=y
- # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
- # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
- # CONFIG_TOUCHSCREEN_TSC2007 is not set
-+# CONFIG_TOUCHSCREEN_W90X900 is not set
- # CONFIG_INPUT_MISC is not set
-
- #
-@@ -644,6 +695,7 @@ CONFIG_I2C_HELPER_AUTO=y
- #
- # I2C system bus drivers (mostly embedded / system-on-chip)
- #
-+# CONFIG_I2C_DESIGNWARE is not set
- # CONFIG_I2C_GPIO is not set
- CONFIG_I2C_IMX=y
- # CONFIG_I2C_OCORES is not set
-@@ -668,7 +720,6 @@ CONFIG_I2C_IMX=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCA9539 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
-@@ -719,6 +770,7 @@ CONFIG_W1=y
- #
- # CONFIG_W1_MASTER_DS2482 is not set
- CONFIG_W1_MASTER_MXC=y
-+# CONFIG_W1_MASTER_DS1WM is not set
- # CONFIG_W1_MASTER_GPIO is not set
-
- #
-@@ -753,54 +805,16 @@ CONFIG_SSB_POSSIBLE=y
- # CONFIG_TPS65010 is not set
- # CONFIG_TWL4030_CORE is not set
- # CONFIG_MFD_TMIO is not set
-+# CONFIG_MFD_T7L66XB is not set
-+# CONFIG_MFD_TC6387XB is not set
- # CONFIG_MFD_TC6393XB is not set
- # CONFIG_PMIC_DA903X is not set
- # CONFIG_MFD_WM8400 is not set
- # CONFIG_MFD_WM8350_I2C is not set
- # CONFIG_MFD_PCF50633 is not set
--
--#
--# Multimedia devices
--#
--
--#
--# Multimedia core support
--#
--CONFIG_VIDEO_DEV=y
--CONFIG_VIDEO_V4L2_COMMON=y
--CONFIG_VIDEO_ALLOW_V4L1=y
--CONFIG_VIDEO_V4L1_COMPAT=y
--# CONFIG_DVB_CORE is not set
--CONFIG_VIDEO_MEDIA=y
--
--#
--# Multimedia drivers
--#
--# CONFIG_MEDIA_ATTACH is not set
--CONFIG_MEDIA_TUNER=y
--# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
--CONFIG_MEDIA_TUNER_SIMPLE=y
--CONFIG_MEDIA_TUNER_TDA8290=y
--CONFIG_MEDIA_TUNER_TDA9887=y
--CONFIG_MEDIA_TUNER_TEA5761=y
--CONFIG_MEDIA_TUNER_TEA5767=y
--CONFIG_MEDIA_TUNER_MT20XX=y
--CONFIG_MEDIA_TUNER_XC2028=y
--CONFIG_MEDIA_TUNER_XC5000=y
--CONFIG_MEDIA_TUNER_MC44S803=y
--CONFIG_VIDEO_V4L2=y
--CONFIG_VIDEO_V4L1=y
--CONFIG_VIDEO_CAPTURE_DRIVERS=y
--# CONFIG_VIDEO_ADV_DEBUG is not set
--# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
--CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
--# CONFIG_VIDEO_VIVI is not set
--# CONFIG_VIDEO_CPIA is not set
--# CONFIG_VIDEO_SAA5246A is not set
--# CONFIG_VIDEO_SAA5249 is not set
--# CONFIG_SOC_CAMERA is not set
--# CONFIG_RADIO_ADAPTERS is not set
--# CONFIG_DAB is not set
-+# CONFIG_AB3100_CORE is not set
-+# CONFIG_EZX_PCAP is not set
-+# CONFIG_MEDIA_SUPPORT is not set
-
- #
- # Graphics support
-@@ -917,6 +931,7 @@ CONFIG_RTC_DRV_PCF8563=y
- # CONFIG_RTC_DRV_S35390A is not set
- # CONFIG_RTC_DRV_FM3130 is not set
- # CONFIG_RTC_DRV_RX8581 is not set
-+# CONFIG_RTC_DRV_RX8025 is not set
-
- #
- # SPI RTC drivers
-@@ -962,12 +977,15 @@ CONFIG_RTC_DRV_PCF8563=y
- # CONFIG_REISERFS_FS is not set
- # CONFIG_JFS_FS is not set
- # CONFIG_FS_POSIX_ACL is not set
--CONFIG_FILE_LOCKING=y
- # CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- # CONFIG_BTRFS_FS is not set
-+CONFIG_FILE_LOCKING=y
-+CONFIG_FSNOTIFY=y
- # CONFIG_DNOTIFY is not set
- # CONFIG_INOTIFY is not set
-+CONFIG_INOTIFY_USER=y
- # CONFIG_QUOTA is not set
- # CONFIG_AUTOFS_FS is not set
- # CONFIG_AUTOFS4_FS is not set
-@@ -1021,6 +1039,12 @@ CONFIG_JFFS2_ZLIB=y
- # CONFIG_JFFS2_LZO is not set
- CONFIG_JFFS2_RTIME=y
- # CONFIG_JFFS2_RUBIN is not set
-+CONFIG_UBIFS_FS=y
-+# CONFIG_UBIFS_FS_XATTR is not set
-+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-+CONFIG_UBIFS_FS_LZO=y
-+CONFIG_UBIFS_FS_ZLIB=y
-+# CONFIG_UBIFS_FS_DEBUG is not set
- # CONFIG_CRAMFS is not set
- # CONFIG_SQUASHFS is not set
- # CONFIG_VXFS_FS is not set
-@@ -1119,25 +1143,11 @@ CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_NOP_TRACER=y
- CONFIG_HAVE_FUNCTION_TRACER=y
- CONFIG_RING_BUFFER=y
-+CONFIG_EVENT_TRACING=y
-+CONFIG_CONTEXT_SWITCH_TRACER=y
- CONFIG_TRACING=y
- CONFIG_TRACING_SUPPORT=y
--
--#
--# Tracers
--#
--# CONFIG_FUNCTION_TRACER is not set
--# CONFIG_IRQSOFF_TRACER is not set
--# CONFIG_PREEMPT_TRACER is not set
--# CONFIG_SCHED_TRACER is not set
--# CONFIG_CONTEXT_SWITCH_TRACER is not set
--# CONFIG_EVENT_TRACER is not set
--# CONFIG_BOOT_TRACER is not set
--# CONFIG_TRACE_BRANCH_PROFILING is not set
--# CONFIG_STACK_TRACER is not set
--# CONFIG_KMEMTRACE is not set
--# CONFIG_WORKQUEUE_TRACER is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_FTRACE_STARTUP_TEST is not set
-+# CONFIG_FTRACE is not set
- # CONFIG_DYNAMIC_DEBUG is not set
- # CONFIG_SAMPLES is not set
- CONFIG_HAVE_ARCH_KGDB=y
-@@ -1151,16 +1161,104 @@ CONFIG_ARM_UNWIND=y
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITYFS is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
--# CONFIG_CRYPTO is not set
-+CONFIG_CRYPTO=y
-+
-+#
-+# Crypto core or helper
-+#
-+# CONFIG_CRYPTO_FIPS is not set
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_ALGAPI2=y
-+# CONFIG_CRYPTO_MANAGER is not set
-+# CONFIG_CRYPTO_MANAGER2 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_TEST is not set
-+
-+#
-+# Authenticated Encryption with Associated Data
-+#
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_SEQIV is not set
-+
-+#
-+# Block modes
-+#
-+# CONFIG_CRYPTO_CBC is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_CTS is not set
-+# CONFIG_CRYPTO_ECB is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_XTS is not set
-+
-+#
-+# Hash modes
-+#
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+
-+#
-+# Digest
-+#
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+# CONFIG_CRYPTO_MD5 is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_RMD128 is not set
-+# CONFIG_CRYPTO_RMD160 is not set
-+# CONFIG_CRYPTO_RMD256 is not set
-+# CONFIG_CRYPTO_RMD320 is not set
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+
-+#
-+# Ciphers
-+#
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_DES is not set
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+
-+#
-+# Compression
-+#
-+CONFIG_CRYPTO_DEFLATE=y
-+# CONFIG_CRYPTO_ZLIB is not set
-+CONFIG_CRYPTO_LZO=y
-+
-+#
-+# Random Number Generation
-+#
-+# CONFIG_CRYPTO_ANSI_CPRNG is not set
-+CONFIG_CRYPTO_HW=y
- CONFIG_BINARY_PRINTF=y
-
- #
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+CONFIG_RATIONAL=y
- CONFIG_GENERIC_FIND_LAST_BIT=y
- # CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
-+CONFIG_CRC16=y
- # CONFIG_CRC_T10DIF is not set
- # CONFIG_CRC_ITU_T is not set
- CONFIG_CRC32=y
-@@ -1168,6 +1266,8 @@ CONFIG_CRC32=y
- # CONFIG_LIBCRC32C is not set
- CONFIG_ZLIB_INFLATE=y
- CONFIG_ZLIB_DEFLATE=y
-+CONFIG_LZO_COMPRESS=y
-+CONFIG_LZO_DECOMPRESS=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
---- a/arch/arm/configs/mx3_defconfig
-+++ b/arch/arm/configs/mx3_defconfig
-@@ -1,15 +1,15 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.30-rc1
--# Wed Apr 8 11:06:37 2009
-+# Linux kernel version: 2.6.31-rc4
-+# Tue Jul 28 14:11:34 2009
- #
- CONFIG_ARM=y
-+CONFIG_HAVE_PWM=y
- CONFIG_SYS_SUPPORTS_APM_EMULATION=y
- CONFIG_GENERIC_GPIO=y
- CONFIG_GENERIC_TIME=y
- CONFIG_GENERIC_CLOCKEVENTS=y
- CONFIG_MMU=y
--# CONFIG_NO_IOPORT is not set
- CONFIG_GENERIC_HARDIRQS=y
- CONFIG_STACKTRACE_SUPPORT=y
- CONFIG_HAVE_LATENCYTOP_SUPPORT=y
-@@ -18,14 +18,13 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
- CONFIG_HARDIRQS_SW_RESEND=y
- CONFIG_GENERIC_IRQ_PROBE=y
- CONFIG_RWSEM_GENERIC_SPINLOCK=y
--# CONFIG_ARCH_HAS_ILOG2_U32 is not set
--# CONFIG_ARCH_HAS_ILOG2_U64 is not set
- CONFIG_GENERIC_HWEIGHT=y
- CONFIG_GENERIC_CALIBRATE_DELAY=y
- CONFIG_ARCH_MTD_XIP=y
- CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
- CONFIG_VECTORS_BASE=0xffff0000
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+CONFIG_CONSTRUCTORS=y
-
- #
- # General setup
-@@ -86,7 +85,12 @@ CONFIG_TIMERFD=y
- CONFIG_EVENTFD=y
- CONFIG_SHMEM=y
- CONFIG_AIO=y
-+
-+#
-+# Performance Counters
-+#
- CONFIG_VM_EVENT_COUNTERS=y
-+# CONFIG_STRIP_ASM_SYMS is not set
- CONFIG_COMPAT_BRK=y
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
-@@ -97,6 +101,11 @@ CONFIG_HAVE_OPROFILE=y
- # CONFIG_KPROBES is not set
- CONFIG_HAVE_KPROBES=y
- CONFIG_HAVE_KRETPROBES=y
-+CONFIG_HAVE_CLK=y
-+
-+#
-+# GCOV-based kernel profiling
-+#
- # CONFIG_SLOW_WORK is not set
- CONFIG_HAVE_GENERIC_DMA_COHERENT=y
- CONFIG_SLABINFO=y
-@@ -109,7 +118,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
- CONFIG_MODVERSIONS=y
- # CONFIG_MODULE_SRCVERSION_ALL is not set
- CONFIG_BLOCK=y
--# CONFIG_LBD is not set
-+CONFIG_LBDAF=y
- # CONFIG_BLK_DEV_BSG is not set
- # CONFIG_BLK_DEV_INTEGRITY is not set
-
-@@ -136,13 +145,14 @@ CONFIG_FREEZER=y
- # CONFIG_ARCH_VERSATILE is not set
- # CONFIG_ARCH_AT91 is not set
- # CONFIG_ARCH_CLPS711X is not set
-+# CONFIG_ARCH_GEMINI is not set
- # CONFIG_ARCH_EBSA110 is not set
- # CONFIG_ARCH_EP93XX is not set
--# CONFIG_ARCH_GEMINI is not set
- # CONFIG_ARCH_FOOTBRIDGE is not set
-+CONFIG_ARCH_MXC=y
-+# CONFIG_ARCH_STMP3XXX is not set
- # CONFIG_ARCH_NETX is not set
- # CONFIG_ARCH_H720X is not set
--# CONFIG_ARCH_IMX is not set
- # CONFIG_ARCH_IOP13XX is not set
- # CONFIG_ARCH_IOP32X is not set
- # CONFIG_ARCH_IOP33X is not set
-@@ -151,25 +161,25 @@ CONFIG_FREEZER=y
- # CONFIG_ARCH_IXP4XX is not set
- # CONFIG_ARCH_L7200 is not set
- # CONFIG_ARCH_KIRKWOOD is not set
--# CONFIG_ARCH_KS8695 is not set
--# CONFIG_ARCH_NS9XXX is not set
- # CONFIG_ARCH_LOKI is not set
- # CONFIG_ARCH_MV78XX0 is not set
--CONFIG_ARCH_MXC=y
- # CONFIG_ARCH_ORION5X is not set
-+# CONFIG_ARCH_MMP is not set
-+# CONFIG_ARCH_KS8695 is not set
-+# CONFIG_ARCH_NS9XXX is not set
-+# CONFIG_ARCH_W90X900 is not set
- # CONFIG_ARCH_PNX4008 is not set
- # CONFIG_ARCH_PXA is not set
--# CONFIG_ARCH_MMP is not set
-+# CONFIG_ARCH_MSM is not set
- # CONFIG_ARCH_RPC is not set
- # CONFIG_ARCH_SA1100 is not set
- # CONFIG_ARCH_S3C2410 is not set
- # CONFIG_ARCH_S3C64XX is not set
- # CONFIG_ARCH_SHARK is not set
- # CONFIG_ARCH_LH7A40X is not set
-+# CONFIG_ARCH_U300 is not set
- # CONFIG_ARCH_DAVINCI is not set
- # CONFIG_ARCH_OMAP is not set
--# CONFIG_ARCH_MSM is not set
--# CONFIG_ARCH_W90X900 is not set
-
- #
- # Freescale MXC Implementations
-@@ -178,6 +188,7 @@ CONFIG_ARCH_MXC=y
- # CONFIG_ARCH_MX2 is not set
- CONFIG_ARCH_MX3=y
- CONFIG_ARCH_MX31=y
-+CONFIG_ARCH_MX35=y
-
- #
- # MX3 platforms:
-@@ -185,12 +196,19 @@ CONFIG_ARCH_MX31=y
- CONFIG_MACH_MX31ADS=y
- CONFIG_MACH_MX31ADS_WM1133_EV1=y
- CONFIG_MACH_PCM037=y
-+CONFIG_MACH_PCM037_EET=y
- CONFIG_MACH_MX31LITE=y
- CONFIG_MACH_MX31_3DS=y
- CONFIG_MACH_MX31MOBOARD=y
-+CONFIG_MACH_MX31LILLY=y
- CONFIG_MACH_QONG=y
-+CONFIG_MACH_PCM043=y
-+CONFIG_MACH_ARMADILLO5X0=y
-+CONFIG_MACH_MX35_3DS=y
- CONFIG_MXC_IRQ_PRIOR=y
- CONFIG_MXC_PWM=y
-+CONFIG_ARCH_HAS_RNGA=y
-+CONFIG_ARCH_MXC_IOMUX_V3=y
-
- #
- # Processor Type
-@@ -218,6 +236,7 @@ CONFIG_ARM_THUMB=y
- # CONFIG_CPU_BPREDICT_DISABLE is not set
- CONFIG_OUTER_CACHE=y
- CONFIG_CACHE_L2X0=y
-+# CONFIG_ARM_ERRATA_411920 is not set
- CONFIG_COMMON_CLKDEV=y
-
- #
-@@ -242,7 +261,6 @@ CONFIG_PREEMPT=y
- CONFIG_HZ=100
- CONFIG_AEABI=y
- CONFIG_OABI_COMPAT=y
--CONFIG_ARCH_FLATMEM_HAS_HOLES=y
- # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
- # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
- # CONFIG_HIGHMEM is not set
-@@ -257,10 +275,11 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
- # CONFIG_PHYS_ADDR_T_64BIT is not set
- CONFIG_ZONE_DMA_FLAG=0
- CONFIG_VIRT_TO_BUS=y
--CONFIG_UNEVICTABLE_LRU=y
- CONFIG_HAVE_MLOCK=y
- CONFIG_HAVE_MLOCKED_PAGE_BIT=y
-+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
- CONFIG_ALIGNMENT_TRAP=y
-+# CONFIG_UACCESS_WITH_MEMCPY is not set
-
- #
- # Boot options
-@@ -362,6 +381,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
- # CONFIG_ECONET is not set
- # CONFIG_WAN_ROUTER is not set
- # CONFIG_PHONET is not set
-+# CONFIG_IEEE802154 is not set
- # CONFIG_NET_SCHED is not set
- # CONFIG_DCB is not set
-
-@@ -465,7 +485,16 @@ CONFIG_MTD_PHYSMAP=y
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
-+CONFIG_MTD_NAND=y
-+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+# CONFIG_MTD_NAND_GPIO is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+CONFIG_MTD_NAND_MXC=y
- # CONFIG_MTD_ONENAND is not set
-
- #
-@@ -476,10 +505,30 @@ CONFIG_MTD_PHYSMAP=y
- #
- # UBI - Unsorted block images
- #
--# CONFIG_MTD_UBI is not set
-+CONFIG_MTD_UBI=y
-+CONFIG_MTD_UBI_WL_THRESHOLD=4096
-+CONFIG_MTD_UBI_BEB_RESERVE=1
-+# CONFIG_MTD_UBI_GLUEBI is not set
-+
-+#
-+# UBI debugging options
-+#
-+# CONFIG_MTD_UBI_DEBUG is not set
- # CONFIG_PARPORT is not set
- # CONFIG_BLK_DEV is not set
--# CONFIG_MISC_DEVICES is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_ICS932S401 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+# CONFIG_ISL29003 is not set
-+# CONFIG_C2PORT is not set
-+
-+#
-+# EEPROM support
-+#
-+CONFIG_EEPROM_AT24=y
-+# CONFIG_EEPROM_LEGACY is not set
-+# CONFIG_EEPROM_MAX6875 is not set
-+# CONFIG_EEPROM_93CX6 is not set
- CONFIG_HAVE_IDE=y
- # CONFIG_IDE is not set
-
-@@ -493,7 +542,6 @@ CONFIG_HAVE_IDE=y
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
- CONFIG_NETDEVICES=y
--CONFIG_COMPAT_NET_DEV_OPS=y
- # CONFIG_DUMMY is not set
- # CONFIG_BONDING is not set
- # CONFIG_MACVLAN is not set
-@@ -528,7 +576,7 @@ CONFIG_MII=y
- # CONFIG_ETHOC is not set
- # CONFIG_SMC911X is not set
- CONFIG_SMSC911X=y
--# CONFIG_DNET is not set
-+CONFIG_DNET=y
- # CONFIG_IBM_NEW_EMAC_ZMII is not set
- # CONFIG_IBM_NEW_EMAC_RGMII is not set
- # CONFIG_IBM_NEW_EMAC_TAH is not set
-@@ -537,8 +585,10 @@ CONFIG_SMSC911X=y
- # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
- # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
- # CONFIG_B44 is not set
--CONFIG_CS89x0=y
--CONFIG_CS89x0_NONISA_IRQ=y
-+# CONFIG_CS89x0 is not set
-+# CONFIG_KS8842 is not set
-+CONFIG_FEC=y
-+# CONFIG_FEC2 is not set
- # CONFIG_NETDEV_1000 is not set
- # CONFIG_NETDEV_10000 is not set
-
-@@ -609,6 +659,7 @@ CONFIG_I2C_HELPER_AUTO=y
- #
- # I2C system bus drivers (mostly embedded / system-on-chip)
- #
-+# CONFIG_I2C_DESIGNWARE is not set
- # CONFIG_I2C_GPIO is not set
- CONFIG_I2C_IMX=y
- # CONFIG_I2C_OCORES is not set
-@@ -633,7 +684,6 @@ CONFIG_I2C_IMX=y
- # CONFIG_SENSORS_PCF8574 is not set
- # CONFIG_PCF8575 is not set
- # CONFIG_SENSORS_PCA9539 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
-@@ -669,6 +719,7 @@ CONFIG_W1=y
- #
- # CONFIG_W1_MASTER_DS2482 is not set
- CONFIG_W1_MASTER_MXC=y
-+# CONFIG_W1_MASTER_DS1WM is not set
- # CONFIG_W1_MASTER_GPIO is not set
-
- #
-@@ -703,6 +754,8 @@ CONFIG_SSB_POSSIBLE=y
- # CONFIG_TPS65010 is not set
- # CONFIG_TWL4030_CORE is not set
- # CONFIG_MFD_TMIO is not set
-+# CONFIG_MFD_T7L66XB is not set
-+# CONFIG_MFD_TC6387XB is not set
- # CONFIG_MFD_TC6393XB is not set
- # CONFIG_PMIC_DA903X is not set
- # CONFIG_MFD_WM8400 is not set
-@@ -711,10 +764,8 @@ CONFIG_MFD_WM8350_CONFIG_MODE_0=y
- CONFIG_MFD_WM8352_CONFIG_MODE_0=y
- CONFIG_MFD_WM8350_I2C=y
- # CONFIG_MFD_PCF50633 is not set
--
--#
--# Multimedia devices
--#
-+# CONFIG_AB3100_CORE is not set
-+CONFIG_MEDIA_SUPPORT=y
-
- #
- # Multimedia core support
-@@ -758,8 +809,10 @@ CONFIG_SOC_CAMERA_MT9T031=y
- CONFIG_SOC_CAMERA_MT9V022=y
- CONFIG_SOC_CAMERA_TW9910=y
- # CONFIG_SOC_CAMERA_PLATFORM is not set
--# CONFIG_SOC_CAMERA_OV772X is not set
-+CONFIG_SOC_CAMERA_OV772X=y
-+CONFIG_MX3_VIDEO=y
- CONFIG_VIDEO_MX3=y
-+# CONFIG_VIDEO_SH_MOBILE_CEU is not set
- # CONFIG_RADIO_ADAPTERS is not set
- # CONFIG_DAB is not set
-
-@@ -847,8 +900,11 @@ CONFIG_REGULATOR=y
- # CONFIG_REGULATOR_DEBUG is not set
- # CONFIG_REGULATOR_FIXED_VOLTAGE is not set
- # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
-+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
- # CONFIG_REGULATOR_BQ24022 is not set
-+# CONFIG_REGULATOR_MAX1586 is not set
- CONFIG_REGULATOR_WM8350=y
-+# CONFIG_REGULATOR_LP3971 is not set
- # CONFIG_UIO is not set
- # CONFIG_STAGING is not set
-
-@@ -861,10 +917,12 @@ CONFIG_REGULATOR_WM8350=y
- # CONFIG_REISERFS_FS is not set
- # CONFIG_JFS_FS is not set
- # CONFIG_FS_POSIX_ACL is not set
--CONFIG_FILE_LOCKING=y
- # CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
- # CONFIG_OCFS2_FS is not set
- # CONFIG_BTRFS_FS is not set
-+CONFIG_FILE_LOCKING=y
-+CONFIG_FSNOTIFY=y
- # CONFIG_DNOTIFY is not set
- CONFIG_INOTIFY=y
- CONFIG_INOTIFY_USER=y
-@@ -921,6 +979,12 @@ CONFIG_JFFS2_ZLIB=y
- # CONFIG_JFFS2_LZO is not set
- CONFIG_JFFS2_RTIME=y
- # CONFIG_JFFS2_RUBIN is not set
-+CONFIG_UBIFS_FS=y
-+# CONFIG_UBIFS_FS_XATTR is not set
-+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
-+CONFIG_UBIFS_FS_LZO=y
-+CONFIG_UBIFS_FS_ZLIB=y
-+# CONFIG_UBIFS_FS_DEBUG is not set
- # CONFIG_CRAMFS is not set
- # CONFIG_SQUASHFS is not set
- # CONFIG_VXFS_FS is not set
-@@ -937,6 +1001,7 @@ CONFIG_NFS_FS=y
- CONFIG_NFS_V3=y
- # CONFIG_NFS_V3_ACL is not set
- CONFIG_NFS_V4=y
-+# CONFIG_NFS_V4_1 is not set
- CONFIG_ROOT_NFS=y
- # CONFIG_NFSD is not set
- CONFIG_LOCKD=y
-@@ -979,22 +1044,7 @@ CONFIG_FRAME_WARN=1024
- CONFIG_SYSCTL_SYSCALL_CHECK=y
- CONFIG_HAVE_FUNCTION_TRACER=y
- CONFIG_TRACING_SUPPORT=y
--
--#
--# Tracers
--#
--# CONFIG_FUNCTION_TRACER is not set
--# CONFIG_IRQSOFF_TRACER is not set
--# CONFIG_PREEMPT_TRACER is not set
--# CONFIG_SCHED_TRACER is not set
--# CONFIG_CONTEXT_SWITCH_TRACER is not set
--# CONFIG_EVENT_TRACER is not set
--# CONFIG_BOOT_TRACER is not set
--# CONFIG_TRACE_BRANCH_PROFILING is not set
--# CONFIG_STACK_TRACER is not set
--# CONFIG_KMEMTRACE is not set
--# CONFIG_WORKQUEUE_TRACER is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_FTRACE is not set
- # CONFIG_SAMPLES is not set
- CONFIG_HAVE_ARCH_KGDB=y
- CONFIG_ARM_UNWIND=y
-@@ -1094,9 +1144,9 @@ CONFIG_CRYPTO_DES=y
- #
- # Compression
- #
--# CONFIG_CRYPTO_DEFLATE is not set
-+CONFIG_CRYPTO_DEFLATE=y
- # CONFIG_CRYPTO_ZLIB is not set
--# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_LZO=y
-
- #
- # Random Number Generation
-@@ -1109,9 +1159,10 @@ CONFIG_CRYPTO_HW=y
- # Library routines
- #
- CONFIG_BITREVERSE=y
-+CONFIG_RATIONAL=y
- CONFIG_GENERIC_FIND_LAST_BIT=y
- # CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
-+CONFIG_CRC16=y
- # CONFIG_CRC_T10DIF is not set
- # CONFIG_CRC_ITU_T is not set
- CONFIG_CRC32=y
-@@ -1119,6 +1170,8 @@ CONFIG_CRC32=y
- # CONFIG_LIBCRC32C is not set
- CONFIG_ZLIB_INFLATE=y
- CONFIG_ZLIB_DEFLATE=y
-+CONFIG_LZO_COMPRESS=y
-+CONFIG_LZO_DECOMPRESS=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
---- a/arch/arm/configs/omap3_evm_defconfig
-+++ b/arch/arm/configs/omap3_evm_defconfig
-@@ -1107,7 +1107,7 @@ CONFIG_USB_ZERO=m
- CONFIG_USB_OTG_UTILS=y
- # CONFIG_USB_GPIO_VBUS is not set
- # CONFIG_ISP1301_OMAP is not set
--CONFIG_TWL4030_USB=y
-+# CONFIG_TWL4030_USB is not set
- # CONFIG_NOP_USB_XCEIV is not set
- CONFIG_MMC=y
- # CONFIG_MMC_DEBUG is not set
---- a/arch/arm/include/asm/atomic.h
-+++ b/arch/arm/include/asm/atomic.h
-@@ -159,8 +159,6 @@ static inline void atomic_clear_mask(uns
-
- #else /* ARM_ARCH_6 */
-
--#include <asm/system.h>
--
- #ifdef CONFIG_SMP
- #error SMP not supported on pre-ARMv6 CPUs
- #endif
---- a/arch/arm/kernel/entry-common.S
-+++ b/arch/arm/kernel/entry-common.S
-@@ -148,7 +148,7 @@ trace:
- sub r0, r0, #MCOUNT_INSN_SIZE
- mov lr, pc
- mov pc, r2
-- mov lr, r1 @ restore lr
-+ ldr lr, [fp, #-4] @ restore lr
- ldmia sp!, {r0-r3, pc}
-
- #endif /* CONFIG_DYNAMIC_FTRACE */
---- a/arch/arm/kernel/signal.c
-+++ b/arch/arm/kernel/signal.c
-@@ -133,7 +133,7 @@ sys_sigaction(int sig, const struct old_
- }
-
- #ifdef CONFIG_CRUNCH
--static int preserve_crunch_context(struct crunch_sigframe *frame)
-+static int preserve_crunch_context(struct crunch_sigframe __user *frame)
- {
- char kbuf[sizeof(*frame) + 8];
- struct crunch_sigframe *kframe;
-@@ -146,7 +146,7 @@ static int preserve_crunch_context(struc
- return __copy_to_user(frame, kframe, sizeof(*frame));
- }
-
--static int restore_crunch_context(struct crunch_sigframe *frame)
-+static int restore_crunch_context(struct crunch_sigframe __user *frame)
- {
- char kbuf[sizeof(*frame) + 8];
- struct crunch_sigframe *kframe;
---- a/arch/arm/mach-davinci/board-dm355-evm.c
-+++ b/arch/arm/mach-davinci/board-dm355-evm.c
-@@ -37,7 +37,6 @@
- #include <mach/serial.h>
- #include <mach/nand.h>
- #include <mach/mmc.h>
--#include <mach/common.h>
-
- #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000
- #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000
---- a/arch/arm/mach-davinci/board-dm355-leopard.c
-+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
-@@ -36,7 +36,6 @@
- #include <mach/serial.h>
- #include <mach/nand.h>
- #include <mach/mmc.h>
--#include <mach/common.h>
-
- #define DAVINCI_ASYNC_EMIF_CONTROL_BASE 0x01e10000
- #define DAVINCI_ASYNC_EMIF_DATA_CE0_BASE 0x02000000
---- a/arch/arm/mach-davinci/board-dm644x-evm.c
-+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
-@@ -45,7 +45,6 @@
- #include <mach/nand.h>
- #include <mach/mmc.h>
- #include <mach/emac.h>
--#include <mach/common.h>
-
- #define DM644X_EVM_PHY_MASK (0x2)
- #define DM644X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */
---- a/arch/arm/mach-davinci/board-dm646x-evm.c
-+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
-@@ -47,7 +47,6 @@
- #include <mach/i2c.h>
- #include <mach/mmc.h>
- #include <mach/emac.h>
--#include <mach/common.h>
-
- #define DM646X_EVM_PHY_MASK (0x2)
- #define DM646X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */
---- a/arch/arm/mach-davinci/board-sffsdr.c
-+++ b/arch/arm/mach-davinci/board-sffsdr.c
-@@ -52,7 +52,6 @@
- #include <mach/serial.h>
- #include <mach/psc.h>
- #include <mach/mux.h>
--#include <mach/common.h>
-
- #define SFFSDR_PHY_MASK (0x2)
- #define SFFSDR_MDIO_FREQUENCY (2200000) /* PHY bus frequency */
---- a/arch/arm/mach-ep93xx/include/mach/ts72xx.h
-+++ b/arch/arm/mach-ep93xx/include/mach/ts72xx.h
-@@ -41,9 +41,6 @@
- #define TS72XX_OPTIONS2_TS9420_BOOT 0x02
-
-
--#define TS72XX_NOR_PHYS_BASE 0x60000000
--#define TS72XX_NOR2_PHYS_BASE 0x62000000
--
- #define TS72XX_NAND1_DATA_PHYS_BASE 0x60000000
- #define TS72XX_NAND2_DATA_PHYS_BASE 0x70000000
- #define TS72XX_NAND_DATA_VIRT_BASE 0xfebfc000
---- a/arch/arm/mach-ep93xx/ts72xx.c
-+++ b/arch/arm/mach-ep93xx/ts72xx.c
-@@ -112,13 +112,16 @@ static void __init ts72xx_map_io(void)
- }
- }
-
-+/*************************************************************************
-+ * NOR flash (TS-7200 only)
-+ *************************************************************************/
- static struct physmap_flash_data ts72xx_flash_data = {
-- .width = 1,
-+ .width = 2,
- };
-
- static struct resource ts72xx_flash_resource = {
-- .start = TS72XX_NOR_PHYS_BASE,
-- .end = TS72XX_NOR_PHYS_BASE + SZ_16M - 1,
-+ .start = EP93XX_CS6_PHYS_BASE,
-+ .end = EP93XX_CS6_PHYS_BASE + SZ_16M - 1,
- .flags = IORESOURCE_MEM,
- };
-
-@@ -132,6 +135,12 @@ static struct platform_device ts72xx_fla
- .resource = &ts72xx_flash_resource,
- };
-
-+static void __init ts72xx_register_flash(void)
-+{
-+ if (board_is_ts7200())
-+ platform_device_register(&ts72xx_flash);
-+}
-+
- static unsigned char ts72xx_rtc_readbyte(unsigned long addr)
- {
- __raw_writeb(addr, TS72XX_RTC_INDEX_VIRT_BASE);
-@@ -165,8 +174,7 @@ static struct ep93xx_eth_data ts72xx_eth
- static void __init ts72xx_init_machine(void)
- {
- ep93xx_init_devices();
-- if (board_is_ts7200())
-- platform_device_register(&ts72xx_flash);
-+ ts72xx_register_flash();
- platform_device_register(&ts72xx_rtc_device);
-
- ep93xx_register_eth(&ts72xx_eth_data, 1);
---- a/arch/arm/mach-ks8695/include/mach/hardware.h
-+++ b/arch/arm/mach-ks8695/include/mach/hardware.h
-@@ -17,6 +17,11 @@
- #include <asm/sizes.h>
-
- /*
-+ * Clocks are derived from MCLK, which is 25Mhz
-+ */
-+#define KS8695_CLOCK_RATE 25000000
-+
-+/*
- * Physical RAM address.
- */
- #define KS8695_SDRAM_PA 0x00000000
---- a/arch/arm/mach-ks8695/include/mach/timex.h
-+++ b/arch/arm/mach-ks8695/include/mach/timex.h
-@@ -14,7 +14,8 @@
- #ifndef __ASM_ARCH_TIMEX_H
- #define __ASM_ARCH_TIMEX_H
-
--/* timers are derived from MCLK, which is 25MHz */
--#define CLOCK_TICK_RATE 25000000
-+#include <mach/hardware.h>
-+
-+#define CLOCK_TICK_RATE KS8695_CLOCK_RATE
-
- #endif
---- a/arch/arm/mach-ks8695/pci.c
-+++ b/arch/arm/mach-ks8695/pci.c
-@@ -245,6 +245,9 @@ static int ks8695_pci_fault(unsigned lon
-
- static void __init ks8695_pci_preinit(void)
- {
-+ /* make software reset to avoid freeze if PCI bus was messed up */
-+ __raw_writel(0x80000000, KS8695_PCI_VA + KS8695_PBCS);
-+
- /* stage 1 initialization, subid, subdevice = 0x0001 */
- __raw_writel(0x00010001, KS8695_PCI_VA + KS8695_CRCSID);
-
---- a/arch/arm/mach-omap1/mcbsp.c
-+++ b/arch/arm/mach-omap1/mcbsp.c
-@@ -19,7 +19,6 @@
-
- #include <mach/irqs.h>
- #include <mach/dma.h>
--#include <mach/irqs.h>
- #include <mach/mux.h>
- #include <mach/cpu.h>
- #include <mach/mcbsp.h>
---- a/arch/arm/mach-omap2/board-omap3evm.c
-+++ b/arch/arm/mach-omap2/board-omap3evm.c
-@@ -25,6 +25,7 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/ads7846.h>
- #include <linux/i2c/twl4030.h>
-+#include <linux/usb/otg.h>
-
- #include <mach/hardware.h>
- #include <asm/mach-types.h>
-@@ -307,6 +308,10 @@ static void __init omap3_evm_init(void)
- ARRAY_SIZE(omap3evm_spi_board_info));
-
- omap_serial_init();
-+#ifdef CONFIG_NOP_USB_XCEIV
-+ /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
-+ usb_nop_xceiv_register();
-+#endif
- usb_musb_init();
- ads7846_dev_init();
- }
---- a/arch/arm/mach-omap2/mcbsp.c
-+++ b/arch/arm/mach-omap2/mcbsp.c
-@@ -19,7 +19,6 @@
-
- #include <mach/irqs.h>
- #include <mach/dma.h>
--#include <mach/irqs.h>
- #include <mach/mux.h>
- #include <mach/cpu.h>
- #include <mach/mcbsp.h>
---- a/arch/arm/mach-omap2/usb-musb.c
-+++ b/arch/arm/mach-omap2/usb-musb.c
-@@ -155,20 +155,6 @@ static struct platform_device musb_devic
- .resource = musb_resources,
- };
-
--#ifdef CONFIG_NOP_USB_XCEIV
--static u64 nop_xceiv_dmamask = DMA_BIT_MASK(32);
--
--static struct platform_device nop_xceiv_device = {
-- .name = "nop_usb_xceiv",
-- .id = -1,
-- .dev = {
-- .dma_mask = &nop_xceiv_dmamask,
-- .coherent_dma_mask = DMA_BIT_MASK(32),
-- .platform_data = NULL,
-- },
--};
--#endif
--
- void __init usb_musb_init(void)
- {
- if (cpu_is_omap243x())
-@@ -183,13 +169,6 @@ void __init usb_musb_init(void)
- */
- musb_plat.clock = "ick";
-
--#ifdef CONFIG_NOP_USB_XCEIV
-- if (platform_device_register(&nop_xceiv_device) < 0) {
-- printk(KERN_ERR "Unable to register NOP-XCEIV device\n");
-- return;
-- }
--#endif
--
- if (platform_device_register(&musb_device) < 0) {
- printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
- return;
---- a/arch/arm/mach-pxa/em-x270.c
-+++ b/arch/arm/mach-pxa/em-x270.c
-@@ -1141,12 +1141,16 @@ struct power_supply_info em_x270_psy_inf
-
- static void em_x270_battery_low(void)
- {
-+#if defined(CONFIG_APM_EMULATION)
- apm_queue_event(APM_LOW_BATTERY);
-+#endif
- }
-
- static void em_x270_battery_critical(void)
- {
-+#if defined(CONFIG_APM_EMULATION)
- apm_queue_event(APM_CRITICAL_SUSPEND);
-+#endif
- }
-
- struct da9030_battery_info em_x270_batterty_info = {
---- a/arch/arm/mach-pxa/palmld.c
-+++ b/arch/arm/mach-pxa/palmld.c
-@@ -128,6 +128,10 @@ static unsigned long palmld_pin_config[]
- GPIO38_GPIO, /* wifi ready */
- GPIO81_GPIO, /* wifi reset */
-
-+ /* FFUART */
-+ GPIO34_FFUART_RXD,
-+ GPIO39_FFUART_TXD,
-+
- /* HDD */
- GPIO98_GPIO, /* HDD reset */
- GPIO115_GPIO, /* HDD power */
---- a/arch/arm/mach-pxa/palmt5.c
-+++ b/arch/arm/mach-pxa/palmt5.c
-@@ -111,6 +111,10 @@ static unsigned long palmt5_pin_config[]
- /* PWM */
- GPIO16_PWM0_OUT,
-
-+ /* FFUART */
-+ GPIO34_FFUART_RXD,
-+ GPIO39_FFUART_TXD,
-+
- /* MISC */
- GPIO10_GPIO, /* hotsync button */
- GPIO90_GPIO, /* power detect */
---- a/arch/arm/mach-pxa/palmtx.c
-+++ b/arch/arm/mach-pxa/palmtx.c
-@@ -127,6 +127,10 @@ static unsigned long palmtx_pin_config[]
- GPIO76_LCD_PCLK,
- GPIO77_LCD_BIAS,
-
-+ /* FFUART */
-+ GPIO34_FFUART_RXD,
-+ GPIO39_FFUART_TXD,
-+
- /* MISC. */
- GPIO10_GPIO, /* hotsync button */
- GPIO12_GPIO, /* power detect */
---- a/arch/arm/mach-pxa/treo680.c
-+++ b/arch/arm/mach-pxa/treo680.c
-@@ -409,7 +409,7 @@ err1:
-
- static void treo680_irda_shutdown(struct device *dev)
- {
-- gpio_free(GPIO_NR_TREO680_AMP_EN);
-+ gpio_free(GPIO_NR_TREO680_IR_EN);
- }
-
- static struct pxaficp_platform_data treo680_ficp_info = {
---- a/arch/arm/mach-pxa/zylonite_pxa300.c
-+++ b/arch/arm/mach-pxa/zylonite_pxa300.c
-@@ -197,10 +197,12 @@ static void __init zylonite_detect_lcd_p
- for (i = 0; i < NUM_LCD_DETECT_PINS; i++) {
- id = id << 1;
- gpio = mfp_to_gpio(lcd_detect_pins[i]);
-+ gpio_request(gpio, "LCD_ID_PINS");
- gpio_direction_input(gpio);
-
- if (gpio_get_value(gpio))
- id = id | 0x1;
-+ gpio_free(gpio);
- }
-
- /* lcd id, flush out bit 1 */
---- a/arch/arm/mach-pxa/zylonite_pxa320.c
-+++ b/arch/arm/mach-pxa/zylonite_pxa320.c
-@@ -176,10 +176,12 @@ static void __init zylonite_detect_lcd_p
- for (i = 0; i < NUM_LCD_DETECT_PINS; i++) {
- id = id << 1;
- gpio = mfp_to_gpio(lcd_detect_pins[i]);
-+ gpio_request(gpio, "LCD_ID_PINS");
- gpio_direction_input(gpio);
-
- if (gpio_get_value(gpio))
- id = id | 0x1;
-+ gpio_free(gpio);
- }
-
- /* lcd id, flush out bit 1 */
---- a/arch/arm/mach-s3c2410/include/mach/gpio-core.h
-+++ b/arch/arm/mach-s3c2410/include/mach/gpio-core.h
-@@ -28,7 +28,7 @@ static inline struct s3c_gpio_chip *s3c_
- return NULL;
-
- chip = &s3c24xx_gpios[pin/32];
-- return (S3C2410_GPIO_OFFSET(pin) > chip->chip.ngpio) ? chip : NULL;
-+ return (S3C2410_GPIO_OFFSET(pin) < chip->chip.ngpio) ? chip : NULL;
- }
-
- #endif /* __ASM_ARCH_GPIO_CORE_H */
---- a/arch/arm/plat-s3c24xx/pwm.c
-+++ b/arch/arm/plat-s3c24xx/pwm.c
-@@ -246,6 +246,10 @@ int pwm_config(struct pwm_device *pwm, i
-
- tcmp = duty_ns / tin_ns;
- tcmp = tcnt - tcmp;
-+ /* the pwm hw only checks the compare register after a decrement,
-+ so the pin never toggles if tcmp = tcnt */
-+ if (tcmp == tcnt)
-+ tcmp--;
-
- pwm_dbg(pwm, "tin_ns=%lu, tcmp=%ld/%lu\n", tin_ns, tcmp, tcnt);
-
---- a/arch/arm/plat-s3c64xx/pm.c
-+++ b/arch/arm/plat-s3c64xx/pm.c
-@@ -117,8 +117,6 @@ void s3c_pm_save_core(void)
- * this.
- */
-
--#include <plat/regs-gpio.h>
--
- static void s3c64xx_cpu_suspend(void)
- {
- unsigned long tmp;
---- a/arch/arm/plat-s3c64xx/s3c6400-clock.c
-+++ b/arch/arm/plat-s3c64xx/s3c6400-clock.c
-@@ -153,7 +153,7 @@ static unsigned long s3c64xx_clk_arm_rou
- u32 div;
-
- if (parent < rate)
-- return rate;
-+ return parent;
-
- div = (parent / rate) - 1;
- if (div > armclk_mask)
-@@ -175,7 +175,7 @@ static int s3c64xx_clk_arm_set_rate(stru
- div = clk_get_rate(clk->parent) / rate;
-
- val = __raw_readl(S3C_CLK_DIV0);
-- val &= armclk_mask;
-+ val &= ~armclk_mask;
- val |= (div - 1);
- __raw_writel(val, S3C_CLK_DIV0);
-
---- a/arch/arm/plat-stmp3xxx/pinmux.c
-+++ b/arch/arm/plat-stmp3xxx/pinmux.c
-@@ -22,7 +22,6 @@
- #include <linux/sysdev.h>
- #include <linux/string.h>
- #include <linux/bitops.h>
--#include <linux/sysdev.h>
- #include <linux/irq.h>
-
- #include <mach/hardware.h>
---- a/arch/ia64/Makefile
-+++ b/arch/ia64/Makefile
-@@ -41,11 +41,6 @@ $(error Sorry, you need a newer version
- ftp://ftp.hpl.hp.com/pub/linux-ia64/gas-030124.tar.gz)
- endif
-
--ifeq ($(call cc-version),0304)
-- cflags-$(CONFIG_ITANIUM) += -mtune=merced
-- cflags-$(CONFIG_MCKINLEY) += -mtune=mckinley
--endif
--
- KBUILD_CFLAGS += $(cflags-y)
- head-y := arch/ia64/kernel/head.o arch/ia64/kernel/init_task.o
-
---- a/arch/ia64/include/asm/bitops.h
-+++ b/arch/ia64/include/asm/bitops.h
-@@ -286,7 +286,7 @@ __test_and_clear_bit(int nr, volatile vo
- {
- __u32 *p = (__u32 *) addr + (nr >> 5);
- __u32 m = 1 << (nr & 31);
-- int oldbitset = *p & m;
-+ int oldbitset = (*p & m) != 0;
-
- *p &= ~m;
- return oldbitset;
---- a/arch/ia64/include/asm/pgtable.h
-+++ b/arch/ia64/include/asm/pgtable.h
-@@ -155,7 +155,6 @@
- #include <linux/bitops.h>
- #include <asm/cacheflush.h>
- #include <asm/mmu_context.h>
--#include <asm/processor.h>
-
- /*
- * Next come the mappings that determine how mmap() protection bits
---- a/arch/ia64/kernel/ia64_ksyms.c
-+++ b/arch/ia64/kernel/ia64_ksyms.c
-@@ -21,6 +21,7 @@ EXPORT_SYMBOL(csum_ipv6_magic);
-
- #include <asm/page.h>
- EXPORT_SYMBOL(clear_page);
-+EXPORT_SYMBOL(copy_page);
-
- #ifdef CONFIG_VIRTUAL_MEM_MAP
- #include <linux/bootmem.h>
-@@ -60,9 +61,6 @@ EXPORT_SYMBOL(__udivdi3);
- EXPORT_SYMBOL(__moddi3);
- EXPORT_SYMBOL(__umoddi3);
-
--#include <asm/page.h>
--EXPORT_SYMBOL(copy_page);
--
- #if defined(CONFIG_MD_RAID456) || defined(CONFIG_MD_RAID456_MODULE)
- extern void xor_ia64_2(void);
- extern void xor_ia64_3(void);
---- a/arch/ia64/kernel/iosapic.c
-+++ b/arch/ia64/kernel/iosapic.c
-@@ -1072,6 +1072,10 @@ iosapic_init (unsigned long phys_addr, u
- }
-
- addr = ioremap(phys_addr, 0);
-+ if (addr == NULL) {
-+ spin_unlock_irqrestore(&iosapic_lock, flags);
-+ return -ENOMEM;
-+ }
- ver = iosapic_version(addr);
- if ((err = iosapic_check_gsi_range(gsi_base, ver))) {
- iounmap(addr);
---- a/arch/ia64/kernel/pci-dma.c
-+++ b/arch/ia64/kernel/pci-dma.c
-@@ -69,11 +69,6 @@ iommu_dma_init(void)
-
- int iommu_dma_supported(struct device *dev, u64 mask)
- {
-- struct dma_map_ops *ops = platform_dma_get_ops(dev);
--
-- if (ops->dma_supported)
-- return ops->dma_supported(dev, mask);
--
- /* Copied from i386. Doesn't make much sense, because it will
- only work for pci_alloc_coherent.
- The caller just has to use GFP_DMA in this case. */
---- a/arch/ia64/kernel/topology.c
-+++ b/arch/ia64/kernel/topology.c
-@@ -372,6 +372,10 @@ static int __cpuinit cache_add_dev(struc
- retval = kobject_init_and_add(&all_cpu_cache_info[cpu].kobj,
- &cache_ktype_percpu_entry, &sys_dev->kobj,
- "%s", "cache");
-+ if (unlikely(retval < 0)) {
-+ cpu_cache_sysfs_exit(cpu);
-+ return retval;
-+ }
-
- for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) {
- this_object = LEAF_KOBJECT_PTR(cpu,i);
-@@ -385,7 +389,7 @@ static int __cpuinit cache_add_dev(struc
- }
- kobject_put(&all_cpu_cache_info[cpu].kobj);
- cpu_cache_sysfs_exit(cpu);
-- break;
-+ return retval;
- }
- kobject_uevent(&(this_object->kobj), KOBJ_ADD);
- }
---- a/arch/ia64/kvm/mmio.c
-+++ b/arch/ia64/kvm/mmio.c
-@@ -247,7 +247,8 @@ void emulate_io_inst(struct kvm_vcpu *vc
- vcpu_get_fpreg(vcpu, inst.M9.f2, &v);
- /* Write high word. FIXME: this is a kludge! */
- v.u.bits[1] &= 0x3ffff;
-- mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE);
-+ mmio_access(vcpu, padr + 8, (u64 *)&v.u.bits[1], 8,
-+ ma, IOREQ_WRITE);
- data = v.u.bits[0];
- size = 3;
- } else if (inst.M10.major == 7 && inst.M10.x6 == 0x3B) {
-@@ -265,7 +266,8 @@ void emulate_io_inst(struct kvm_vcpu *vc
-
- /* Write high word.FIXME: this is a kludge! */
- v.u.bits[1] &= 0x3ffff;
-- mmio_access(vcpu, padr + 8, &v.u.bits[1], 8, ma, IOREQ_WRITE);
-+ mmio_access(vcpu, padr + 8, (u64 *)&v.u.bits[1],
-+ 8, ma, IOREQ_WRITE);
- data = v.u.bits[0];
- size = 3;
- } else if (inst.M10.major == 7 && inst.M10.x6 == 0x31) {
---- a/arch/ia64/kvm/vcpu.c
-+++ b/arch/ia64/kvm/vcpu.c
-@@ -461,7 +461,7 @@ void setreg(unsigned long regnum, unsign
- u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg)
- {
- struct kvm_pt_regs *regs = vcpu_regs(vcpu);
-- u64 val;
-+ unsigned long val;
-
- if (!reg)
- return 0;
-@@ -469,7 +469,7 @@ u64 vcpu_get_gr(struct kvm_vcpu *vcpu, u
- return val;
- }
-
--void vcpu_set_gr(struct kvm_vcpu *vcpu, u64 reg, u64 value, int nat)
-+void vcpu_set_gr(struct kvm_vcpu *vcpu, unsigned long reg, u64 value, int nat)
- {
- struct kvm_pt_regs *regs = vcpu_regs(vcpu);
- long sof = (regs->cr_ifs) & 0x7f;
-@@ -1072,7 +1072,7 @@ void kvm_ttag(struct kvm_vcpu *vcpu, INS
- vcpu_set_gr(vcpu, inst.M46.r1, tag, 0);
- }
-
--int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, u64 *padr)
-+int vcpu_tpa(struct kvm_vcpu *vcpu, u64 vadr, unsigned long *padr)
- {
- struct thash_data *data;
- union ia64_isr visr, pt_isr;
---- a/arch/ia64/kvm/vcpu.h
-+++ b/arch/ia64/kvm/vcpu.h
-@@ -686,14 +686,15 @@ static inline int highest_inservice_irq(
- return highest_bits((int *)&(VMX(vcpu, insvc[0])));
- }
-
--extern void vcpu_get_fpreg(struct kvm_vcpu *vcpu, u64 reg,
-+extern void vcpu_get_fpreg(struct kvm_vcpu *vcpu, unsigned long reg,
- struct ia64_fpreg *val);
--extern void vcpu_set_fpreg(struct kvm_vcpu *vcpu, u64 reg,
-+extern void vcpu_set_fpreg(struct kvm_vcpu *vcpu, unsigned long reg,
- struct ia64_fpreg *val);
--extern u64 vcpu_get_gr(struct kvm_vcpu *vcpu, u64 reg);
--extern void vcpu_set_gr(struct kvm_vcpu *vcpu, u64 reg, u64 val, int nat);
--extern u64 vcpu_get_psr(struct kvm_vcpu *vcpu);
--extern void vcpu_set_psr(struct kvm_vcpu *vcpu, u64 val);
-+extern u64 vcpu_get_gr(struct kvm_vcpu *vcpu, unsigned long reg);
-+extern void vcpu_set_gr(struct kvm_vcpu *vcpu, unsigned long reg,
-+ u64 val, int nat);
-+extern unsigned long vcpu_get_psr(struct kvm_vcpu *vcpu);
-+extern void vcpu_set_psr(struct kvm_vcpu *vcpu, unsigned long val);
- extern u64 vcpu_thash(struct kvm_vcpu *vcpu, u64 vadr);
- extern void vcpu_bsw0(struct kvm_vcpu *vcpu);
- extern void thash_vhpt_insert(struct kvm_vcpu *v, u64 pte,
---- a/arch/mn10300/include/asm/pci.h
-+++ b/arch/mn10300/include/asm/pci.h
-@@ -59,7 +59,6 @@ void pcibios_penalize_isa_irq(int irq);
- #include <linux/slab.h>
- #include <asm/scatterlist.h>
- #include <linux/string.h>
--#include <linux/mm.h>
- #include <asm/io.h>
-
- struct pci_dev;
---- a/arch/powerpc/include/asm/kvm_host.h
-+++ b/arch/powerpc/include/asm/kvm_host.h
-@@ -34,7 +34,7 @@
- #define KVM_COALESCED_MMIO_PAGE_OFFSET 1
-
- /* We don't currently support large pages. */
--#define KVM_PAGES_PER_HPAGE (1<<31)
-+#define KVM_PAGES_PER_HPAGE (1UL << 31)
-
- struct kvm;
- struct kvm_run;
---- a/arch/powerpc/kernel/dma.c
-+++ b/arch/powerpc/kernel/dma.c
-@@ -7,6 +7,7 @@
-
- #include <linux/device.h>
- #include <linux/dma-mapping.h>
-+#include <linux/lmb.h>
- #include <asm/bug.h>
- #include <asm/abs_addr.h>
-
-@@ -90,11 +91,10 @@ static void dma_direct_unmap_sg(struct d
- static int dma_direct_dma_supported(struct device *dev, u64 mask)
- {
- #ifdef CONFIG_PPC64
-- /* Could be improved to check for memory though it better be
-- * done via some global so platforms can set the limit in case
-+ /* Could be improved so platforms can set the limit in case
- * they have limited DMA windows
- */
-- return mask >= DMA_BIT_MASK(32);
-+ return mask >= (lmb_end_of_DRAM() - 1);
- #else
- return 1;
- #endif
---- a/arch/powerpc/kernel/mpc7450-pmu.c
-+++ b/arch/powerpc/kernel/mpc7450-pmu.c
-@@ -407,7 +407,8 @@ struct power_pmu mpc7450_pmu = {
-
- static int init_mpc7450_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
- return -ENODEV;
-
- return register_power_pmu(&mpc7450_pmu);
---- a/arch/powerpc/kernel/perf_counter.c
-+++ b/arch/powerpc/kernel/perf_counter.c
-@@ -518,6 +518,8 @@ void hw_perf_disable(void)
- struct cpu_hw_counters *cpuhw;
- unsigned long flags;
-
-+ if (!ppmu)
-+ return;
- local_irq_save(flags);
- cpuhw = &__get_cpu_var(cpu_hw_counters);
-
-@@ -572,6 +574,8 @@ void hw_perf_enable(void)
- int n_lim;
- int idx;
-
-+ if (!ppmu)
-+ return;
- local_irq_save(flags);
- cpuhw = &__get_cpu_var(cpu_hw_counters);
- if (!cpuhw->disabled) {
-@@ -737,6 +741,8 @@ int hw_perf_group_sched_in(struct perf_c
- long i, n, n0;
- struct perf_counter *sub;
-
-+ if (!ppmu)
-+ return 0;
- cpuhw = &__get_cpu_var(cpu_hw_counters);
- n0 = cpuhw->n_counters;
- n = collect_events(group_leader, ppmu->n_counter - n0,
-@@ -1281,6 +1287,8 @@ void hw_perf_counter_setup(int cpu)
- {
- struct cpu_hw_counters *cpuhw = &per_cpu(cpu_hw_counters, cpu);
-
-+ if (!ppmu)
-+ return;
- memset(cpuhw, 0, sizeof(*cpuhw));
- cpuhw->mmcr[0] = MMCR0_FC;
- }
---- a/arch/powerpc/kernel/power4-pmu.c
-+++ b/arch/powerpc/kernel/power4-pmu.c
-@@ -606,7 +606,8 @@ static struct power_pmu power4_pmu = {
-
- static int init_power4_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power4"))
- return -ENODEV;
-
- return register_power_pmu(&power4_pmu);
---- a/arch/powerpc/kernel/power5+-pmu.c
-+++ b/arch/powerpc/kernel/power5+-pmu.c
-@@ -678,8 +678,9 @@ static struct power_pmu power5p_pmu = {
-
- static int init_power5p_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
-- && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
-+ && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++")))
- return -ENODEV;
-
- return register_power_pmu(&power5p_pmu);
---- a/arch/powerpc/kernel/power5-pmu.c
-+++ b/arch/powerpc/kernel/power5-pmu.c
-@@ -618,7 +618,8 @@ static struct power_pmu power5_pmu = {
-
- static int init_power5_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
- return -ENODEV;
-
- return register_power_pmu(&power5_pmu);
---- a/arch/powerpc/kernel/power6-pmu.c
-+++ b/arch/powerpc/kernel/power6-pmu.c
-@@ -537,7 +537,8 @@ static struct power_pmu power6_pmu = {
-
- static int init_power6_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
- return -ENODEV;
-
- return register_power_pmu(&power6_pmu);
---- a/arch/powerpc/kernel/power7-pmu.c
-+++ b/arch/powerpc/kernel/power7-pmu.c
-@@ -366,7 +366,8 @@ static struct power_pmu power7_pmu = {
-
- static int init_power7_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
- return -ENODEV;
-
- return register_power_pmu(&power7_pmu);
---- a/arch/powerpc/kernel/ppc970-pmu.c
-+++ b/arch/powerpc/kernel/ppc970-pmu.c
-@@ -488,8 +488,9 @@ static struct power_pmu ppc970_pmu = {
-
- static int init_ppc970_pmu(void)
- {
-- if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
-- && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP"))
-+ if (!cur_cpu_spec->oprofile_cpu_type ||
-+ (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
-+ && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP")))
- return -ENODEV;
-
- return register_power_pmu(&ppc970_pmu);
---- a/arch/s390/kernel/early.c
-+++ b/arch/s390/kernel/early.c
-@@ -208,6 +208,9 @@ static noinline __init void detect_machi
- machine_flags |= MACHINE_FLAG_KVM;
- else
- machine_flags |= MACHINE_FLAG_VM;
-+
-+ /* Store machine flags for setting up lowcore early */
-+ S390_lowcore.machine_flags = machine_flags;
- }
-
- static __init void early_pgm_check_handler(void)
---- a/arch/s390/kvm/interrupt.c
-+++ b/arch/s390/kvm/interrupt.c
-@@ -386,7 +386,7 @@ no_timer:
- }
- __unset_cpu_idle(vcpu);
- __set_current_state(TASK_RUNNING);
-- remove_wait_queue(&vcpu->wq, &wait);
-+ remove_wait_queue(&vcpu->arch.local_int.wq, &wait);
- spin_unlock_bh(&vcpu->arch.local_int.lock);
- spin_unlock(&vcpu->arch.local_int.float_int->lock);
- hrtimer_try_to_cancel(&vcpu->arch.ckc_timer);
---- a/arch/s390/kvm/sigp.c
-+++ b/arch/s390/kvm/sigp.c
-@@ -169,7 +169,7 @@ static int __sigp_set_prefix(struct kvm_
- unsigned long *reg)
- {
- struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int;
-- struct kvm_s390_local_interrupt *li;
-+ struct kvm_s390_local_interrupt *li = NULL;
- struct kvm_s390_interrupt_info *inti;
- int rc;
- u8 tmp;
-@@ -189,9 +189,10 @@ static int __sigp_set_prefix(struct kvm_
- return 2; /* busy */
-
- spin_lock(&fi->lock);
-- li = fi->local_int[cpu_addr];
-+ if (cpu_addr < KVM_MAX_VCPUS)
-+ li = fi->local_int[cpu_addr];
-
-- if ((cpu_addr >= KVM_MAX_VCPUS) || (li == NULL)) {
-+ if (li == NULL) {
- rc = 1; /* incorrect state */
- *reg &= SIGP_STAT_INCORRECT_STATE;
- kfree(inti);
---- a/arch/x86/kernel/apic/x2apic_cluster.c
-+++ b/arch/x86/kernel/apic/x2apic_cluster.c
-@@ -17,11 +17,13 @@ static int x2apic_acpi_madt_oem_check(ch
- return x2apic_enabled();
- }
-
--/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */
--
-+/*
-+ * need to use more than cpu 0, because we need more vectors when
-+ * MSI-X are used.
-+ */
- static const struct cpumask *x2apic_target_cpus(void)
- {
-- return cpumask_of(0);
-+ return cpu_online_mask;
- }
-
- /*
---- a/arch/x86/kernel/apic/x2apic_phys.c
-+++ b/arch/x86/kernel/apic/x2apic_phys.c
-@@ -27,11 +27,13 @@ static int x2apic_acpi_madt_oem_check(ch
- return 0;
- }
-
--/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */
--
-+/*
-+ * need to use more than cpu 0, because we need more vectors when
-+ * MSI-X are used.
-+ */
- static const struct cpumask *x2apic_target_cpus(void)
- {
-- return cpumask_of(0);
-+ return cpu_online_mask;
- }
-
- static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask)
---- a/arch/x86/kernel/efi.c
-+++ b/arch/x86/kernel/efi.c
-@@ -354,7 +354,7 @@ void __init efi_init(void)
- */
- c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2);
- if (c16) {
-- for (i = 0; i < sizeof(vendor) && *c16; ++i)
-+ for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i)
- vendor[i] = *c16++;
- vendor[i] = '\0';
- } else
---- a/arch/x86/kernel/reboot.c
-+++ b/arch/x86/kernel/reboot.c
-@@ -405,7 +405,7 @@ EXPORT_SYMBOL(machine_real_restart);
- #endif /* CONFIG_X86_32 */
-
- /*
-- * Apple MacBook5,2 (2009 MacBook) needs reboot=p
-+ * Some Apple MacBook and MacBookPro's needs reboot=p to be able to reboot
- */
- static int __init set_pci_reboot(const struct dmi_system_id *d)
- {
-@@ -426,6 +426,14 @@ static struct dmi_system_id __initdata p
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5,2"),
- },
- },
-+ { /* Handle problems with rebooting on Apple MacBookPro5,1 */
-+ .callback = set_pci_reboot,
-+ .ident = "Apple MacBookPro5,1",
-+ .matches = {
-+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
-+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,1"),
-+ },
-+ },
- { }
- };
-
---- a/arch/x86/kernel/tsc.c
-+++ b/arch/x86/kernel/tsc.c
-@@ -275,15 +275,20 @@ static unsigned long pit_calibrate_tsc(u
- * use the TSC value at the transitions to calculate a pretty
- * good value for the TSC frequencty.
- */
-+static inline int pit_verify_msb(unsigned char val)
-+{
-+ /* Ignore LSB */
-+ inb(0x42);
-+ return inb(0x42) == val;
-+}
-+
- static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
- {
- int count;
- u64 tsc = 0;
-
- for (count = 0; count < 50000; count++) {
-- /* Ignore LSB */
-- inb(0x42);
-- if (inb(0x42) != val)
-+ if (!pit_verify_msb(val))
- break;
- tsc = get_cycles();
- }
-@@ -336,8 +341,7 @@ static unsigned long quick_pit_calibrate
- * to do that is to just read back the 16-bit counter
- * once from the PIT.
- */
-- inb(0x42);
-- inb(0x42);
-+ pit_verify_msb(0);
-
- if (pit_expect_msb(0xff, &tsc, &d1)) {
- for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
-@@ -348,8 +352,19 @@ static unsigned long quick_pit_calibrate
- * Iterate until the error is less than 500 ppm
- */
- delta -= tsc;
-- if (d1+d2 < delta >> 11)
-- goto success;
-+ if (d1+d2 >= delta >> 11)
-+ continue;
-+
-+ /*
-+ * Check the PIT one more time to verify that
-+ * all TSC reads were stable wrt the PIT.
-+ *
-+ * This also guarantees serialization of the
-+ * last cycle read ('d2') in pit_expect_msb.
-+ */
-+ if (!pit_verify_msb(0xfe - i))
-+ break;
-+ goto success;
- }
- }
- printk("Fast TSC calibration failed\n");
---- a/arch/x86/kernel/vmi_32.c
-+++ b/arch/x86/kernel/vmi_32.c
-@@ -441,7 +441,7 @@ vmi_startup_ipi_hook(int phys_apicid, un
- ap.ds = __USER_DS;
- ap.es = __USER_DS;
- ap.fs = __KERNEL_PERCPU;
-- ap.gs = 0;
-+ ap.gs = __KERNEL_STACK_CANARY;
-
- ap.eflags = 0;
-
---- a/arch/x86/kvm/i8254.c
-+++ b/arch/x86/kvm/i8254.c
-@@ -104,6 +104,9 @@ static s64 __kpit_elapsed(struct kvm *kv
- ktime_t remaining;
- struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state;
-
-+ if (!ps->pit_timer.period)
-+ return 0;
-+
- /*
- * The Counter does not stop when it reaches zero. In
- * Modes 0, 1, 4, and 5 the Counter ``wraps around'' to
---- a/arch/x86/kvm/mmu.c
-+++ b/arch/x86/kvm/mmu.c
-@@ -489,16 +489,20 @@ static unsigned long *gfn_to_rmap(struct
- *
- * If rmapp bit zero is one, (then rmap & ~1) points to a struct kvm_rmap_desc
- * containing more mappings.
-+ *
-+ * Returns the number of rmap entries before the spte was added or zero if
-+ * the spte was not added.
-+ *
- */
--static void rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage)
-+static int rmap_add(struct kvm_vcpu *vcpu, u64 *spte, gfn_t gfn, int lpage)
- {
- struct kvm_mmu_page *sp;
- struct kvm_rmap_desc *desc;
- unsigned long *rmapp;
-- int i;
-+ int i, count = 0;
-
- if (!is_rmap_pte(*spte))
-- return;
-+ return count;
- gfn = unalias_gfn(vcpu->kvm, gfn);
- sp = page_header(__pa(spte));
- sp->gfns[spte - sp->spt] = gfn;
-@@ -515,8 +519,10 @@ static void rmap_add(struct kvm_vcpu *vc
- } else {
- rmap_printk("rmap_add: %p %llx many->many\n", spte, *spte);
- desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul);
-- while (desc->shadow_ptes[RMAP_EXT-1] && desc->more)
-+ while (desc->shadow_ptes[RMAP_EXT-1] && desc->more) {
- desc = desc->more;
-+ count += RMAP_EXT;
-+ }
- if (desc->shadow_ptes[RMAP_EXT-1]) {
- desc->more = mmu_alloc_rmap_desc(vcpu);
- desc = desc->more;
-@@ -525,6 +531,7 @@ static void rmap_add(struct kvm_vcpu *vc
- ;
- desc->shadow_ptes[i] = spte;
- }
-+ return count;
- }
-
- static void rmap_desc_remove_entry(unsigned long *rmapp,
-@@ -754,6 +761,19 @@ static int kvm_age_rmapp(struct kvm *kvm
- return young;
- }
-
-+#define RMAP_RECYCLE_THRESHOLD 1000
-+
-+static void rmap_recycle(struct kvm_vcpu *vcpu, gfn_t gfn, int lpage)
-+{
-+ unsigned long *rmapp;
-+
-+ gfn = unalias_gfn(vcpu->kvm, gfn);
-+ rmapp = gfn_to_rmap(vcpu->kvm, gfn, lpage);
-+
-+ kvm_unmap_rmapp(vcpu->kvm, rmapp);
-+ kvm_flush_remote_tlbs(vcpu->kvm);
-+}
-+
- int kvm_age_hva(struct kvm *kvm, unsigned long hva)
- {
- return kvm_handle_hva(kvm, hva, kvm_age_rmapp);
-@@ -1407,24 +1427,25 @@ static int kvm_mmu_zap_page(struct kvm *
- */
- void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned int kvm_nr_mmu_pages)
- {
-+ int used_pages;
-+
-+ used_pages = kvm->arch.n_alloc_mmu_pages - kvm->arch.n_free_mmu_pages;
-+ used_pages = max(0, used_pages);
-+
- /*
- * If we set the number of mmu pages to be smaller be than the
- * number of actived pages , we must to free some mmu pages before we
- * change the value
- */
-
-- if ((kvm->arch.n_alloc_mmu_pages - kvm->arch.n_free_mmu_pages) >
-- kvm_nr_mmu_pages) {
-- int n_used_mmu_pages = kvm->arch.n_alloc_mmu_pages
-- - kvm->arch.n_free_mmu_pages;
--
-- while (n_used_mmu_pages > kvm_nr_mmu_pages) {
-+ if (used_pages > kvm_nr_mmu_pages) {
-+ while (used_pages > kvm_nr_mmu_pages) {
- struct kvm_mmu_page *page;
-
- page = container_of(kvm->arch.active_mmu_pages.prev,
- struct kvm_mmu_page, link);
- kvm_mmu_zap_page(kvm, page);
-- n_used_mmu_pages--;
-+ used_pages--;
- }
- kvm->arch.n_free_mmu_pages = 0;
- }
-@@ -1740,6 +1761,7 @@ static void mmu_set_spte(struct kvm_vcpu
- {
- int was_rmapped = 0;
- int was_writeble = is_writeble_pte(*shadow_pte);
-+ int rmap_count;
-
- pgprintk("%s: spte %llx access %x write_fault %d"
- " user_fault %d gfn %lx\n",
-@@ -1781,9 +1803,11 @@ static void mmu_set_spte(struct kvm_vcpu
-
- page_header_update_slot(vcpu->kvm, shadow_pte, gfn);
- if (!was_rmapped) {
-- rmap_add(vcpu, shadow_pte, gfn, largepage);
-+ rmap_count = rmap_add(vcpu, shadow_pte, gfn, largepage);
- if (!is_rmap_pte(*shadow_pte))
- kvm_release_pfn_clean(pfn);
-+ if (rmap_count > RMAP_RECYCLE_THRESHOLD)
-+ rmap_recycle(vcpu, gfn, largepage);
- } else {
- if (was_writeble)
- kvm_release_pfn_dirty(pfn);
---- a/arch/x86/kvm/svm.c
-+++ b/arch/x86/kvm/svm.c
-@@ -711,6 +711,7 @@ static void svm_vcpu_load(struct kvm_vcp
- svm->vmcb->control.tsc_offset += delta;
- vcpu->cpu = cpu;
- kvm_migrate_timers(vcpu);
-+ svm->asid_generation = 0;
- }
-
- for (i = 0; i < NR_HOST_SAVE_USER_MSRS; i++)
-@@ -1031,7 +1032,6 @@ static void new_asid(struct vcpu_svm *sv
- svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ALL_ASID;
- }
-
-- svm->vcpu.cpu = svm_data->cpu;
- svm->asid_generation = svm_data->asid_generation;
- svm->vmcb->control.asid = svm_data->next_asid++;
- }
-@@ -2300,8 +2300,8 @@ static void pre_svm_run(struct vcpu_svm
- struct svm_cpu_data *svm_data = per_cpu(svm_data, cpu);
-
- svm->vmcb->control.tlb_ctl = TLB_CONTROL_DO_NOTHING;
-- if (svm->vcpu.cpu != cpu ||
-- svm->asid_generation != svm_data->asid_generation)
-+ /* FIXME: handle wraparound of asid_generation */
-+ if (svm->asid_generation != svm_data->asid_generation)
- new_asid(svm, svm_data);
- }
-
---- a/arch/x86/kvm/vmx.c
-+++ b/arch/x86/kvm/vmx.c
-@@ -3157,8 +3157,8 @@ static void handle_invalid_guest_state(s
- struct vcpu_vmx *vmx = to_vmx(vcpu);
- enum emulation_result err = EMULATE_DONE;
-
-- preempt_enable();
- local_irq_enable();
-+ preempt_enable();
-
- while (!guest_state_valid(vcpu)) {
- err = emulate_instruction(vcpu, kvm_run, 0, 0, 0);
-@@ -3168,7 +3168,7 @@ static void handle_invalid_guest_state(s
-
- if (err != EMULATE_DONE) {
- kvm_report_emulation_failure(vcpu, "emulation failure");
-- return;
-+ break;
- }
-
- if (signal_pending(current))
-@@ -3177,8 +3177,8 @@ static void handle_invalid_guest_state(s
- schedule();
- }
-
-- local_irq_disable();
- preempt_disable();
-+ local_irq_disable();
-
- vmx->invalid_state_emulation_result = err;
- }
---- a/arch/x86/kvm/x86.c
-+++ b/arch/x86/kvm/x86.c
-@@ -704,11 +704,48 @@ static bool msr_mtrr_valid(unsigned msr)
- return false;
- }
-
-+static bool valid_pat_type(unsigned t)
-+{
-+ return t < 8 && (1 << t) & 0xf3; /* 0, 1, 4, 5, 6, 7 */
-+}
-+
-+static bool valid_mtrr_type(unsigned t)
-+{
-+ return t < 8 && (1 << t) & 0x73; /* 0, 1, 4, 5, 6 */
-+}
-+
-+static bool mtrr_valid(struct kvm_vcpu *vcpu, u32 msr, u64 data)
-+{
-+ int i;
-+
-+ if (!msr_mtrr_valid(msr))
-+ return false;
-+
-+ if (msr == MSR_IA32_CR_PAT) {
-+ for (i = 0; i < 8; i++)
-+ if (!valid_pat_type((data >> (i * 8)) & 0xff))
-+ return false;
-+ return true;
-+ } else if (msr == MSR_MTRRdefType) {
-+ if (data & ~0xcff)
-+ return false;
-+ return valid_mtrr_type(data & 0xff);
-+ } else if (msr >= MSR_MTRRfix64K_00000 && msr <= MSR_MTRRfix4K_F8000) {
-+ for (i = 0; i < 8 ; i++)
-+ if (!valid_mtrr_type((data >> (i * 8)) & 0xff))
-+ return false;
-+ return true;
-+ }
-+
-+ /* variable MTRRs */
-+ return valid_mtrr_type(data & 0xff);
-+}
-+
- static int set_msr_mtrr(struct kvm_vcpu *vcpu, u32 msr, u64 data)
- {
- u64 *p = (u64 *)&vcpu->arch.mtrr_state.fixed_ranges;
-
-- if (!msr_mtrr_valid(msr))
-+ if (!mtrr_valid(vcpu, msr, data))
- return 1;
-
- if (msr == MSR_MTRRdefType) {
-@@ -1079,14 +1116,13 @@ long kvm_arch_dev_ioctl(struct file *fil
- if (copy_to_user(user_msr_list, &msr_list, sizeof msr_list))
- goto out;
- r = -E2BIG;
-- if (n < num_msrs_to_save)
-+ if (n < msr_list.nmsrs)
- goto out;
- r = -EFAULT;
- if (copy_to_user(user_msr_list->indices, &msrs_to_save,
- num_msrs_to_save * sizeof(u32)))
- goto out;
-- if (copy_to_user(user_msr_list->indices
-- + num_msrs_to_save * sizeof(u32),
-+ if (copy_to_user(user_msr_list->indices + num_msrs_to_save,
- &emulated_msrs,
- ARRAY_SIZE(emulated_msrs) * sizeof(u32)))
- goto out;
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -219,6 +219,8 @@ enum {
- AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */
- AHCI_HFLAG_YES_NCQ = (1 << 9), /* force NCQ cap on */
- AHCI_HFLAG_NO_SUSPEND = (1 << 10), /* don't suspend */
-+ AHCI_HFLAG_SRST_TOUT_IS_OFFLINE = (1 << 11), /* treat SRST timeout as
-+ link offline */
-
- /* ap->flags bits */
-
-@@ -1663,6 +1665,7 @@ static int ahci_do_softreset(struct ata_
- int (*check_ready)(struct ata_link *link))
- {
- struct ata_port *ap = link->ap;
-+ struct ahci_host_priv *hpriv = ap->host->private_data;
- const char *reason = NULL;
- unsigned long now, msecs;
- struct ata_taskfile tf;
-@@ -1701,12 +1704,21 @@ static int ahci_do_softreset(struct ata_
-
- /* wait for link to become ready */
- rc = ata_wait_after_reset(link, deadline, check_ready);
-- /* link occupied, -ENODEV too is an error */
-- if (rc) {
-+ if (rc == -EBUSY && hpriv->flags & AHCI_HFLAG_SRST_TOUT_IS_OFFLINE) {
-+ /*
-+ * Workaround for cases where link online status can't
-+ * be trusted. Treat device readiness timeout as link
-+ * offline.
-+ */
-+ ata_link_printk(link, KERN_INFO,
-+ "device not ready, treating as offline\n");
-+ *class = ATA_DEV_NONE;
-+ } else if (rc) {
-+ /* link occupied, -ENODEV too is an error */
- reason = "device not ready";
- goto fail;
-- }
-- *class = ahci_dev_classify(ap);
-+ } else
-+ *class = ahci_dev_classify(ap);
-
- DPRINTK("EXIT, class=%u\n", *class);
- return 0;
-@@ -1773,7 +1785,8 @@ static int ahci_sb600_softreset(struct a
- irq_sts = readl(port_mmio + PORT_IRQ_STAT);
- if (irq_sts & PORT_IRQ_BAD_PMP) {
- ata_link_printk(link, KERN_WARNING,
-- "failed due to HW bug, retry pmp=0\n");
-+ "applying SB600 PMP SRST workaround "
-+ "and retrying\n");
- rc = ahci_do_softreset(link, class, 0, deadline,
- ahci_check_ready);
- }
-@@ -2726,6 +2739,56 @@ static bool ahci_broken_suspend(struct p
- return !ver || strcmp(ver, dmi->driver_data) < 0;
- }
-
-+static bool ahci_broken_online(struct pci_dev *pdev)
-+{
-+#define ENCODE_BUSDEVFN(bus, slot, func) \
-+ (void *)(unsigned long)(((bus) << 8) | PCI_DEVFN((slot), (func)))
-+ static const struct dmi_system_id sysids[] = {
-+ /*
-+ * There are several gigabyte boards which use
-+ * SIMG5723s configured as hardware RAID. Certain
-+ * 5723 firmware revisions shipped there keep the link
-+ * online but fail to answer properly to SRST or
-+ * IDENTIFY when no device is attached downstream
-+ * causing libata to retry quite a few times leading
-+ * to excessive detection delay.
-+ *
-+ * As these firmwares respond to the second reset try
-+ * with invalid device signature, considering unknown
-+ * sig as offline works around the problem acceptably.
-+ */
-+ {
-+ .ident = "EP45-DQ6",
-+ .matches = {
-+ DMI_MATCH(DMI_BOARD_VENDOR,
-+ "Gigabyte Technology Co., Ltd."),
-+ DMI_MATCH(DMI_BOARD_NAME, "EP45-DQ6"),
-+ },
-+ .driver_data = ENCODE_BUSDEVFN(0x0a, 0x00, 0),
-+ },
-+ {
-+ .ident = "EP45-DS5",
-+ .matches = {
-+ DMI_MATCH(DMI_BOARD_VENDOR,
-+ "Gigabyte Technology Co., Ltd."),
-+ DMI_MATCH(DMI_BOARD_NAME, "EP45-DS5"),
-+ },
-+ .driver_data = ENCODE_BUSDEVFN(0x03, 0x00, 0),
-+ },
-+ { } /* terminate list */
-+ };
-+#undef ENCODE_BUSDEVFN
-+ const struct dmi_system_id *dmi = dmi_first_match(sysids);
-+ unsigned int val;
-+
-+ if (!dmi)
-+ return false;
-+
-+ val = (unsigned long)dmi->driver_data;
-+
-+ return pdev->bus->number == (val >> 8) && pdev->devfn == (val & 0xff);
-+}
-+
- static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
- {
- static int printed_version;
-@@ -2841,6 +2904,12 @@ static int ahci_init_one(struct pci_dev
- "BIOS update required for suspend/resume\n");
- }
-
-+ if (ahci_broken_online(pdev)) {
-+ hpriv->flags |= AHCI_HFLAG_SRST_TOUT_IS_OFFLINE;
-+ dev_info(&pdev->dev,
-+ "online status unreliable, applying workaround\n");
-+ }
-+
- /* CAP.NP sometimes indicate the index of the last enabled
- * port, at other times, that of the last possible port, so
- * determining the maximum port number requires looking at
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -4302,6 +4302,9 @@ static const struct ata_blacklist_entry
- { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA },
- { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA },
-
-+ /* this one allows HPA unlocking but fails IOs on the area */
-+ { "OCZ-VERTEX", "1.30", ATA_HORKAGE_BROKEN_HPA },
-+
- /* Devices which report 1 sector over size HPA */
- { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, },
- { "ST320413A", NULL, ATA_HORKAGE_HPA_SIZE, },
---- a/drivers/ata/pata_at91.c
-+++ b/drivers/ata/pata_at91.c
-@@ -250,7 +250,7 @@ static int __devinit pata_at91_probe(str
- ata_port_desc(ap, "no IRQ, using PIO polling");
- }
-
-- info = kzalloc(sizeof(*info), GFP_KERNEL);
-+ info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
-
- if (!info) {
- dev_err(dev, "failed to allocate memory for private data\n");
-@@ -275,7 +275,7 @@ static int __devinit pata_at91_probe(str
- if (!info->ide_addr) {
- dev_err(dev, "failed to map IO base\n");
- ret = -ENOMEM;
-- goto err_ide_ioremap;
-+ goto err_put;
- }
-
- info->alt_addr = devm_ioremap(dev,
-@@ -284,7 +284,7 @@ static int __devinit pata_at91_probe(str
- if (!info->alt_addr) {
- dev_err(dev, "failed to map CTL base\n");
- ret = -ENOMEM;
-- goto err_alt_ioremap;
-+ goto err_put;
- }
-
- ap->ioaddr.cmd_addr = info->ide_addr;
-@@ -303,13 +303,8 @@ static int __devinit pata_at91_probe(str
- irq ? ata_sff_interrupt : NULL,
- irq_flags, &pata_at91_sht);
-
--err_alt_ioremap:
-- devm_iounmap(dev, info->ide_addr);
--
--err_ide_ioremap:
-+err_put:
- clk_put(info->mck);
-- kfree(info);
--
- return ret;
- }
-
-@@ -317,7 +312,6 @@ static int __devexit pata_at91_remove(st
- {
- struct ata_host *host = dev_get_drvdata(&pdev->dev);
- struct at91_ide_info *info;
-- struct device *dev = &pdev->dev;
-
- if (!host)
- return 0;
-@@ -328,11 +322,8 @@ static int __devexit pata_at91_remove(st
- if (!info)
- return 0;
-
-- devm_iounmap(dev, info->ide_addr);
-- devm_iounmap(dev, info->alt_addr);
- clk_put(info->mck);
-
-- kfree(info);
- return 0;
- }
-
---- a/drivers/ata/pata_atiixp.c
-+++ b/drivers/ata/pata_atiixp.c
-@@ -1,6 +1,7 @@
- /*
- * pata_atiixp.c - ATI PATA for new ATA layer
- * (C) 2005 Red Hat Inc
-+ * (C) 2009 Bartlomiej Zolnierkiewicz
- *
- * Based on
- *
-@@ -61,20 +62,19 @@ static void atiixp_set_pio_timing(struct
-
- struct pci_dev *pdev = to_pci_dev(ap->host->dev);
- int dn = 2 * ap->port_no + adev->devno;
--
-- /* Check this is correct - the order is odd in both drivers */
- int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1);
-- u16 pio_mode_data, pio_timing_data;
-+ u32 pio_timing_data;
-+ u16 pio_mode_data;
-
- pci_read_config_word(pdev, ATIIXP_IDE_PIO_MODE, &pio_mode_data);
- pio_mode_data &= ~(0x7 << (4 * dn));
- pio_mode_data |= pio << (4 * dn);
- pci_write_config_word(pdev, ATIIXP_IDE_PIO_MODE, pio_mode_data);
-
-- pci_read_config_word(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data);
-+ pci_read_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, &pio_timing_data);
- pio_timing_data &= ~(0xFF << timing_shift);
- pio_timing_data |= (pio_timings[pio] << timing_shift);
-- pci_write_config_word(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data);
-+ pci_write_config_dword(pdev, ATIIXP_IDE_PIO_TIMING, pio_timing_data);
- }
-
- /**
-@@ -119,16 +119,17 @@ static void atiixp_set_dmamode(struct at
- udma_mode_data |= dma << (4 * dn);
- pci_write_config_word(pdev, ATIIXP_IDE_UDMA_MODE, udma_mode_data);
- } else {
-- u16 mwdma_timing_data;
-- /* Check this is correct - the order is odd in both drivers */
- int timing_shift = (16 * ap->port_no) + 8 * (adev->devno ^ 1);
-+ u32 mwdma_timing_data;
-
- dma -= XFER_MW_DMA_0;
-
-- pci_read_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, &mwdma_timing_data);
-+ pci_read_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING,
-+ &mwdma_timing_data);
- mwdma_timing_data &= ~(0xFF << timing_shift);
- mwdma_timing_data |= (mwdma_timings[dma] << timing_shift);
-- pci_write_config_word(pdev, ATIIXP_IDE_MWDMA_TIMING, mwdma_timing_data);
-+ pci_write_config_dword(pdev, ATIIXP_IDE_MWDMA_TIMING,
-+ mwdma_timing_data);
- }
- /*
- * We must now look at the PIO mode situation. We may need to
---- a/drivers/ata/sata_nv.c
-+++ b/drivers/ata/sata_nv.c
-@@ -602,6 +602,7 @@ MODULE_VERSION(DRV_VERSION);
-
- static int adma_enabled;
- static int swncq_enabled = 1;
-+static int msi_enabled;
-
- static void nv_adma_register_mode(struct ata_port *ap)
- {
-@@ -2459,6 +2460,11 @@ static int nv_init_one(struct pci_dev *p
- } else if (type == SWNCQ)
- nv_swncq_host_init(host);
-
-+ if (msi_enabled) {
-+ dev_printk(KERN_NOTICE, &pdev->dev, "Using MSI\n");
-+ pci_enable_msi(pdev);
-+ }
-+
- pci_set_master(pdev);
- return ata_host_activate(host, pdev->irq, ipriv->irq_handler,
- IRQF_SHARED, ipriv->sht);
-@@ -2558,4 +2564,6 @@ module_param_named(adma, adma_enabled, b
- MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");
- module_param_named(swncq, swncq_enabled, bool, 0444);
- MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)");
-+module_param_named(msi, msi_enabled, bool, 0444);
-+MODULE_PARM_DESC(msi, "Enable use of MSI (Default: false)");
-
---- a/drivers/base/platform.c
-+++ b/drivers/base/platform.c
-@@ -483,9 +483,6 @@ int platform_driver_register(struct plat
- drv->driver.remove = platform_drv_remove;
- if (drv->shutdown)
- drv->driver.shutdown = platform_drv_shutdown;
-- if (drv->suspend || drv->resume)
-- pr_warning("Platform driver '%s' needs updating - please use "
-- "dev_pm_ops\n", drv->driver.name);
-
- return driver_register(&drv->driver);
- }
---- a/drivers/char/pty.c
-+++ b/drivers/char/pty.c
-@@ -144,6 +144,8 @@ static int pty_write(struct tty_struct *
-
- static int pty_write_room(struct tty_struct *tty)
- {
-+ if (tty->stopped)
-+ return 0;
- return pty_space(tty->link);
- }
-
---- a/drivers/gpu/drm/drm_irq.c
-+++ b/drivers/gpu/drm/drm_irq.c
-@@ -566,7 +566,7 @@ int drm_wait_vblank(struct drm_device *d
-
- ret = drm_vblank_get(dev, crtc);
- if (ret) {
-- DRM_ERROR("failed to acquire vblank counter, %d\n", ret);
-+ DRM_DEBUG("failed to acquire vblank counter, %d\n", ret);
- return ret;
- }
- seq = drm_vblank_count(dev, crtc);
---- a/drivers/gpu/drm/drm_modes.c
-+++ b/drivers/gpu/drm/drm_modes.c
-@@ -566,6 +566,8 @@ void drm_mode_connector_list_update(stru
- found_it = 1;
- /* if equal delete the probed mode */
- mode->status = pmode->status;
-+ /* Merge type bits together */
-+ mode->type |= pmode->type;
- list_del(&pmode->head);
- drm_mode_destroy(connector->dev, pmode);
- break;
---- a/drivers/gpu/drm/i915/i915_dma.c
-+++ b/drivers/gpu/drm/i915/i915_dma.c
-@@ -1186,6 +1186,13 @@ int i915_driver_load(struct drm_device *
- if (ret)
- goto out_iomapfree;
-
-+ dev_priv->wq = create_workqueue("i915");
-+ if (dev_priv->wq == NULL) {
-+ DRM_ERROR("Failed to create our workqueue.\n");
-+ ret = -ENOMEM;
-+ goto out_iomapfree;
-+ }
-+
- /* enable GEM by default */
- dev_priv->has_gem = 1;
-
-@@ -1211,7 +1218,7 @@ int i915_driver_load(struct drm_device *
- if (!I915_NEED_GFX_HWS(dev)) {
- ret = i915_init_phys_hws(dev);
- if (ret != 0)
-- goto out_iomapfree;
-+ goto out_workqueue_free;
- }
-
- i915_get_mem_freq(dev);
-@@ -1245,7 +1252,7 @@ int i915_driver_load(struct drm_device *
- ret = i915_load_modeset_init(dev, prealloc_size, agp_size);
- if (ret < 0) {
- DRM_ERROR("failed to init modeset\n");
-- goto out_rmmap;
-+ goto out_workqueue_free;
- }
- }
-
-@@ -1256,6 +1263,8 @@ int i915_driver_load(struct drm_device *
-
- return 0;
-
-+out_workqueue_free:
-+ destroy_workqueue(dev_priv->wq);
- out_iomapfree:
- io_mapping_free(dev_priv->mm.gtt_mapping);
- out_rmmap:
-@@ -1269,6 +1278,8 @@ int i915_driver_unload(struct drm_device
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-
-+ destroy_workqueue(dev_priv->wq);
-+
- io_mapping_free(dev_priv->mm.gtt_mapping);
- if (dev_priv->mm.gtt_mtrr >= 0) {
- mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
---- a/drivers/gpu/drm/i915/i915_drv.h
-+++ b/drivers/gpu/drm/i915/i915_drv.h
-@@ -219,6 +219,7 @@ typedef struct drm_i915_private {
- unsigned int lvds_vbt:1;
- unsigned int int_crt_support:1;
- unsigned int lvds_use_ssc:1;
-+ unsigned int edp_support:1;
- int lvds_ssc_freq;
-
- struct drm_i915_fence_reg fence_regs[16]; /* assume 965 */
-@@ -229,6 +230,8 @@ typedef struct drm_i915_private {
-
- spinlock_t error_lock;
- struct drm_i915_error_state *first_error;
-+ struct work_struct error_work;
-+ struct workqueue_struct *wq;
-
- /* Register state */
- u8 saveLBB;
-@@ -888,6 +891,7 @@ extern int i915_wait_ring(struct drm_dev
- IS_I915GM(dev)))
- #define SUPPORTS_INTEGRATED_HDMI(dev) (IS_G4X(dev) || IS_IGDNG(dev))
- #define SUPPORTS_INTEGRATED_DP(dev) (IS_G4X(dev) || IS_IGDNG(dev))
-+#define SUPPORTS_EDP(dev) (IS_IGDNG_M(dev))
- #define I915_HAS_HOTPLUG(dev) (IS_I945G(dev) || IS_I945GM(dev) || IS_I965G(dev))
- /* dsparb controlled by hw only */
- #define DSPARB_HWCONTROL(dev) (IS_G4X(dev) || IS_IGDNG(dev))
---- a/drivers/gpu/drm/i915/i915_gem.c
-+++ b/drivers/gpu/drm/i915/i915_gem.c
-@@ -1570,7 +1570,7 @@ i915_add_request(struct drm_device *dev,
- }
-
- if (was_empty && !dev_priv->mm.suspended)
-- schedule_delayed_work(&dev_priv->mm.retire_work, HZ);
-+ queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
- return seqno;
- }
-
-@@ -1719,7 +1719,7 @@ i915_gem_retire_work_handler(struct work
- i915_gem_retire_requests(dev);
- if (!dev_priv->mm.suspended &&
- !list_empty(&dev_priv->mm.request_list))
-- schedule_delayed_work(&dev_priv->mm.retire_work, HZ);
-+ queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, HZ);
- mutex_unlock(&dev->struct_mutex);
- }
-
---- a/drivers/gpu/drm/i915/i915_gem_debugfs.c
-+++ b/drivers/gpu/drm/i915/i915_gem_debugfs.c
-@@ -343,6 +343,8 @@ static int i915_error_state(struct seq_f
-
- error = dev_priv->first_error;
-
-+ seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
-+ error->time.tv_usec);
- seq_printf(m, "EIR: 0x%08x\n", error->eir);
- seq_printf(m, " PGTBL_ER: 0x%08x\n", error->pgtbl_er);
- seq_printf(m, " INSTPM: 0x%08x\n", error->instpm);
---- a/drivers/gpu/drm/i915/i915_irq.c
-+++ b/drivers/gpu/drm/i915/i915_irq.c
-@@ -190,7 +190,7 @@ u32 i915_get_vblank_counter(struct drm_d
- low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL;
-
- if (!i915_pipe_enabled(dev, pipe)) {
-- DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe);
-+ DRM_DEBUG("trying to get vblank count for disabled pipe %d\n", pipe);
- return 0;
- }
-
-@@ -219,7 +219,7 @@ u32 gm45_get_vblank_counter(struct drm_d
- int reg = pipe ? PIPEB_FRMCOUNT_GM45 : PIPEA_FRMCOUNT_GM45;
-
- if (!i915_pipe_enabled(dev, pipe)) {
-- DRM_ERROR("trying to get vblank count for disabled pipe %d\n", pipe);
-+ DRM_DEBUG("trying to get vblank count for disabled pipe %d\n", pipe);
- return 0;
- }
-
-@@ -290,6 +290,35 @@ irqreturn_t igdng_irq_handler(struct drm
- return ret;
- }
-
-+/**
-+ * i915_error_work_func - do process context error handling work
-+ * @work: work struct
-+ *
-+ * Fire an error uevent so userspace can see that a hang or error
-+ * was detected.
-+ */
-+static void i915_error_work_func(struct work_struct *work)
-+{
-+ drm_i915_private_t *dev_priv = container_of(work, drm_i915_private_t,
-+ error_work);
-+ struct drm_device *dev = dev_priv->dev;
-+ char *event_string = "ERROR=1";
-+ char *envp[] = { event_string, NULL };
-+
-+ DRM_DEBUG("generating error event\n");
-+
-+ kobject_uevent_env(&dev->primary->kdev.kobj, KOBJ_CHANGE, envp);
-+}
-+
-+/**
-+ * i915_capture_error_state - capture an error record for later analysis
-+ * @dev: drm device
-+ *
-+ * Should be called when an error is detected (either a hang or an error
-+ * interrupt) to capture error state from the time of the error. Fills
-+ * out a structure which becomes available in debugfs for user level tools
-+ * to pick up.
-+ */
- static void i915_capture_error_state(struct drm_device *dev)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-@@ -325,12 +354,137 @@ static void i915_capture_error_state(str
- error->acthd = I915_READ(ACTHD_I965);
- }
-
-+ do_gettimeofday(&error->time);
-+
- dev_priv->first_error = error;
-
- out:
- spin_unlock_irqrestore(&dev_priv->error_lock, flags);
- }
-
-+/**
-+ * i915_handle_error - handle an error interrupt
-+ * @dev: drm device
-+ *
-+ * Do some basic checking of regsiter state at error interrupt time and
-+ * dump it to the syslog. Also call i915_capture_error_state() to make
-+ * sure we get a record and make it available in debugfs. Fire a uevent
-+ * so userspace knows something bad happened (should trigger collection
-+ * of a ring dump etc.).
-+ */
-+static void i915_handle_error(struct drm_device *dev)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 eir = I915_READ(EIR);
-+ u32 pipea_stats = I915_READ(PIPEASTAT);
-+ u32 pipeb_stats = I915_READ(PIPEBSTAT);
-+
-+ i915_capture_error_state(dev);
-+
-+ printk(KERN_ERR "render error detected, EIR: 0x%08x\n",
-+ eir);
-+
-+ if (IS_G4X(dev)) {
-+ if (eir & (GM45_ERROR_MEM_PRIV | GM45_ERROR_CP_PRIV)) {
-+ u32 ipeir = I915_READ(IPEIR_I965);
-+
-+ printk(KERN_ERR " IPEIR: 0x%08x\n",
-+ I915_READ(IPEIR_I965));
-+ printk(KERN_ERR " IPEHR: 0x%08x\n",
-+ I915_READ(IPEHR_I965));
-+ printk(KERN_ERR " INSTDONE: 0x%08x\n",
-+ I915_READ(INSTDONE_I965));
-+ printk(KERN_ERR " INSTPS: 0x%08x\n",
-+ I915_READ(INSTPS));
-+ printk(KERN_ERR " INSTDONE1: 0x%08x\n",
-+ I915_READ(INSTDONE1));
-+ printk(KERN_ERR " ACTHD: 0x%08x\n",
-+ I915_READ(ACTHD_I965));
-+ I915_WRITE(IPEIR_I965, ipeir);
-+ (void)I915_READ(IPEIR_I965);
-+ }
-+ if (eir & GM45_ERROR_PAGE_TABLE) {
-+ u32 pgtbl_err = I915_READ(PGTBL_ER);
-+ printk(KERN_ERR "page table error\n");
-+ printk(KERN_ERR " PGTBL_ER: 0x%08x\n",
-+ pgtbl_err);
-+ I915_WRITE(PGTBL_ER, pgtbl_err);
-+ (void)I915_READ(PGTBL_ER);
-+ }
-+ }
-+
-+ if (IS_I9XX(dev)) {
-+ if (eir & I915_ERROR_PAGE_TABLE) {
-+ u32 pgtbl_err = I915_READ(PGTBL_ER);
-+ printk(KERN_ERR "page table error\n");
-+ printk(KERN_ERR " PGTBL_ER: 0x%08x\n",
-+ pgtbl_err);
-+ I915_WRITE(PGTBL_ER, pgtbl_err);
-+ (void)I915_READ(PGTBL_ER);
-+ }
-+ }
-+
-+ if (eir & I915_ERROR_MEMORY_REFRESH) {
-+ printk(KERN_ERR "memory refresh error\n");
-+ printk(KERN_ERR "PIPEASTAT: 0x%08x\n",
-+ pipea_stats);
-+ printk(KERN_ERR "PIPEBSTAT: 0x%08x\n",
-+ pipeb_stats);
-+ /* pipestat has already been acked */
-+ }
-+ if (eir & I915_ERROR_INSTRUCTION) {
-+ printk(KERN_ERR "instruction error\n");
-+ printk(KERN_ERR " INSTPM: 0x%08x\n",
-+ I915_READ(INSTPM));
-+ if (!IS_I965G(dev)) {
-+ u32 ipeir = I915_READ(IPEIR);
-+
-+ printk(KERN_ERR " IPEIR: 0x%08x\n",
-+ I915_READ(IPEIR));
-+ printk(KERN_ERR " IPEHR: 0x%08x\n",
-+ I915_READ(IPEHR));
-+ printk(KERN_ERR " INSTDONE: 0x%08x\n",
-+ I915_READ(INSTDONE));
-+ printk(KERN_ERR " ACTHD: 0x%08x\n",
-+ I915_READ(ACTHD));
-+ I915_WRITE(IPEIR, ipeir);
-+ (void)I915_READ(IPEIR);
-+ } else {
-+ u32 ipeir = I915_READ(IPEIR_I965);
-+
-+ printk(KERN_ERR " IPEIR: 0x%08x\n",
-+ I915_READ(IPEIR_I965));
-+ printk(KERN_ERR " IPEHR: 0x%08x\n",
-+ I915_READ(IPEHR_I965));
-+ printk(KERN_ERR " INSTDONE: 0x%08x\n",
-+ I915_READ(INSTDONE_I965));
-+ printk(KERN_ERR " INSTPS: 0x%08x\n",
-+ I915_READ(INSTPS));
-+ printk(KERN_ERR " INSTDONE1: 0x%08x\n",
-+ I915_READ(INSTDONE1));
-+ printk(KERN_ERR " ACTHD: 0x%08x\n",
-+ I915_READ(ACTHD_I965));
-+ I915_WRITE(IPEIR_I965, ipeir);
-+ (void)I915_READ(IPEIR_I965);
-+ }
-+ }
-+
-+ I915_WRITE(EIR, eir);
-+ (void)I915_READ(EIR);
-+ eir = I915_READ(EIR);
-+ if (eir) {
-+ /*
-+ * some errors might have become stuck,
-+ * mask them.
-+ */
-+ DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir);
-+ I915_WRITE(EMR, I915_READ(EMR) | eir);
-+ I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT);
-+ }
-+
-+ queue_work(dev_priv->wq, &dev_priv->error_work);
-+}
-+
- irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
- {
- struct drm_device *dev = (struct drm_device *) arg;
-@@ -372,6 +526,9 @@ irqreturn_t i915_driver_irq_handler(DRM_
- pipea_stats = I915_READ(PIPEASTAT);
- pipeb_stats = I915_READ(PIPEBSTAT);
-
-+ if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT)
-+ i915_handle_error(dev);
-+
- /*
- * Clear the PIPE(A|B)STAT regs before the IIR
- */
-@@ -403,86 +560,13 @@ irqreturn_t i915_driver_irq_handler(DRM_
- DRM_DEBUG("hotplug event received, stat 0x%08x\n",
- hotplug_status);
- if (hotplug_status & dev_priv->hotplug_supported_mask)
-- schedule_work(&dev_priv->hotplug_work);
-+ queue_work(dev_priv->wq,
-+ &dev_priv->hotplug_work);
-
- I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
- I915_READ(PORT_HOTPLUG_STAT);
- }
-
-- if (iir & I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT) {
-- u32 eir = I915_READ(EIR);
--
-- i915_capture_error_state(dev);
--
-- printk(KERN_ERR "render error detected, EIR: 0x%08x\n",
-- eir);
-- if (eir & I915_ERROR_PAGE_TABLE) {
-- u32 pgtbl_err = I915_READ(PGTBL_ER);
-- printk(KERN_ERR "page table error\n");
-- printk(KERN_ERR " PGTBL_ER: 0x%08x\n",
-- pgtbl_err);
-- I915_WRITE(PGTBL_ER, pgtbl_err);
-- (void)I915_READ(PGTBL_ER);
-- }
-- if (eir & I915_ERROR_MEMORY_REFRESH) {
-- printk(KERN_ERR "memory refresh error\n");
-- printk(KERN_ERR "PIPEASTAT: 0x%08x\n",
-- pipea_stats);
-- printk(KERN_ERR "PIPEBSTAT: 0x%08x\n",
-- pipeb_stats);
-- /* pipestat has already been acked */
-- }
-- if (eir & I915_ERROR_INSTRUCTION) {
-- printk(KERN_ERR "instruction error\n");
-- printk(KERN_ERR " INSTPM: 0x%08x\n",
-- I915_READ(INSTPM));
-- if (!IS_I965G(dev)) {
-- u32 ipeir = I915_READ(IPEIR);
--
-- printk(KERN_ERR " IPEIR: 0x%08x\n",
-- I915_READ(IPEIR));
-- printk(KERN_ERR " IPEHR: 0x%08x\n",
-- I915_READ(IPEHR));
-- printk(KERN_ERR " INSTDONE: 0x%08x\n",
-- I915_READ(INSTDONE));
-- printk(KERN_ERR " ACTHD: 0x%08x\n",
-- I915_READ(ACTHD));
-- I915_WRITE(IPEIR, ipeir);
-- (void)I915_READ(IPEIR);
-- } else {
-- u32 ipeir = I915_READ(IPEIR_I965);
--
-- printk(KERN_ERR " IPEIR: 0x%08x\n",
-- I915_READ(IPEIR_I965));
-- printk(KERN_ERR " IPEHR: 0x%08x\n",
-- I915_READ(IPEHR_I965));
-- printk(KERN_ERR " INSTDONE: 0x%08x\n",
-- I915_READ(INSTDONE_I965));
-- printk(KERN_ERR " INSTPS: 0x%08x\n",
-- I915_READ(INSTPS));
-- printk(KERN_ERR " INSTDONE1: 0x%08x\n",
-- I915_READ(INSTDONE1));
-- printk(KERN_ERR " ACTHD: 0x%08x\n",
-- I915_READ(ACTHD_I965));
-- I915_WRITE(IPEIR_I965, ipeir);
-- (void)I915_READ(IPEIR_I965);
-- }
-- }
--
-- I915_WRITE(EIR, eir);
-- (void)I915_READ(EIR);
-- eir = I915_READ(EIR);
-- if (eir) {
-- /*
-- * some errors might have become stuck,
-- * mask them.
-- */
-- DRM_ERROR("EIR stuck: 0x%08x, masking\n", eir);
-- I915_WRITE(EMR, I915_READ(EMR) | eir);
-- I915_WRITE(IIR, I915_RENDER_COMMAND_PARSER_ERROR_INTERRUPT);
-- }
-- }
--
- I915_WRITE(IIR, iir);
- new_iir = I915_READ(IIR); /* Flush posted writes */
-
-@@ -830,6 +914,7 @@ void i915_driver_irq_preinstall(struct d
- atomic_set(&dev_priv->irq_received, 0);
-
- INIT_WORK(&dev_priv->hotplug_work, i915_hotplug_work_func);
-+ INIT_WORK(&dev_priv->error_work, i915_error_work_func);
-
- if (IS_IGDNG(dev)) {
- igdng_irq_preinstall(dev);
---- a/drivers/gpu/drm/i915/i915_reg.h
-+++ b/drivers/gpu/drm/i915/i915_reg.h
-@@ -1395,6 +1395,7 @@
- #define TV_V_CHROMA_42 0x684a8
-
- /* Display Port */
-+#define DP_A 0x64000 /* eDP */
- #define DP_B 0x64100
- #define DP_C 0x64200
- #define DP_D 0x64300
-@@ -1437,13 +1438,22 @@
- /* Mystic DPCD version 1.1 special mode */
- #define DP_ENHANCED_FRAMING (1 << 18)
-
-+/* eDP */
-+#define DP_PLL_FREQ_270MHZ (0 << 16)
-+#define DP_PLL_FREQ_160MHZ (1 << 16)
-+#define DP_PLL_FREQ_MASK (3 << 16)
-+
- /** locked once port is enabled */
- #define DP_PORT_REVERSAL (1 << 15)
-
-+/* eDP */
-+#define DP_PLL_ENABLE (1 << 14)
-+
- /** sends the clock on lane 15 of the PEG for debug */
- #define DP_CLOCK_OUTPUT_ENABLE (1 << 13)
-
- #define DP_SCRAMBLING_DISABLE (1 << 12)
-+#define DP_SCRAMBLING_DISABLE_IGDNG (1 << 7)
-
- /** limit RGB values to avoid confusing TVs */
- #define DP_COLOR_RANGE_16_235 (1 << 8)
-@@ -1463,6 +1473,13 @@
- * is 20 bytes in each direction, hence the 5 fixed
- * data registers
- */
-+#define DPA_AUX_CH_CTL 0x64010
-+#define DPA_AUX_CH_DATA1 0x64014
-+#define DPA_AUX_CH_DATA2 0x64018
-+#define DPA_AUX_CH_DATA3 0x6401c
-+#define DPA_AUX_CH_DATA4 0x64020
-+#define DPA_AUX_CH_DATA5 0x64024
-+
- #define DPB_AUX_CH_CTL 0x64110
- #define DPB_AUX_CH_DATA1 0x64114
- #define DPB_AUX_CH_DATA2 0x64118
-@@ -1618,7 +1635,7 @@
- #define I830_FIFO_LINE_SIZE 32
- #define I945_FIFO_SIZE 127 /* 945 & 965 */
- #define I915_FIFO_SIZE 95
--#define I855GM_FIFO_SIZE 255
-+#define I855GM_FIFO_SIZE 127 /* In cachelines */
- #define I830_FIFO_SIZE 95
- #define I915_MAX_WM 0x3f
-
-@@ -1848,6 +1865,8 @@
- #define PFA_CTL_1 0x68080
- #define PFB_CTL_1 0x68880
- #define PF_ENABLE (1<<31)
-+#define PFA_WIN_SZ 0x68074
-+#define PFB_WIN_SZ 0x68874
-
- /* legacy palette */
- #define LGC_PALETTE_A 0x4a000
-@@ -2208,4 +2227,28 @@
- #define PCH_PP_OFF_DELAYS 0xc720c
- #define PCH_PP_DIVISOR 0xc7210
-
-+#define PCH_DP_B 0xe4100
-+#define PCH_DPB_AUX_CH_CTL 0xe4110
-+#define PCH_DPB_AUX_CH_DATA1 0xe4114
-+#define PCH_DPB_AUX_CH_DATA2 0xe4118
-+#define PCH_DPB_AUX_CH_DATA3 0xe411c
-+#define PCH_DPB_AUX_CH_DATA4 0xe4120
-+#define PCH_DPB_AUX_CH_DATA5 0xe4124
-+
-+#define PCH_DP_C 0xe4200
-+#define PCH_DPC_AUX_CH_CTL 0xe4210
-+#define PCH_DPC_AUX_CH_DATA1 0xe4214
-+#define PCH_DPC_AUX_CH_DATA2 0xe4218
-+#define PCH_DPC_AUX_CH_DATA3 0xe421c
-+#define PCH_DPC_AUX_CH_DATA4 0xe4220
-+#define PCH_DPC_AUX_CH_DATA5 0xe4224
-+
-+#define PCH_DP_D 0xe4300
-+#define PCH_DPD_AUX_CH_CTL 0xe4310
-+#define PCH_DPD_AUX_CH_DATA1 0xe4314
-+#define PCH_DPD_AUX_CH_DATA2 0xe4318
-+#define PCH_DPD_AUX_CH_DATA3 0xe431c
-+#define PCH_DPD_AUX_CH_DATA4 0xe4320
-+#define PCH_DPD_AUX_CH_DATA5 0xe4324
-+
- #endif /* _I915_REG_H_ */
---- a/drivers/gpu/drm/i915/i915_suspend.c
-+++ b/drivers/gpu/drm/i915/i915_suspend.c
-@@ -598,7 +598,7 @@ int i915_restore_state(struct drm_device
-
- for (i = 0; i < 16; i++) {
- I915_WRITE(SWF00 + (i << 2), dev_priv->saveSWF0[i]);
-- I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i+7]);
-+ I915_WRITE(SWF10 + (i << 2), dev_priv->saveSWF1[i]);
- }
- for (i = 0; i < 3; i++)
- I915_WRITE(SWF30 + (i << 2), dev_priv->saveSWF2[i]);
---- a/drivers/gpu/drm/i915/intel_bios.c
-+++ b/drivers/gpu/drm/i915/intel_bios.c
-@@ -97,14 +97,13 @@ static void
- parse_lfp_panel_data(struct drm_i915_private *dev_priv,
- struct bdb_header *bdb)
- {
-- struct drm_device *dev = dev_priv->dev;
- struct bdb_lvds_options *lvds_options;
- struct bdb_lvds_lfp_data *lvds_lfp_data;
- struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
- struct bdb_lvds_lfp_data_entry *entry;
- struct lvds_dvo_timing *dvo_timing;
- struct drm_display_mode *panel_fixed_mode;
-- int lfp_data_size;
-+ int lfp_data_size, dvo_timing_offset;
-
- /* Defaults if we can't find VBT info */
- dev_priv->lvds_dither = 0;
-@@ -133,14 +132,16 @@ parse_lfp_panel_data(struct drm_i915_pri
- entry = (struct bdb_lvds_lfp_data_entry *)
- ((uint8_t *)lvds_lfp_data->data + (lfp_data_size *
- lvds_options->panel_type));
-+ dvo_timing_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
-+ lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
-
-- /* On IGDNG mobile, LVDS data block removes panel fitting registers.
-- So dec 2 dword from dvo_timing offset */
-- if (IS_IGDNG(dev))
-- dvo_timing = (struct lvds_dvo_timing *)
-- ((u8 *)&entry->dvo_timing - 8);
-- else
-- dvo_timing = &entry->dvo_timing;
-+ /*
-+ * the size of fp_timing varies on the different platform.
-+ * So calculate the DVO timing relative offset in LVDS data
-+ * entry to get the DVO timing entry
-+ */
-+ dvo_timing = (struct lvds_dvo_timing *)
-+ ((unsigned char *)entry + dvo_timing_offset);
-
- panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
-
-@@ -295,6 +296,25 @@ parse_sdvo_device_mapping(struct drm_i91
- }
- return;
- }
-+
-+static void
-+parse_driver_features(struct drm_i915_private *dev_priv,
-+ struct bdb_header *bdb)
-+{
-+ struct drm_device *dev = dev_priv->dev;
-+ struct bdb_driver_features *driver;
-+
-+ /* set default for chips without eDP */
-+ if (!SUPPORTS_EDP(dev)) {
-+ dev_priv->edp_support = 0;
-+ return;
-+ }
-+
-+ driver = find_section(bdb, BDB_DRIVER_FEATURES);
-+ if (driver && driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
-+ dev_priv->edp_support = 1;
-+}
-+
- /**
- * intel_init_bios - initialize VBIOS settings & find VBT
- * @dev: DRM device
-@@ -345,6 +365,8 @@ intel_init_bios(struct drm_device *dev)
- parse_lfp_panel_data(dev_priv, bdb);
- parse_sdvo_panel_data(dev_priv, bdb);
- parse_sdvo_device_mapping(dev_priv, bdb);
-+ parse_driver_features(dev_priv, bdb);
-+
- pci_unmap_rom(pdev, bios);
-
- return 0;
---- a/drivers/gpu/drm/i915/intel_bios.h
-+++ b/drivers/gpu/drm/i915/intel_bios.h
-@@ -381,6 +381,51 @@ struct bdb_sdvo_lvds_options {
- } __attribute__((packed));
-
-
-+#define BDB_DRIVER_FEATURE_NO_LVDS 0
-+#define BDB_DRIVER_FEATURE_INT_LVDS 1
-+#define BDB_DRIVER_FEATURE_SDVO_LVDS 2
-+#define BDB_DRIVER_FEATURE_EDP 3
-+
-+struct bdb_driver_features {
-+ u8 boot_dev_algorithm:1;
-+ u8 block_display_switch:1;
-+ u8 allow_display_switch:1;
-+ u8 hotplug_dvo:1;
-+ u8 dual_view_zoom:1;
-+ u8 int15h_hook:1;
-+ u8 sprite_in_clone:1;
-+ u8 primary_lfp_id:1;
-+
-+ u16 boot_mode_x;
-+ u16 boot_mode_y;
-+ u8 boot_mode_bpp;
-+ u8 boot_mode_refresh;
-+
-+ u16 enable_lfp_primary:1;
-+ u16 selective_mode_pruning:1;
-+ u16 dual_frequency:1;
-+ u16 render_clock_freq:1; /* 0: high freq; 1: low freq */
-+ u16 nt_clone_support:1;
-+ u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
-+ u16 sprite_display_assign:1; /* 0: secondary; 1: primary */
-+ u16 cui_aspect_scaling:1;
-+ u16 preserve_aspect_ratio:1;
-+ u16 sdvo_device_power_down:1;
-+ u16 crt_hotplug:1;
-+ u16 lvds_config:2;
-+ u16 tv_hotplug:1;
-+ u16 hdmi_config:2;
-+
-+ u8 static_display:1;
-+ u8 reserved2:7;
-+ u16 legacy_crt_max_x;
-+ u16 legacy_crt_max_y;
-+ u8 legacy_crt_max_refresh;
-+
-+ u8 hdmi_termination;
-+ u8 custom_vbt_version;
-+} __attribute__((packed));
-+
- bool intel_init_bios(struct drm_device *dev);
-
- /*
---- a/drivers/gpu/drm/i915/intel_crt.c
-+++ b/drivers/gpu/drm/i915/intel_crt.c
-@@ -156,6 +156,9 @@ static bool intel_igdng_crt_detect_hotpl
-
- temp = adpa = I915_READ(PCH_ADPA);
-
-+ adpa &= ~ADPA_DAC_ENABLE;
-+ I915_WRITE(PCH_ADPA, adpa);
-+
- adpa &= ~ADPA_CRT_HOTPLUG_MASK;
-
- adpa |= (ADPA_CRT_HOTPLUG_PERIOD_128 |
-@@ -169,13 +172,14 @@ static bool intel_igdng_crt_detect_hotpl
- DRM_DEBUG("pch crt adpa 0x%x", adpa);
- I915_WRITE(PCH_ADPA, adpa);
-
-- /* This might not be needed as not specified in spec...*/
-- udelay(1000);
-+ while ((I915_READ(PCH_ADPA) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) != 0)
-+ ;
-
- /* Check the status to see if both blue and green are on now */
- adpa = I915_READ(PCH_ADPA);
-- if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) ==
-- ADPA_CRT_HOTPLUG_MONITOR_COLOR)
-+ adpa &= ADPA_CRT_HOTPLUG_MONITOR_MASK;
-+ if ((adpa == ADPA_CRT_HOTPLUG_MONITOR_COLOR) ||
-+ (adpa == ADPA_CRT_HOTPLUG_MONITOR_MONO))
- ret = true;
- else
- ret = false;
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -34,6 +34,8 @@
-
- #include "drm_crtc_helper.h"
-
-+#define HAS_eDP (intel_pipe_has_type(crtc, INTEL_OUTPUT_EDP))
-+
- bool intel_pipe_has_type (struct drm_crtc *crtc, int type);
- static void intel_update_watermarks(struct drm_device *dev);
-
-@@ -88,7 +90,7 @@ struct intel_limit {
- #define I8XX_P2_SLOW 4
- #define I8XX_P2_FAST 2
- #define I8XX_P2_LVDS_SLOW 14
--#define I8XX_P2_LVDS_FAST 14 /* No fast option */
-+#define I8XX_P2_LVDS_FAST 7
- #define I8XX_P2_SLOW_LIMIT 165000
-
- #define I9XX_DOT_MIN 20000
-@@ -268,6 +270,9 @@ intel_igdng_find_best_PLL(const intel_li
- static bool
- intel_find_pll_g4x_dp(const intel_limit_t *, struct drm_crtc *crtc,
- int target, int refclk, intel_clock_t *best_clock);
-+static bool
-+intel_find_pll_igdng_dp(const intel_limit_t *, struct drm_crtc *crtc,
-+ int target, int refclk, intel_clock_t *best_clock);
-
- static const intel_limit_t intel_limits_i8xx_dvo = {
- .dot = { .min = I8XX_DOT_MIN, .max = I8XX_DOT_MAX },
-@@ -598,6 +603,23 @@ bool intel_pipe_has_type (struct drm_crt
- return false;
- }
-
-+struct drm_connector *
-+intel_pipe_get_output (struct drm_crtc *crtc)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_mode_config *mode_config = &dev->mode_config;
-+ struct drm_connector *l_entry, *ret = NULL;
-+
-+ list_for_each_entry(l_entry, &mode_config->connector_list, head) {
-+ if (l_entry->encoder &&
-+ l_entry->encoder->crtc == crtc) {
-+ ret = l_entry;
-+ break;
-+ }
-+ }
-+ return ret;
-+}
-+
- #define INTELPllInvalid(s) do { /* DRM_DEBUG(s); */ return false; } while (0)
- /**
- * Returns whether the given set of divisors are valid for a given refclk with
-@@ -645,7 +667,7 @@ intel_find_best_PLL(const intel_limit_t
- int err = target;
-
- if (IS_I9XX(dev) && intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) &&
-- (I915_READ(LVDS) & LVDS_PORT_EN) != 0) {
-+ (I915_READ(LVDS)) != 0) {
- /*
- * For LVDS, if the panel is on, just rely on its current
- * settings for dual-channel. We haven't figured out how to
-@@ -752,6 +774,30 @@ intel_g4x_find_best_PLL(const intel_limi
- }
-
- static bool
-+intel_find_pll_igdng_dp(const intel_limit_t *limit, struct drm_crtc *crtc,
-+ int target, int refclk, intel_clock_t *best_clock)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ intel_clock_t clock;
-+ if (target < 200000) {
-+ clock.n = 1;
-+ clock.p1 = 2;
-+ clock.p2 = 10;
-+ clock.m1 = 12;
-+ clock.m2 = 9;
-+ } else {
-+ clock.n = 2;
-+ clock.p1 = 1;
-+ clock.p2 = 10;
-+ clock.m1 = 14;
-+ clock.m2 = 8;
-+ }
-+ intel_clock(dev, refclk, &clock);
-+ memcpy(best_clock, &clock, sizeof(intel_clock_t));
-+ return true;
-+}
-+
-+static bool
- intel_igdng_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
- int target, int refclk, intel_clock_t *best_clock)
- {
-@@ -763,6 +809,14 @@ intel_igdng_find_best_PLL(const intel_li
- int err_most = 47;
- found = false;
-
-+ /* eDP has only 2 clock choice, no n/m/p setting */
-+ if (HAS_eDP)
-+ return true;
-+
-+ if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT))
-+ return intel_find_pll_igdng_dp(limit, crtc, target,
-+ refclk, best_clock);
-+
- if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
- if ((I915_READ(LVDS) & LVDS_CLKB_POWER_MASK) ==
- LVDS_CLKB_POWER_UP)
-@@ -998,6 +1052,90 @@ intel_pipe_set_base(struct drm_crtc *crt
- return 0;
- }
-
-+/* Disable the VGA plane that we never use */
-+static void i915_disable_vga (struct drm_device *dev)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u8 sr1;
-+ u32 vga_reg;
-+
-+ if (IS_IGDNG(dev))
-+ vga_reg = CPU_VGACNTRL;
-+ else
-+ vga_reg = VGACNTRL;
-+
-+ if (I915_READ(vga_reg) & VGA_DISP_DISABLE)
-+ return;
-+
-+ I915_WRITE8(VGA_SR_INDEX, 1);
-+ sr1 = I915_READ8(VGA_SR_DATA);
-+ I915_WRITE8(VGA_SR_DATA, sr1 | (1 << 5));
-+ udelay(100);
-+
-+ I915_WRITE(vga_reg, VGA_DISP_DISABLE);
-+}
-+
-+static void igdng_disable_pll_edp (struct drm_crtc *crtc)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 dpa_ctl;
-+
-+ DRM_DEBUG("\n");
-+ dpa_ctl = I915_READ(DP_A);
-+ dpa_ctl &= ~DP_PLL_ENABLE;
-+ I915_WRITE(DP_A, dpa_ctl);
-+}
-+
-+static void igdng_enable_pll_edp (struct drm_crtc *crtc)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 dpa_ctl;
-+
-+ dpa_ctl = I915_READ(DP_A);
-+ dpa_ctl |= DP_PLL_ENABLE;
-+ I915_WRITE(DP_A, dpa_ctl);
-+ udelay(200);
-+}
-+
-+
-+static void igdng_set_pll_edp (struct drm_crtc *crtc, int clock)
-+{
-+ struct drm_device *dev = crtc->dev;
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 dpa_ctl;
-+
-+ DRM_DEBUG("eDP PLL enable for clock %d\n", clock);
-+ dpa_ctl = I915_READ(DP_A);
-+ dpa_ctl &= ~DP_PLL_FREQ_MASK;
-+
-+ if (clock < 200000) {
-+ u32 temp;
-+ dpa_ctl |= DP_PLL_FREQ_160MHZ;
-+ /* workaround for 160Mhz:
-+ 1) program 0x4600c bits 15:0 = 0x8124
-+ 2) program 0x46010 bit 0 = 1
-+ 3) program 0x46034 bit 24 = 1
-+ 4) program 0x64000 bit 14 = 1
-+ */
-+ temp = I915_READ(0x4600c);
-+ temp &= 0xffff0000;
-+ I915_WRITE(0x4600c, temp | 0x8124);
-+
-+ temp = I915_READ(0x46010);
-+ I915_WRITE(0x46010, temp | 1);
-+
-+ temp = I915_READ(0x46034);
-+ I915_WRITE(0x46034, temp | (1 << 24));
-+ } else {
-+ dpa_ctl |= DP_PLL_FREQ_270MHZ;
-+ }
-+ I915_WRITE(DP_A, dpa_ctl);
-+
-+ udelay(500);
-+}
-+
- static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode)
- {
- struct drm_device *dev = crtc->dev;
-@@ -1015,6 +1153,7 @@ static void igdng_crtc_dpms(struct drm_c
- int fdi_rx_imr_reg = (pipe == 0) ? FDI_RXA_IMR : FDI_RXB_IMR;
- int transconf_reg = (pipe == 0) ? TRANSACONF : TRANSBCONF;
- int pf_ctl_reg = (pipe == 0) ? PFA_CTL_1 : PFB_CTL_1;
-+ int pf_win_size = (pipe == 0) ? PFA_WIN_SZ : PFB_WIN_SZ;
- int cpu_htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B;
- int cpu_hblank_reg = (pipe == 0) ? HBLANK_A : HBLANK_B;
- int cpu_hsync_reg = (pipe == 0) ? HSYNC_A : HSYNC_B;
-@@ -1028,7 +1167,7 @@ static void igdng_crtc_dpms(struct drm_c
- int trans_vblank_reg = (pipe == 0) ? TRANS_VBLANK_A : TRANS_VBLANK_B;
- int trans_vsync_reg = (pipe == 0) ? TRANS_VSYNC_A : TRANS_VSYNC_B;
- u32 temp;
-- int tries = 5, j;
-+ int tries = 5, j, n;
-
- /* XXX: When our outputs are all unaware of DPMS modes other than off
- * and on, we should map those modes to DRM_MODE_DPMS_OFF in the CRTC.
-@@ -1038,27 +1177,32 @@ static void igdng_crtc_dpms(struct drm_c
- case DRM_MODE_DPMS_STANDBY:
- case DRM_MODE_DPMS_SUSPEND:
- DRM_DEBUG("crtc %d dpms on\n", pipe);
-- /* enable PCH DPLL */
-- temp = I915_READ(pch_dpll_reg);
-- if ((temp & DPLL_VCO_ENABLE) == 0) {
-- I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE);
-- I915_READ(pch_dpll_reg);
-- }
-+ if (HAS_eDP) {
-+ /* enable eDP PLL */
-+ igdng_enable_pll_edp(crtc);
-+ } else {
-+ /* enable PCH DPLL */
-+ temp = I915_READ(pch_dpll_reg);
-+ if ((temp & DPLL_VCO_ENABLE) == 0) {
-+ I915_WRITE(pch_dpll_reg, temp | DPLL_VCO_ENABLE);
-+ I915_READ(pch_dpll_reg);
-+ }
-
-- /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
-- temp = I915_READ(fdi_rx_reg);
-- I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE |
-- FDI_SEL_PCDCLK |
-- FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */
-- I915_READ(fdi_rx_reg);
-- udelay(200);
-+ /* enable PCH FDI RX PLL, wait warmup plus DMI latency */
-+ temp = I915_READ(fdi_rx_reg);
-+ I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE |
-+ FDI_SEL_PCDCLK |
-+ FDI_DP_PORT_WIDTH_X4); /* default 4 lanes */
-+ I915_READ(fdi_rx_reg);
-+ udelay(200);
-
-- /* Enable CPU FDI TX PLL, always on for IGDNG */
-- temp = I915_READ(fdi_tx_reg);
-- if ((temp & FDI_TX_PLL_ENABLE) == 0) {
-- I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE);
-- I915_READ(fdi_tx_reg);
-- udelay(100);
-+ /* Enable CPU FDI TX PLL, always on for IGDNG */
-+ temp = I915_READ(fdi_tx_reg);
-+ if ((temp & FDI_TX_PLL_ENABLE) == 0) {
-+ I915_WRITE(fdi_tx_reg, temp | FDI_TX_PLL_ENABLE);
-+ I915_READ(fdi_tx_reg);
-+ udelay(100);
-+ }
- }
-
- /* Enable CPU pipe */
-@@ -1077,122 +1221,126 @@ static void igdng_crtc_dpms(struct drm_c
- I915_WRITE(dspbase_reg, I915_READ(dspbase_reg));
- }
-
-- /* enable CPU FDI TX and PCH FDI RX */
-- temp = I915_READ(fdi_tx_reg);
-- temp |= FDI_TX_ENABLE;
-- temp |= FDI_DP_PORT_WIDTH_X4; /* default */
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- temp |= FDI_LINK_TRAIN_PATTERN_1;
-- I915_WRITE(fdi_tx_reg, temp);
-- I915_READ(fdi_tx_reg);
-+ if (!HAS_eDP) {
-+ /* enable CPU FDI TX and PCH FDI RX */
-+ temp = I915_READ(fdi_tx_reg);
-+ temp |= FDI_TX_ENABLE;
-+ temp |= FDI_DP_PORT_WIDTH_X4; /* default */
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ temp |= FDI_LINK_TRAIN_PATTERN_1;
-+ I915_WRITE(fdi_tx_reg, temp);
-+ I915_READ(fdi_tx_reg);
-
-- temp = I915_READ(fdi_rx_reg);
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- temp |= FDI_LINK_TRAIN_PATTERN_1;
-- I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE);
-- I915_READ(fdi_rx_reg);
-+ temp = I915_READ(fdi_rx_reg);
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ temp |= FDI_LINK_TRAIN_PATTERN_1;
-+ I915_WRITE(fdi_rx_reg, temp | FDI_RX_ENABLE);
-+ I915_READ(fdi_rx_reg);
-
-- udelay(150);
-+ udelay(150);
-
-- /* Train FDI. */
-- /* umask FDI RX Interrupt symbol_lock and bit_lock bit
-- for train result */
-- temp = I915_READ(fdi_rx_imr_reg);
-- temp &= ~FDI_RX_SYMBOL_LOCK;
-- temp &= ~FDI_RX_BIT_LOCK;
-- I915_WRITE(fdi_rx_imr_reg, temp);
-- I915_READ(fdi_rx_imr_reg);
-- udelay(150);
-+ /* Train FDI. */
-+ /* umask FDI RX Interrupt symbol_lock and bit_lock bit
-+ for train result */
-+ temp = I915_READ(fdi_rx_imr_reg);
-+ temp &= ~FDI_RX_SYMBOL_LOCK;
-+ temp &= ~FDI_RX_BIT_LOCK;
-+ I915_WRITE(fdi_rx_imr_reg, temp);
-+ I915_READ(fdi_rx_imr_reg);
-+ udelay(150);
-
-- temp = I915_READ(fdi_rx_iir_reg);
-- DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-+ temp = I915_READ(fdi_rx_iir_reg);
-+ DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-
-- if ((temp & FDI_RX_BIT_LOCK) == 0) {
-- for (j = 0; j < tries; j++) {
-- temp = I915_READ(fdi_rx_iir_reg);
-- DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-- if (temp & FDI_RX_BIT_LOCK)
-- break;
-- udelay(200);
-- }
-- if (j != tries)
-+ if ((temp & FDI_RX_BIT_LOCK) == 0) {
-+ for (j = 0; j < tries; j++) {
-+ temp = I915_READ(fdi_rx_iir_reg);
-+ DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-+ if (temp & FDI_RX_BIT_LOCK)
-+ break;
-+ udelay(200);
-+ }
-+ if (j != tries)
-+ I915_WRITE(fdi_rx_iir_reg,
-+ temp | FDI_RX_BIT_LOCK);
-+ else
-+ DRM_DEBUG("train 1 fail\n");
-+ } else {
- I915_WRITE(fdi_rx_iir_reg,
- temp | FDI_RX_BIT_LOCK);
-- else
-- DRM_DEBUG("train 1 fail\n");
-- } else {
-- I915_WRITE(fdi_rx_iir_reg,
-- temp | FDI_RX_BIT_LOCK);
-- DRM_DEBUG("train 1 ok 2!\n");
-- }
-- temp = I915_READ(fdi_tx_reg);
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- temp |= FDI_LINK_TRAIN_PATTERN_2;
-- I915_WRITE(fdi_tx_reg, temp);
--
-- temp = I915_READ(fdi_rx_reg);
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- temp |= FDI_LINK_TRAIN_PATTERN_2;
-- I915_WRITE(fdi_rx_reg, temp);
-+ DRM_DEBUG("train 1 ok 2!\n");
-+ }
-+ temp = I915_READ(fdi_tx_reg);
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ temp |= FDI_LINK_TRAIN_PATTERN_2;
-+ I915_WRITE(fdi_tx_reg, temp);
-+
-+ temp = I915_READ(fdi_rx_reg);
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ temp |= FDI_LINK_TRAIN_PATTERN_2;
-+ I915_WRITE(fdi_rx_reg, temp);
-
-- udelay(150);
-+ udelay(150);
-
-- temp = I915_READ(fdi_rx_iir_reg);
-- DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-+ temp = I915_READ(fdi_rx_iir_reg);
-+ DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-
-- if ((temp & FDI_RX_SYMBOL_LOCK) == 0) {
-- for (j = 0; j < tries; j++) {
-- temp = I915_READ(fdi_rx_iir_reg);
-- DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-- if (temp & FDI_RX_SYMBOL_LOCK)
-- break;
-- udelay(200);
-- }
-- if (j != tries) {
-+ if ((temp & FDI_RX_SYMBOL_LOCK) == 0) {
-+ for (j = 0; j < tries; j++) {
-+ temp = I915_READ(fdi_rx_iir_reg);
-+ DRM_DEBUG("FDI_RX_IIR 0x%x\n", temp);
-+ if (temp & FDI_RX_SYMBOL_LOCK)
-+ break;
-+ udelay(200);
-+ }
-+ if (j != tries) {
-+ I915_WRITE(fdi_rx_iir_reg,
-+ temp | FDI_RX_SYMBOL_LOCK);
-+ DRM_DEBUG("train 2 ok 1!\n");
-+ } else
-+ DRM_DEBUG("train 2 fail\n");
-+ } else {
- I915_WRITE(fdi_rx_iir_reg,
- temp | FDI_RX_SYMBOL_LOCK);
-- DRM_DEBUG("train 2 ok 1!\n");
-- } else
-- DRM_DEBUG("train 2 fail\n");
-- } else {
-- I915_WRITE(fdi_rx_iir_reg, temp | FDI_RX_SYMBOL_LOCK);
-- DRM_DEBUG("train 2 ok 2!\n");
-- }
-- DRM_DEBUG("train done\n");
--
-- /* set transcoder timing */
-- I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg));
-- I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg));
-- I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg));
-+ DRM_DEBUG("train 2 ok 2!\n");
-+ }
-+ DRM_DEBUG("train done\n");
-
-- I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg));
-- I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg));
-- I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg));
-+ /* set transcoder timing */
-+ I915_WRITE(trans_htot_reg, I915_READ(cpu_htot_reg));
-+ I915_WRITE(trans_hblank_reg, I915_READ(cpu_hblank_reg));
-+ I915_WRITE(trans_hsync_reg, I915_READ(cpu_hsync_reg));
-+
-+ I915_WRITE(trans_vtot_reg, I915_READ(cpu_vtot_reg));
-+ I915_WRITE(trans_vblank_reg, I915_READ(cpu_vblank_reg));
-+ I915_WRITE(trans_vsync_reg, I915_READ(cpu_vsync_reg));
-+
-+ /* enable PCH transcoder */
-+ temp = I915_READ(transconf_reg);
-+ I915_WRITE(transconf_reg, temp | TRANS_ENABLE);
-+ I915_READ(transconf_reg);
-
-- /* enable PCH transcoder */
-- temp = I915_READ(transconf_reg);
-- I915_WRITE(transconf_reg, temp | TRANS_ENABLE);
-- I915_READ(transconf_reg);
-+ while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0)
-+ ;
-
-- while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) == 0)
-- ;
-+ /* enable normal */
-
-- /* enable normal */
-+ temp = I915_READ(fdi_tx_reg);
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE |
-+ FDI_TX_ENHANCE_FRAME_ENABLE);
-+ I915_READ(fdi_tx_reg);
-
-- temp = I915_READ(fdi_tx_reg);
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- I915_WRITE(fdi_tx_reg, temp | FDI_LINK_TRAIN_NONE |
-- FDI_TX_ENHANCE_FRAME_ENABLE);
-- I915_READ(fdi_tx_reg);
-+ temp = I915_READ(fdi_rx_reg);
-+ temp &= ~FDI_LINK_TRAIN_NONE;
-+ I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE |
-+ FDI_RX_ENHANCE_FRAME_ENABLE);
-+ I915_READ(fdi_rx_reg);
-
-- temp = I915_READ(fdi_rx_reg);
-- temp &= ~FDI_LINK_TRAIN_NONE;
-- I915_WRITE(fdi_rx_reg, temp | FDI_LINK_TRAIN_NONE |
-- FDI_RX_ENHANCE_FRAME_ENABLE);
-- I915_READ(fdi_rx_reg);
-+ /* wait one idle pattern time */
-+ udelay(100);
-
-- /* wait one idle pattern time */
-- udelay(100);
-+ }
-
- intel_crtc_load_lut(crtc);
-
-@@ -1200,8 +1348,7 @@ static void igdng_crtc_dpms(struct drm_c
- case DRM_MODE_DPMS_OFF:
- DRM_DEBUG("crtc %d dpms off\n", pipe);
-
-- /* Disable the VGA plane that we never use */
-- I915_WRITE(CPU_VGACNTRL, VGA_DISP_DISABLE);
-+ i915_disable_vga(dev);
-
- /* Disable display plane */
- temp = I915_READ(dspcntr_reg);
-@@ -1217,17 +1364,23 @@ static void igdng_crtc_dpms(struct drm_c
- if ((temp & PIPEACONF_ENABLE) != 0) {
- I915_WRITE(pipeconf_reg, temp & ~PIPEACONF_ENABLE);
- I915_READ(pipeconf_reg);
-+ n = 0;
- /* wait for cpu pipe off, pipe state */
-- while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0)
-- ;
-+ while ((I915_READ(pipeconf_reg) & I965_PIPECONF_ACTIVE) != 0) {
-+ n++;
-+ if (n < 60) {
-+ udelay(500);
-+ continue;
-+ } else {
-+ DRM_DEBUG("pipe %d off delay\n", pipe);
-+ break;
-+ }
-+ }
- } else
- DRM_DEBUG("crtc %d is disabled\n", pipe);
-
-- /* IGDNG-A : disable cpu panel fitter ? */
-- temp = I915_READ(pf_ctl_reg);
-- if ((temp & PF_ENABLE) != 0) {
-- I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
-- I915_READ(pf_ctl_reg);
-+ if (HAS_eDP) {
-+ igdng_disable_pll_edp(crtc);
- }
-
- /* disable CPU FDI tx and PCH FDI rx */
-@@ -1239,6 +1392,8 @@ static void igdng_crtc_dpms(struct drm_c
- I915_WRITE(fdi_rx_reg, temp & ~FDI_RX_ENABLE);
- I915_READ(fdi_rx_reg);
-
-+ udelay(100);
-+
- /* still set train pattern 1 */
- temp = I915_READ(fdi_tx_reg);
- temp &= ~FDI_LINK_TRAIN_NONE;
-@@ -1250,14 +1405,25 @@ static void igdng_crtc_dpms(struct drm_c
- temp |= FDI_LINK_TRAIN_PATTERN_1;
- I915_WRITE(fdi_rx_reg, temp);
-
-+ udelay(100);
-+
- /* disable PCH transcoder */
- temp = I915_READ(transconf_reg);
- if ((temp & TRANS_ENABLE) != 0) {
- I915_WRITE(transconf_reg, temp & ~TRANS_ENABLE);
- I915_READ(transconf_reg);
-+ n = 0;
- /* wait for PCH transcoder off, transcoder state */
-- while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0)
-- ;
-+ while ((I915_READ(transconf_reg) & TRANS_STATE_ENABLE) != 0) {
-+ n++;
-+ if (n < 60) {
-+ udelay(500);
-+ continue;
-+ } else {
-+ DRM_DEBUG("transcoder %d off delay\n", pipe);
-+ break;
-+ }
-+ }
- }
-
- /* disable PCH DPLL */
-@@ -1275,6 +1441,22 @@ static void igdng_crtc_dpms(struct drm_c
- I915_READ(fdi_rx_reg);
- }
-
-+ /* Disable CPU FDI TX PLL */
-+ temp = I915_READ(fdi_tx_reg);
-+ if ((temp & FDI_TX_PLL_ENABLE) != 0) {
-+ I915_WRITE(fdi_tx_reg, temp & ~FDI_TX_PLL_ENABLE);
-+ I915_READ(fdi_tx_reg);
-+ udelay(100);
-+ }
-+
-+ /* Disable PF */
-+ temp = I915_READ(pf_ctl_reg);
-+ if ((temp & PF_ENABLE) != 0) {
-+ I915_WRITE(pf_ctl_reg, temp & ~PF_ENABLE);
-+ I915_READ(pf_ctl_reg);
-+ }
-+ I915_WRITE(pf_win_size, 0);
-+
- /* Wait for the clocks to turn off. */
- udelay(150);
- break;
-@@ -1342,7 +1524,7 @@ static void i9xx_crtc_dpms(struct drm_cr
- //intel_crtc_dpms_video(crtc, FALSE); TODO
-
- /* Disable the VGA plane that we never use */
-- I915_WRITE(VGACNTRL, VGA_DISP_DISABLE);
-+ i915_disable_vga(dev);
-
- /* Disable display plane */
- temp = I915_READ(dspcntr_reg);
-@@ -1623,48 +1805,72 @@ static struct intel_watermark_params igd
- IGD_FIFO_LINE_SIZE
- };
- static struct intel_watermark_params i945_wm_info = {
-- I915_FIFO_LINE_SIZE,
-+ I945_FIFO_SIZE,
- I915_MAX_WM,
- 1,
-- 0,
-- IGD_FIFO_LINE_SIZE
-+ 2,
-+ I915_FIFO_LINE_SIZE
- };
- static struct intel_watermark_params i915_wm_info = {
-- I945_FIFO_SIZE,
-+ I915_FIFO_SIZE,
- I915_MAX_WM,
- 1,
-- 0,
-+ 2,
- I915_FIFO_LINE_SIZE
- };
- static struct intel_watermark_params i855_wm_info = {
- I855GM_FIFO_SIZE,
- I915_MAX_WM,
- 1,
-- 0,
-+ 2,
- I830_FIFO_LINE_SIZE
- };
- static struct intel_watermark_params i830_wm_info = {
- I830_FIFO_SIZE,
- I915_MAX_WM,
- 1,
-- 0,
-+ 2,
- I830_FIFO_LINE_SIZE
- };
-
-+/**
-+ * intel_calculate_wm - calculate watermark level
-+ * @clock_in_khz: pixel clock
-+ * @wm: chip FIFO params
-+ * @pixel_size: display pixel size
-+ * @latency_ns: memory latency for the platform
-+ *
-+ * Calculate the watermark level (the level at which the display plane will
-+ * start fetching from memory again). Each chip has a different display
-+ * FIFO size and allocation, so the caller needs to figure that out and pass
-+ * in the correct intel_watermark_params structure.
-+ *
-+ * As the pixel clock runs, the FIFO will be drained at a rate that depends
-+ * on the pixel size. When it reaches the watermark level, it'll start
-+ * fetching FIFO line sized based chunks from memory until the FIFO fills
-+ * past the watermark point. If the FIFO drains completely, a FIFO underrun
-+ * will occur, and a display engine hang could result.
-+ */
- static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
- struct intel_watermark_params *wm,
- int pixel_size,
- unsigned long latency_ns)
- {
-- unsigned long bytes_required, wm_size;
-+ long entries_required, wm_size;
-+
-+ entries_required = (clock_in_khz * pixel_size * latency_ns) / 1000000;
-+ entries_required /= wm->cacheline_size;
-+
-+ DRM_DEBUG("FIFO entries required for mode: %d\n", entries_required);
-
-- bytes_required = (clock_in_khz * pixel_size * latency_ns) / 1000000;
-- bytes_required /= wm->cacheline_size;
-- wm_size = wm->fifo_size - bytes_required - wm->guard_size;
-+ wm_size = wm->fifo_size - (entries_required + wm->guard_size);
-
-- if (wm_size > wm->max_wm)
-+ DRM_DEBUG("FIFO watermark level: %d\n", wm_size);
-+
-+ /* Don't promote wm_size to unsigned... */
-+ if (wm_size > (long)wm->max_wm)
- wm_size = wm->max_wm;
-- if (wm_size == 0)
-+ if (wm_size <= 0)
- wm_size = wm->default_wm;
- return wm_size;
- }
-@@ -1799,8 +2005,40 @@ static void igd_enable_cxsr(struct drm_d
- return;
- }
-
--const static int latency_ns = 5000; /* default for non-igd platforms */
-+const static int latency_ns = 3000; /* default for non-igd platforms */
-+
-+static int intel_get_fifo_size(struct drm_device *dev, int plane)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ uint32_t dsparb = I915_READ(DSPARB);
-+ int size;
-+
-+ if (IS_I9XX(dev)) {
-+ if (plane == 0)
-+ size = dsparb & 0x7f;
-+ else
-+ size = ((dsparb >> DSPARB_CSTART_SHIFT) & 0x7f) -
-+ (dsparb & 0x7f);
-+ } else if (IS_I85X(dev)) {
-+ if (plane == 0)
-+ size = dsparb & 0x1ff;
-+ else
-+ size = ((dsparb >> DSPARB_BEND_SHIFT) & 0x1ff) -
-+ (dsparb & 0x1ff);
-+ size >>= 1; /* Convert to cachelines */
-+ } else if (IS_845G(dev)) {
-+ size = dsparb & 0x7f;
-+ size >>= 2; /* Convert to cachelines */
-+ } else {
-+ size = dsparb & 0x7f;
-+ size >>= 1; /* Convert to cachelines */
-+ }
-+
-+ DRM_DEBUG("FIFO size - (0x%08x) %s: %d\n", dsparb, plane ? "B" : "A",
-+ size);
-
-+ return size;
-+}
-
- static void i965_update_wm(struct drm_device *dev)
- {
-@@ -1817,101 +2055,89 @@ static void i9xx_update_wm(struct drm_de
- int planeb_clock, int sr_hdisplay, int pixel_size)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-- uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK;
-- uint32_t fwater_hi = I915_READ(FW_BLC2) & LM_FIFO_WATERMARK;
-- int bsize, asize, cwm, bwm = 1, awm = 1, srwm = 1;
-- uint32_t dsparb = I915_READ(DSPARB);
-- int planea_entries, planeb_entries;
-- struct intel_watermark_params *wm_params;
-+ uint32_t fwater_lo;
-+ uint32_t fwater_hi;
-+ int total_size, cacheline_size, cwm, srwm = 1;
-+ int planea_wm, planeb_wm;
-+ struct intel_watermark_params planea_params, planeb_params;
- unsigned long line_time_us;
- int sr_clock, sr_entries = 0;
-
-+ /* Create copies of the base settings for each pipe */
- if (IS_I965GM(dev) || IS_I945GM(dev))
-- wm_params = &i945_wm_info;
-+ planea_params = planeb_params = i945_wm_info;
- else if (IS_I9XX(dev))
-- wm_params = &i915_wm_info;
-+ planea_params = planeb_params = i915_wm_info;
- else
-- wm_params = &i855_wm_info;
-+ planea_params = planeb_params = i855_wm_info;
-
-- planea_entries = intel_calculate_wm(planea_clock, wm_params,
-- pixel_size, latency_ns);
-- planeb_entries = intel_calculate_wm(planeb_clock, wm_params,
-- pixel_size, latency_ns);
--
-- DRM_DEBUG("FIFO entries - A: %d, B: %d\n", planea_entries,
-- planeb_entries);
--
-- if (IS_I9XX(dev)) {
-- asize = dsparb & 0x7f;
-- bsize = (dsparb >> DSPARB_CSTART_SHIFT) & 0x7f;
-- } else {
-- asize = dsparb & 0x1ff;
-- bsize = (dsparb >> DSPARB_BEND_SHIFT) & 0x1ff;
-- }
-- DRM_DEBUG("FIFO size - A: %d, B: %d\n", asize, bsize);
--
-- /* Two extra entries for padding */
-- awm = asize - (planea_entries + 2);
-- bwm = bsize - (planeb_entries + 2);
--
-- /* Sanity check against potentially bad FIFO allocations */
-- if (awm <= 0) {
-- /* pipe is on but has too few FIFO entries */
-- if (planea_entries != 0)
-- DRM_DEBUG("plane A needs more FIFO entries\n");
-- awm = 1;
-- }
-- if (bwm <= 0) {
-- if (planeb_entries != 0)
-- DRM_DEBUG("plane B needs more FIFO entries\n");
-- bwm = 1;
-- }
-+ /* Grab a couple of global values before we overwrite them */
-+ total_size = planea_params.fifo_size;
-+ cacheline_size = planea_params.cacheline_size;
-+
-+ /* Update per-plane FIFO sizes */
-+ planea_params.fifo_size = intel_get_fifo_size(dev, 0);
-+ planeb_params.fifo_size = intel_get_fifo_size(dev, 1);
-+
-+ planea_wm = intel_calculate_wm(planea_clock, &planea_params,
-+ pixel_size, latency_ns);
-+ planeb_wm = intel_calculate_wm(planeb_clock, &planeb_params,
-+ pixel_size, latency_ns);
-+ DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
-
- /*
- * Overlay gets an aggressive default since video jitter is bad.
- */
- cwm = 2;
-
-- /* Calc sr entries for one pipe configs */
-- if (!planea_clock || !planeb_clock) {
-+ /* Calc sr entries for one plane configs */
-+ if (sr_hdisplay && (!planea_clock || !planeb_clock)) {
-+ /* self-refresh has much higher latency */
-+ const static int sr_latency_ns = 6000;
-+
- sr_clock = planea_clock ? planea_clock : planeb_clock;
-- line_time_us = (sr_hdisplay * 1000) / sr_clock;
-- sr_entries = (((latency_ns / line_time_us) + 1) * pixel_size *
-- sr_hdisplay) / 1000;
-- sr_entries = roundup(sr_entries / wm_params->cacheline_size, 1);
-- if (sr_entries < wm_params->fifo_size)
-- srwm = wm_params->fifo_size - sr_entries;
-+ line_time_us = ((sr_hdisplay * 1000) / sr_clock);
-+
-+ /* Use ns/us then divide to preserve precision */
-+ sr_entries = (((sr_latency_ns / line_time_us) + 1) *
-+ pixel_size * sr_hdisplay) / 1000;
-+ sr_entries = roundup(sr_entries / cacheline_size, 1);
-+ DRM_DEBUG("self-refresh entries: %d\n", sr_entries);
-+ srwm = total_size - sr_entries;
-+ if (srwm < 0)
-+ srwm = 1;
-+ if (IS_I9XX(dev))
-+ I915_WRITE(FW_BLC_SELF, (srwm & 0x3f));
- }
-
- DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, C: %d, SR %d\n",
-- awm, bwm, cwm, srwm);
-+ planea_wm, planeb_wm, cwm, srwm);
-
-- fwater_lo = fwater_lo | ((bwm & 0x3f) << 16) | (awm & 0x3f);
-- fwater_hi = fwater_hi | (cwm & 0x1f);
-+ fwater_lo = ((planeb_wm & 0x3f) << 16) | (planea_wm & 0x3f);
-+ fwater_hi = (cwm & 0x1f);
-+
-+ /* Set request length to 8 cachelines per fetch */
-+ fwater_lo = fwater_lo | (1 << 24) | (1 << 8);
-+ fwater_hi = fwater_hi | (1 << 8);
-
- I915_WRITE(FW_BLC, fwater_lo);
- I915_WRITE(FW_BLC2, fwater_hi);
-- if (IS_I9XX(dev))
-- I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN | (srwm & 0x3f));
- }
-
- static void i830_update_wm(struct drm_device *dev, int planea_clock,
- int pixel_size)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-- uint32_t dsparb = I915_READ(DSPARB);
-- uint32_t fwater_lo = I915_READ(FW_BLC) & MM_FIFO_WATERMARK;
-- unsigned int asize, awm;
-- int planea_entries;
-+ uint32_t fwater_lo = I915_READ(FW_BLC) & ~0xfff;
-+ int planea_wm;
-
-- planea_entries = intel_calculate_wm(planea_clock, &i830_wm_info,
-- pixel_size, latency_ns);
-+ i830_wm_info.fifo_size = intel_get_fifo_size(dev, 0);
-
-- asize = dsparb & 0x7f;
-+ planea_wm = intel_calculate_wm(planea_clock, &i830_wm_info,
-+ pixel_size, latency_ns);
-+ fwater_lo |= (3<<8) | planea_wm;
-
-- awm = asize - planea_entries;
--
-- fwater_lo = fwater_lo | awm;
-+ DRM_DEBUG("Setting FIFO watermarks - A: %d\n", planea_wm);
-
- I915_WRITE(FW_BLC, fwater_lo);
- }
-@@ -1984,7 +2210,7 @@ static void intel_update_watermarks(stru
- if (enabled <= 0)
- return;
-
-- /* Single pipe configs can enable self refresh */
-+ /* Single plane configs can enable self refresh */
- if (enabled == 1 && IS_IGD(dev))
- igd_enable_cxsr(dev, sr_clock, pixel_size);
- else if (IS_IGD(dev))
-@@ -2028,6 +2254,7 @@ static int intel_crtc_mode_set(struct dr
- u32 dpll = 0, fp = 0, dspcntr, pipeconf;
- bool ok, is_sdvo = false, is_dvo = false;
- bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
-+ bool is_edp = false;
- struct drm_mode_config *mode_config = &dev->mode_config;
- struct drm_connector *connector;
- const intel_limit_t *limit;
-@@ -2043,6 +2270,7 @@ static int intel_crtc_mode_set(struct dr
- int lvds_reg = LVDS;
- u32 temp;
- int sdvo_pixel_multiply;
-+ int target_clock;
-
- drm_vblank_pre_modeset(dev, pipe);
-
-@@ -2074,6 +2302,9 @@ static int intel_crtc_mode_set(struct dr
- case INTEL_OUTPUT_DISPLAYPORT:
- is_dp = true;
- break;
-+ case INTEL_OUTPUT_EDP:
-+ is_edp = true;
-+ break;
- }
-
- num_outputs++;
-@@ -2125,11 +2356,29 @@ static int intel_crtc_mode_set(struct dr
- }
-
- /* FDI link */
-- if (IS_IGDNG(dev))
-- igdng_compute_m_n(3, 4, /* lane num 4 */
-- adjusted_mode->clock,
-- 270000, /* lane clock */
-- &m_n);
-+ if (IS_IGDNG(dev)) {
-+ int lane, link_bw;
-+ /* eDP doesn't require FDI link, so just set DP M/N
-+ according to current link config */
-+ if (is_edp) {
-+ struct drm_connector *edp;
-+ target_clock = mode->clock;
-+ edp = intel_pipe_get_output(crtc);
-+ intel_edp_link_config(to_intel_output(edp),
-+ &lane, &link_bw);
-+ } else {
-+ /* DP over FDI requires target mode clock
-+ instead of link clock */
-+ if (is_dp)
-+ target_clock = mode->clock;
-+ else
-+ target_clock = adjusted_mode->clock;
-+ lane = 4;
-+ link_bw = 270000;
-+ }
-+ igdng_compute_m_n(3, lane, target_clock,
-+ link_bw, &m_n);
-+ }
-
- if (IS_IGD(dev))
- fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2;
-@@ -2250,29 +2499,15 @@ static int intel_crtc_mode_set(struct dr
- dpll_reg = pch_dpll_reg;
- }
-
-- if (dpll & DPLL_VCO_ENABLE) {
-+ if (is_edp) {
-+ igdng_disable_pll_edp(crtc);
-+ } else if ((dpll & DPLL_VCO_ENABLE)) {
- I915_WRITE(fp_reg, fp);
- I915_WRITE(dpll_reg, dpll & ~DPLL_VCO_ENABLE);
- I915_READ(dpll_reg);
- udelay(150);
- }
-
-- if (IS_IGDNG(dev)) {
-- /* enable PCH clock reference source */
-- /* XXX need to change the setting for other outputs */
-- u32 temp;
-- temp = I915_READ(PCH_DREF_CONTROL);
-- temp &= ~DREF_NONSPREAD_SOURCE_MASK;
-- temp |= DREF_NONSPREAD_CK505_ENABLE;
-- temp &= ~DREF_SSC_SOURCE_MASK;
-- temp |= DREF_SSC_SOURCE_ENABLE;
-- temp &= ~DREF_SSC1_ENABLE;
-- /* if no eDP, disable source output to CPU */
-- temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK;
-- temp |= DREF_CPU_SOURCE_OUTPUT_DISABLE;
-- I915_WRITE(PCH_DREF_CONTROL, temp);
-- }
--
- /* The LVDS pin pair needs to be on before the DPLLs are enabled.
- * This is an exception to the general rule that mode_set doesn't turn
- * things on.
-@@ -2304,23 +2539,25 @@ static int intel_crtc_mode_set(struct dr
- if (is_dp)
- intel_dp_set_m_n(crtc, mode, adjusted_mode);
-
-- I915_WRITE(fp_reg, fp);
-- I915_WRITE(dpll_reg, dpll);
-- I915_READ(dpll_reg);
-- /* Wait for the clocks to stabilize. */
-- udelay(150);
--
-- if (IS_I965G(dev) && !IS_IGDNG(dev)) {
-- sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
-- I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) |
-- ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT));
-- } else {
-- /* write it again -- the BIOS does, after all */
-+ if (!is_edp) {
-+ I915_WRITE(fp_reg, fp);
- I915_WRITE(dpll_reg, dpll);
-+ I915_READ(dpll_reg);
-+ /* Wait for the clocks to stabilize. */
-+ udelay(150);
-+
-+ if (IS_I965G(dev) && !IS_IGDNG(dev)) {
-+ sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
-+ I915_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) |
-+ ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT));
-+ } else {
-+ /* write it again -- the BIOS does, after all */
-+ I915_WRITE(dpll_reg, dpll);
-+ }
-+ I915_READ(dpll_reg);
-+ /* Wait for the clocks to stabilize. */
-+ udelay(150);
- }
-- I915_READ(dpll_reg);
-- /* Wait for the clocks to stabilize. */
-- udelay(150);
-
- I915_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) |
- ((adjusted_mode->crtc_htotal - 1) << 16));
-@@ -2350,10 +2587,14 @@ static int intel_crtc_mode_set(struct dr
- I915_WRITE(link_m1_reg, m_n.link_m);
- I915_WRITE(link_n1_reg, m_n.link_n);
-
-- /* enable FDI RX PLL too */
-- temp = I915_READ(fdi_rx_reg);
-- I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE);
-- udelay(200);
-+ if (is_edp) {
-+ igdng_set_pll_edp(crtc, adjusted_mode->clock);
-+ } else {
-+ /* enable FDI RX PLL too */
-+ temp = I915_READ(fdi_rx_reg);
-+ I915_WRITE(fdi_rx_reg, temp | FDI_RX_PLL_ENABLE);
-+ udelay(200);
-+ }
- }
-
- I915_WRITE(pipeconf_reg, pipeconf);
-@@ -2951,12 +3192,17 @@ static void intel_setup_outputs(struct d
- if (IS_IGDNG(dev)) {
- int found;
-
-+ if (IS_MOBILE(dev) && (I915_READ(DP_A) & DP_DETECTED))
-+ intel_dp_init(dev, DP_A);
-+
- if (I915_READ(HDMIB) & PORT_DETECTED) {
- /* check SDVOB */
- /* found = intel_sdvo_init(dev, HDMIB); */
- found = 0;
- if (!found)
- intel_hdmi_init(dev, HDMIB);
-+ if (!found && (I915_READ(PCH_DP_B) & DP_DETECTED))
-+ intel_dp_init(dev, PCH_DP_B);
- }
-
- if (I915_READ(HDMIC) & PORT_DETECTED)
-@@ -2965,6 +3211,12 @@ static void intel_setup_outputs(struct d
- if (I915_READ(HDMID) & PORT_DETECTED)
- intel_hdmi_init(dev, HDMID);
-
-+ if (I915_READ(PCH_DP_C) & DP_DETECTED)
-+ intel_dp_init(dev, PCH_DP_C);
-+
-+ if (I915_READ(PCH_DP_D) & DP_DETECTED)
-+ intel_dp_init(dev, PCH_DP_D);
-+
- } else if (IS_I9XX(dev)) {
- int found;
- u32 reg;
-@@ -3039,6 +3291,10 @@ static void intel_setup_outputs(struct d
- (1 << 1));
- clone_mask = (1 << INTEL_OUTPUT_DISPLAYPORT);
- break;
-+ case INTEL_OUTPUT_EDP:
-+ crtc_mask = (1 << 1);
-+ clone_mask = (1 << INTEL_OUTPUT_EDP);
-+ break;
- }
- encoder->possible_crtcs = crtc_mask;
- encoder->possible_clones = intel_connector_clones(dev, clone_mask);
-@@ -3148,6 +3404,9 @@ void intel_modeset_init(struct drm_devic
- if (IS_I965G(dev)) {
- dev->mode_config.max_width = 8192;
- dev->mode_config.max_height = 8192;
-+ } else if (IS_I9XX(dev)) {
-+ dev->mode_config.max_width = 4096;
-+ dev->mode_config.max_height = 4096;
- } else {
- dev->mode_config.max_width = 2048;
- dev->mode_config.max_height = 2048;
---- a/drivers/gpu/drm/i915/intel_dp.c
-+++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -40,6 +40,8 @@
-
- #define DP_LINK_CONFIGURATION_SIZE 9
-
-+#define IS_eDP(i) ((i)->type == INTEL_OUTPUT_EDP)
-+
- struct intel_dp_priv {
- uint32_t output_reg;
- uint32_t DP;
-@@ -63,6 +65,19 @@ intel_dp_link_train(struct intel_output
- static void
- intel_dp_link_down(struct intel_output *intel_output, uint32_t DP);
-
-+void
-+intel_edp_link_config (struct intel_output *intel_output,
-+ int *lane_num, int *link_bw)
-+{
-+ struct intel_dp_priv *dp_priv = intel_output->dev_priv;
-+
-+ *lane_num = dp_priv->lane_count;
-+ if (dp_priv->link_bw == DP_LINK_BW_1_62)
-+ *link_bw = 162000;
-+ else if (dp_priv->link_bw == DP_LINK_BW_2_7)
-+ *link_bw = 270000;
-+}
-+
- static int
- intel_dp_max_lane_count(struct intel_output *intel_output)
- {
-@@ -206,7 +221,13 @@ intel_dp_aux_ch(struct intel_output *int
- * and would like to run at 2MHz. So, take the
- * hrawclk value and divide by 2 and use that
- */
-- aux_clock_divider = intel_hrawclk(dev) / 2;
-+ if (IS_eDP(intel_output))
-+ aux_clock_divider = 225; /* eDP input clock at 450Mhz */
-+ else if (IS_IGDNG(dev))
-+ aux_clock_divider = 62; /* IGDNG: input clock fixed at 125Mhz */
-+ else
-+ aux_clock_divider = intel_hrawclk(dev) / 2;
-+
- /* Must try at least 3 times according to DP spec */
- for (try = 0; try < 5; try++) {
- /* Load the send data into the aux channel data registers */
-@@ -236,7 +257,7 @@ intel_dp_aux_ch(struct intel_output *int
- }
-
- /* Clear done status and any errors */
-- I915_WRITE(ch_ctl, (ctl |
-+ I915_WRITE(ch_ctl, (status |
- DP_AUX_CH_CTL_DONE |
- DP_AUX_CH_CTL_TIME_OUT_ERROR |
- DP_AUX_CH_CTL_RECEIVE_ERROR));
-@@ -295,7 +316,7 @@ intel_dp_aux_native_write(struct intel_o
- return -1;
- msg[0] = AUX_NATIVE_WRITE << 4;
- msg[1] = address >> 8;
-- msg[2] = address;
-+ msg[2] = address & 0xff;
- msg[3] = send_bytes - 1;
- memcpy(&msg[4], send, send_bytes);
- msg_bytes = send_bytes + 4;
-@@ -387,8 +408,8 @@ intel_dp_i2c_init(struct intel_output *i
- memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter));
- dp_priv->adapter.owner = THIS_MODULE;
- dp_priv->adapter.class = I2C_CLASS_DDC;
-- strncpy (dp_priv->adapter.name, name, sizeof dp_priv->adapter.name - 1);
-- dp_priv->adapter.name[sizeof dp_priv->adapter.name - 1] = '\0';
-+ strncpy (dp_priv->adapter.name, name, sizeof(dp_priv->adapter.name) - 1);
-+ dp_priv->adapter.name[sizeof(dp_priv->adapter.name) - 1] = '\0';
- dp_priv->adapter.algo_data = &dp_priv->algo;
- dp_priv->adapter.dev.parent = &intel_output->base.kdev;
-
-@@ -493,22 +514,40 @@ intel_dp_set_m_n(struct drm_crtc *crtc,
- intel_dp_compute_m_n(3, lane_count,
- mode->clock, adjusted_mode->clock, &m_n);
-
-- if (intel_crtc->pipe == 0) {
-- I915_WRITE(PIPEA_GMCH_DATA_M,
-- ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-- m_n.gmch_m);
-- I915_WRITE(PIPEA_GMCH_DATA_N,
-- m_n.gmch_n);
-- I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m);
-- I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n);
-+ if (IS_IGDNG(dev)) {
-+ if (intel_crtc->pipe == 0) {
-+ I915_WRITE(TRANSA_DATA_M1,
-+ ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-+ m_n.gmch_m);
-+ I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n);
-+ I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m);
-+ I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n);
-+ } else {
-+ I915_WRITE(TRANSB_DATA_M1,
-+ ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-+ m_n.gmch_m);
-+ I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n);
-+ I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m);
-+ I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n);
-+ }
- } else {
-- I915_WRITE(PIPEB_GMCH_DATA_M,
-- ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-- m_n.gmch_m);
-- I915_WRITE(PIPEB_GMCH_DATA_N,
-- m_n.gmch_n);
-- I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m);
-- I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n);
-+ if (intel_crtc->pipe == 0) {
-+ I915_WRITE(PIPEA_GMCH_DATA_M,
-+ ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-+ m_n.gmch_m);
-+ I915_WRITE(PIPEA_GMCH_DATA_N,
-+ m_n.gmch_n);
-+ I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m);
-+ I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n);
-+ } else {
-+ I915_WRITE(PIPEB_GMCH_DATA_M,
-+ ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) |
-+ m_n.gmch_m);
-+ I915_WRITE(PIPEB_GMCH_DATA_N,
-+ m_n.gmch_n);
-+ I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m);
-+ I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n);
-+ }
- }
- }
-
-@@ -556,8 +595,38 @@ intel_dp_mode_set(struct drm_encoder *en
-
- if (intel_crtc->pipe == 1)
- dp_priv->DP |= DP_PIPEB_SELECT;
-+
-+ if (IS_eDP(intel_output)) {
-+ /* don't miss out required setting for eDP */
-+ dp_priv->DP |= DP_PLL_ENABLE;
-+ if (adjusted_mode->clock < 200000)
-+ dp_priv->DP |= DP_PLL_FREQ_160MHZ;
-+ else
-+ dp_priv->DP |= DP_PLL_FREQ_270MHZ;
-+ }
- }
-
-+static void igdng_edp_backlight_on (struct drm_device *dev)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 pp;
-+
-+ DRM_DEBUG("\n");
-+ pp = I915_READ(PCH_PP_CONTROL);
-+ pp |= EDP_BLC_ENABLE;
-+ I915_WRITE(PCH_PP_CONTROL, pp);
-+}
-+
-+static void igdng_edp_backlight_off (struct drm_device *dev)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 pp;
-+
-+ DRM_DEBUG("\n");
-+ pp = I915_READ(PCH_PP_CONTROL);
-+ pp &= ~EDP_BLC_ENABLE;
-+ I915_WRITE(PCH_PP_CONTROL, pp);
-+}
-
- static void
- intel_dp_dpms(struct drm_encoder *encoder, int mode)
-@@ -569,11 +638,17 @@ intel_dp_dpms(struct drm_encoder *encode
- uint32_t dp_reg = I915_READ(dp_priv->output_reg);
-
- if (mode != DRM_MODE_DPMS_ON) {
-- if (dp_reg & DP_PORT_EN)
-+ if (dp_reg & DP_PORT_EN) {
- intel_dp_link_down(intel_output, dp_priv->DP);
-+ if (IS_eDP(intel_output))
-+ igdng_edp_backlight_off(dev);
-+ }
- } else {
-- if (!(dp_reg & DP_PORT_EN))
-+ if (!(dp_reg & DP_PORT_EN)) {
- intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration);
-+ if (IS_eDP(intel_output))
-+ igdng_edp_backlight_on(dev);
-+ }
- }
- dp_priv->dpms_mode = mode;
- }
-@@ -935,6 +1010,23 @@ intel_dp_link_down(struct intel_output *
- struct drm_i915_private *dev_priv = dev->dev_private;
- struct intel_dp_priv *dp_priv = intel_output->dev_priv;
-
-+ DRM_DEBUG("\n");
-+
-+ if (IS_eDP(intel_output)) {
-+ DP &= ~DP_PLL_ENABLE;
-+ I915_WRITE(dp_priv->output_reg, DP);
-+ POSTING_READ(dp_priv->output_reg);
-+ udelay(100);
-+ }
-+
-+ DP &= ~DP_LINK_TRAIN_MASK;
-+ I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE);
-+ POSTING_READ(dp_priv->output_reg);
-+
-+ udelay(17000);
-+
-+ if (IS_eDP(intel_output))
-+ DP |= DP_LINK_TRAIN_OFF;
- I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN);
- POSTING_READ(dp_priv->output_reg);
- }
-@@ -978,6 +1070,24 @@ intel_dp_check_link_status(struct intel_
- intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration);
- }
-
-+static enum drm_connector_status
-+igdng_dp_detect(struct drm_connector *connector)
-+{
-+ struct intel_output *intel_output = to_intel_output(connector);
-+ struct intel_dp_priv *dp_priv = intel_output->dev_priv;
-+ enum drm_connector_status status;
-+
-+ status = connector_status_disconnected;
-+ if (intel_dp_aux_native_read(intel_output,
-+ 0x000, dp_priv->dpcd,
-+ sizeof (dp_priv->dpcd)) == sizeof (dp_priv->dpcd))
-+ {
-+ if (dp_priv->dpcd[0] != 0)
-+ status = connector_status_connected;
-+ }
-+ return status;
-+}
-+
- /**
- * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection.
- *
-@@ -996,6 +1106,9 @@ intel_dp_detect(struct drm_connector *co
-
- dp_priv->has_audio = false;
-
-+ if (IS_IGDNG(dev))
-+ return igdng_dp_detect(connector);
-+
- temp = I915_READ(PORT_HOTPLUG_EN);
-
- I915_WRITE(PORT_HOTPLUG_EN,
-@@ -1039,11 +1152,27 @@ intel_dp_detect(struct drm_connector *co
- static int intel_dp_get_modes(struct drm_connector *connector)
- {
- struct intel_output *intel_output = to_intel_output(connector);
-+ struct drm_device *dev = intel_output->base.dev;
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ int ret;
-
- /* We should parse the EDID data and find out if it has an audio sink
- */
-
-- return intel_ddc_get_modes(intel_output);
-+ ret = intel_ddc_get_modes(intel_output);
-+ if (ret)
-+ return ret;
-+
-+ /* if eDP has no EDID, try to use fixed panel mode from VBT */
-+ if (IS_eDP(intel_output)) {
-+ if (dev_priv->panel_fixed_mode != NULL) {
-+ struct drm_display_mode *mode;
-+ mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
-+ drm_mode_probed_add(connector, mode);
-+ return 1;
-+ }
-+ }
-+ return 0;
- }
-
- static void
-@@ -1106,6 +1235,7 @@ intel_dp_init(struct drm_device *dev, in
- struct drm_connector *connector;
- struct intel_output *intel_output;
- struct intel_dp_priv *dp_priv;
-+ const char *name = NULL;
-
- intel_output = kcalloc(sizeof(struct intel_output) +
- sizeof(struct intel_dp_priv), 1, GFP_KERNEL);
-@@ -1119,7 +1249,10 @@ intel_dp_init(struct drm_device *dev, in
- DRM_MODE_CONNECTOR_DisplayPort);
- drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs);
-
-- intel_output->type = INTEL_OUTPUT_DISPLAYPORT;
-+ if (output_reg == DP_A)
-+ intel_output->type = INTEL_OUTPUT_EDP;
-+ else
-+ intel_output->type = INTEL_OUTPUT_DISPLAYPORT;
-
- connector->interlace_allowed = true;
- connector->doublescan_allowed = 0;
-@@ -1139,12 +1272,41 @@ intel_dp_init(struct drm_device *dev, in
- drm_sysfs_connector_add(connector);
-
- /* Set up the DDC bus. */
-- intel_dp_i2c_init(intel_output,
-- (output_reg == DP_B) ? "DPDDC-B" :
-- (output_reg == DP_C) ? "DPDDC-C" : "DPDDC-D");
-+ switch (output_reg) {
-+ case DP_A:
-+ name = "DPDDC-A";
-+ break;
-+ case DP_B:
-+ case PCH_DP_B:
-+ name = "DPDDC-B";
-+ break;
-+ case DP_C:
-+ case PCH_DP_C:
-+ name = "DPDDC-C";
-+ break;
-+ case DP_D:
-+ case PCH_DP_D:
-+ name = "DPDDC-D";
-+ break;
-+ }
-+
-+ intel_dp_i2c_init(intel_output, name);
-+
- intel_output->ddc_bus = &dp_priv->adapter;
- intel_output->hot_plug = intel_dp_hot_plug;
-
-+ if (output_reg == DP_A) {
-+ /* initialize panel mode from VBT if available for eDP */
-+ if (dev_priv->lfp_lvds_vbt_mode) {
-+ dev_priv->panel_fixed_mode =
-+ drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
-+ if (dev_priv->panel_fixed_mode) {
-+ dev_priv->panel_fixed_mode->type |=
-+ DRM_MODE_TYPE_PREFERRED;
-+ }
-+ }
-+ }
-+
- /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
- * 0xd. Failure to do so will result in spurious interrupts being
- * generated on the port when a cable is not attached.
---- a/drivers/gpu/drm/i915/intel_drv.h
-+++ b/drivers/gpu/drm/i915/intel_drv.h
-@@ -55,6 +55,7 @@
- #define INTEL_OUTPUT_TVOUT 5
- #define INTEL_OUTPUT_HDMI 6
- #define INTEL_OUTPUT_DISPLAYPORT 7
-+#define INTEL_OUTPUT_EDP 8
-
- #define INTEL_DVO_CHIP_NONE 0
- #define INTEL_DVO_CHIP_LVDS 1
-@@ -121,6 +122,8 @@ extern void intel_dp_init(struct drm_dev
- void
- intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
- struct drm_display_mode *adjusted_mode);
-+extern void intel_edp_link_config (struct intel_output *, int *, int *);
-+
-
- extern void intel_crtc_load_lut(struct drm_crtc *crtc);
- extern void intel_encoder_prepare (struct drm_encoder *encoder);
---- a/drivers/gpu/drm/i915/intel_hdmi.c
-+++ b/drivers/gpu/drm/i915/intel_hdmi.c
-@@ -130,16 +130,17 @@ static bool intel_hdmi_mode_fixup(struct
- }
-
- static enum drm_connector_status
--intel_hdmi_edid_detect(struct drm_connector *connector)
-+intel_hdmi_detect(struct drm_connector *connector)
- {
- struct intel_output *intel_output = to_intel_output(connector);
- struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
- struct edid *edid = NULL;
- enum drm_connector_status status = connector_status_disconnected;
-
-+ hdmi_priv->has_hdmi_sink = false;
- edid = drm_get_edid(&intel_output->base,
- intel_output->ddc_bus);
-- hdmi_priv->has_hdmi_sink = false;
-+
- if (edid) {
- if (edid->input & DRM_EDID_INPUT_DIGITAL) {
- status = connector_status_connected;
-@@ -148,65 +149,8 @@ intel_hdmi_edid_detect(struct drm_connec
- intel_output->base.display_info.raw_edid = NULL;
- kfree(edid);
- }
-- return status;
--}
--
--static enum drm_connector_status
--igdng_hdmi_detect(struct drm_connector *connector)
--{
-- struct intel_output *intel_output = to_intel_output(connector);
-- struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
--
-- /* FIXME hotplug detect */
--
-- hdmi_priv->has_hdmi_sink = false;
-- return intel_hdmi_edid_detect(connector);
--}
--
--static enum drm_connector_status
--intel_hdmi_detect(struct drm_connector *connector)
--{
-- struct drm_device *dev = connector->dev;
-- struct drm_i915_private *dev_priv = dev->dev_private;
-- struct intel_output *intel_output = to_intel_output(connector);
-- struct intel_hdmi_priv *hdmi_priv = intel_output->dev_priv;
-- u32 temp, bit;
--
-- if (IS_IGDNG(dev))
-- return igdng_hdmi_detect(connector);
--
-- temp = I915_READ(PORT_HOTPLUG_EN);
--
-- switch (hdmi_priv->sdvox_reg) {
-- case SDVOB:
-- temp |= HDMIB_HOTPLUG_INT_EN;
-- break;
-- case SDVOC:
-- temp |= HDMIC_HOTPLUG_INT_EN;
-- break;
-- default:
-- return connector_status_unknown;
-- }
--
-- I915_WRITE(PORT_HOTPLUG_EN, temp);
--
-- POSTING_READ(PORT_HOTPLUG_EN);
-
-- switch (hdmi_priv->sdvox_reg) {
-- case SDVOB:
-- bit = HDMIB_HOTPLUG_INT_STATUS;
-- break;
-- case SDVOC:
-- bit = HDMIC_HOTPLUG_INT_STATUS;
-- break;
-- default:
-- return connector_status_unknown;
-- }
--
-- if ((I915_READ(PORT_HOTPLUG_STAT) & bit) != 0)
-- return intel_hdmi_edid_detect(connector);
-- else
-- return connector_status_disconnected;
-+ return status;
- }
-
- static int intel_hdmi_get_modes(struct drm_connector *connector)
---- a/drivers/gpu/drm/i915/intel_lvds.c
-+++ b/drivers/gpu/drm/i915/intel_lvds.c
-@@ -780,6 +780,14 @@ static const struct dmi_system_id intel_
- },
- {
- .callback = intel_no_lvds_dmi_callback,
-+ .ident = "AOpen Mini PC MP915",
-+ .matches = {
-+ DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
-+ DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"),
-+ },
-+ },
-+ {
-+ .callback = intel_no_lvds_dmi_callback,
- .ident = "Aopen i945GTt-VFA",
- .matches = {
- DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
-@@ -884,6 +892,10 @@ void intel_lvds_init(struct drm_device *
- if (IS_IGDNG(dev)) {
- if ((I915_READ(PCH_LVDS) & LVDS_DETECTED) == 0)
- return;
-+ if (dev_priv->edp_support) {
-+ DRM_DEBUG("disable LVDS for eDP support\n");
-+ return;
-+ }
- gpio = PCH_GPIOC;
- }
-
---- a/drivers/gpu/drm/i915/intel_sdvo.c
-+++ b/drivers/gpu/drm/i915/intel_sdvo.c
-@@ -31,6 +31,7 @@
- #include "drm.h"
- #include "drm_crtc.h"
- #include "intel_drv.h"
-+#include "drm_edid.h"
- #include "i915_drm.h"
- #include "i915_drv.h"
- #include "intel_sdvo_regs.h"
-@@ -55,6 +56,12 @@ struct intel_sdvo_priv {
- /* Pixel clock limitations reported by the SDVO device, in kHz */
- int pixel_clock_min, pixel_clock_max;
-
-+ /*
-+ * For multiple function SDVO device,
-+ * this is for current attached outputs.
-+ */
-+ uint16_t attached_output;
-+
- /**
- * This is set if we're going to treat the device as TV-out.
- *
-@@ -114,6 +121,9 @@ struct intel_sdvo_priv {
- u32 save_SDVOX;
- };
-
-+static bool
-+intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags);
-+
- /**
- * Writes the SDVOB or SDVOC with the given value, but always writes both
- * SDVOB and SDVOC to work around apparent hardware issues (according to
-@@ -1435,41 +1445,96 @@ void intel_sdvo_set_hotplug(struct drm_c
- intel_sdvo_read_response(intel_output, &response, 2);
- }
-
--static void
--intel_sdvo_hdmi_sink_detect(struct drm_connector *connector)
-+static bool
-+intel_sdvo_multifunc_encoder(struct intel_output *intel_output)
-+{
-+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
-+ int caps = 0;
-+
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
-+ caps++;
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_RGB0 | SDVO_OUTPUT_RGB1))
-+ caps++;
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_SVID0 | SDVO_OUTPUT_SVID0))
-+ caps++;
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_CVBS0 | SDVO_OUTPUT_CVBS1))
-+ caps++;
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_YPRPB0 | SDVO_OUTPUT_YPRPB1))
-+ caps++;
-+
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_SCART0 | SDVO_OUTPUT_SCART1))
-+ caps++;
-+
-+ if (sdvo_priv->caps.output_flags &
-+ (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1))
-+ caps++;
-+
-+ return (caps > 1);
-+}
-+
-+enum drm_connector_status
-+intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
- {
- struct intel_output *intel_output = to_intel_output(connector);
- struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
-+ enum drm_connector_status status = connector_status_connected;
- struct edid *edid = NULL;
-
- edid = drm_get_edid(&intel_output->base,
- intel_output->ddc_bus);
- if (edid != NULL) {
-- sdvo_priv->is_hdmi = drm_detect_hdmi_monitor(edid);
-+ /* Don't report the output as connected if it's a DVI-I
-+ * connector with a non-digital EDID coming out.
-+ */
-+ if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
-+ if (edid->input & DRM_EDID_INPUT_DIGITAL)
-+ sdvo_priv->is_hdmi =
-+ drm_detect_hdmi_monitor(edid);
-+ else
-+ status = connector_status_disconnected;
-+ }
-+
- kfree(edid);
- intel_output->base.display_info.raw_edid = NULL;
-- }
-+
-+ } else if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
-+ status = connector_status_disconnected;
-+
-+ return status;
- }
-
- static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector)
- {
-- u8 response[2];
-+ uint16_t response;
- u8 status;
- struct intel_output *intel_output = to_intel_output(connector);
-+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
-
- intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0);
- status = intel_sdvo_read_response(intel_output, &response, 2);
-
-- DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]);
-+ DRM_DEBUG("SDVO response %d %d\n", response & 0xff, response >> 8);
-
- if (status != SDVO_CMD_STATUS_SUCCESS)
- return connector_status_unknown;
-
-- if ((response[0] != 0) || (response[1] != 0)) {
-- intel_sdvo_hdmi_sink_detect(connector);
-- return connector_status_connected;
-- } else
-+ if (response == 0)
- return connector_status_disconnected;
-+
-+ if (intel_sdvo_multifunc_encoder(intel_output) &&
-+ sdvo_priv->attached_output != response) {
-+ if (sdvo_priv->controlled_output != response &&
-+ intel_sdvo_output_setup(intel_output, response) != true)
-+ return connector_status_unknown;
-+ sdvo_priv->attached_output = response;
-+ }
-+ return intel_sdvo_hdmi_sink_detect(connector, response);
- }
-
- static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)
-@@ -1866,16 +1931,101 @@ intel_sdvo_get_slave_addr(struct drm_dev
- return 0x72;
- }
-
-+static bool
-+intel_sdvo_output_setup(struct intel_output *intel_output, uint16_t flags)
-+{
-+ struct drm_connector *connector = &intel_output->base;
-+ struct drm_encoder *encoder = &intel_output->enc;
-+ struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
-+ bool ret = true, registered = false;
-+
-+ sdvo_priv->is_tv = false;
-+ intel_output->needs_tv_clock = false;
-+ sdvo_priv->is_lvds = false;
-+
-+ if (device_is_registered(&connector->kdev)) {
-+ drm_sysfs_connector_remove(connector);
-+ registered = true;
-+ }
-+
-+ if (flags &
-+ (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
-+ if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0;
-+ else
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1;
-+
-+ encoder->encoder_type = DRM_MODE_ENCODER_TMDS;
-+ connector->connector_type = DRM_MODE_CONNECTOR_DVID;
-+
-+ if (intel_sdvo_get_supp_encode(intel_output,
-+ &sdvo_priv->encode) &&
-+ intel_sdvo_get_digital_encoding_mode(intel_output) &&
-+ sdvo_priv->is_hdmi) {
-+ /* enable hdmi encoding mode if supported */
-+ intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI);
-+ intel_sdvo_set_colorimetry(intel_output,
-+ SDVO_COLORIMETRY_RGB256);
-+ connector->connector_type = DRM_MODE_CONNECTOR_HDMIA;
-+ }
-+ } else if (flags & SDVO_OUTPUT_SVID0) {
-+
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0;
-+ encoder->encoder_type = DRM_MODE_ENCODER_TVDAC;
-+ connector->connector_type = DRM_MODE_CONNECTOR_SVIDEO;
-+ sdvo_priv->is_tv = true;
-+ intel_output->needs_tv_clock = true;
-+ } else if (flags & SDVO_OUTPUT_RGB0) {
-+
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
-+ encoder->encoder_type = DRM_MODE_ENCODER_DAC;
-+ connector->connector_type = DRM_MODE_CONNECTOR_VGA;
-+ } else if (flags & SDVO_OUTPUT_RGB1) {
-+
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
-+ encoder->encoder_type = DRM_MODE_ENCODER_DAC;
-+ connector->connector_type = DRM_MODE_CONNECTOR_VGA;
-+ } else if (flags & SDVO_OUTPUT_LVDS0) {
-+
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
-+ encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
-+ connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
-+ sdvo_priv->is_lvds = true;
-+ } else if (flags & SDVO_OUTPUT_LVDS1) {
-+
-+ sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1;
-+ encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
-+ connector->connector_type = DRM_MODE_CONNECTOR_LVDS;
-+ sdvo_priv->is_lvds = true;
-+ } else {
-+
-+ unsigned char bytes[2];
-+
-+ sdvo_priv->controlled_output = 0;
-+ memcpy(bytes, &sdvo_priv->caps.output_flags, 2);
-+ DRM_DEBUG_KMS(I915_SDVO,
-+ "%s: Unknown SDVO output type (0x%02x%02x)\n",
-+ SDVO_NAME(sdvo_priv),
-+ bytes[0], bytes[1]);
-+ ret = false;
-+ }
-+
-+ if (ret && registered)
-+ ret = drm_sysfs_connector_add(connector) == 0 ? true : false;
-+
-+
-+ return ret;
-+
-+}
-+
- bool intel_sdvo_init(struct drm_device *dev, int output_device)
- {
- struct drm_connector *connector;
- struct intel_output *intel_output;
- struct intel_sdvo_priv *sdvo_priv;
-
-- int connector_type;
- u8 ch[0x40];
- int i;
-- int encoder_type;
-
- intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);
- if (!intel_output) {
-@@ -1925,88 +2075,28 @@ bool intel_sdvo_init(struct drm_device *
- intel_output->ddc_bus->algo = &intel_sdvo_i2c_bit_algo;
-
- /* In defaut case sdvo lvds is false */
-- sdvo_priv->is_lvds = false;
- intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
-
-- if (sdvo_priv->caps.output_flags &
-- (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) {
-- if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
-- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS0;
-- else
-- sdvo_priv->controlled_output = SDVO_OUTPUT_TMDS1;
--
-- encoder_type = DRM_MODE_ENCODER_TMDS;
-- connector_type = DRM_MODE_CONNECTOR_DVID;
--
-- if (intel_sdvo_get_supp_encode(intel_output,
-- &sdvo_priv->encode) &&
-- intel_sdvo_get_digital_encoding_mode(intel_output) &&
-- sdvo_priv->is_hdmi) {
-- /* enable hdmi encoding mode if supported */
-- intel_sdvo_set_encode(intel_output, SDVO_ENCODE_HDMI);
-- intel_sdvo_set_colorimetry(intel_output,
-- SDVO_COLORIMETRY_RGB256);
-- connector_type = DRM_MODE_CONNECTOR_HDMIA;
-- }
-- }
-- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_SVID0)
-- {
-- sdvo_priv->controlled_output = SDVO_OUTPUT_SVID0;
-- encoder_type = DRM_MODE_ENCODER_TVDAC;
-- connector_type = DRM_MODE_CONNECTOR_SVIDEO;
-- sdvo_priv->is_tv = true;
-- intel_output->needs_tv_clock = true;
-- }
-- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
-- {
-- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB0;
-- encoder_type = DRM_MODE_ENCODER_DAC;
-- connector_type = DRM_MODE_CONNECTOR_VGA;
-- }
-- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1)
-- {
-- sdvo_priv->controlled_output = SDVO_OUTPUT_RGB1;
-- encoder_type = DRM_MODE_ENCODER_DAC;
-- connector_type = DRM_MODE_CONNECTOR_VGA;
-- }
-- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS0)
-- {
-- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS0;
-- encoder_type = DRM_MODE_ENCODER_LVDS;
-- connector_type = DRM_MODE_CONNECTOR_LVDS;
-- sdvo_priv->is_lvds = true;
-- }
-- else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_LVDS1)
-- {
-- sdvo_priv->controlled_output = SDVO_OUTPUT_LVDS1;
-- encoder_type = DRM_MODE_ENCODER_LVDS;
-- connector_type = DRM_MODE_CONNECTOR_LVDS;
-- sdvo_priv->is_lvds = true;
-- }
-- else
-- {
-- unsigned char bytes[2];
--
-- sdvo_priv->controlled_output = 0;
-- memcpy (bytes, &sdvo_priv->caps.output_flags, 2);
-- DRM_DEBUG_KMS(I915_SDVO,
-- "%s: Unknown SDVO output type (0x%02x%02x)\n",
-- SDVO_NAME(sdvo_priv),
-- bytes[0], bytes[1]);
-- encoder_type = DRM_MODE_ENCODER_NONE;
-- connector_type = DRM_MODE_CONNECTOR_Unknown;
-+ if (intel_sdvo_output_setup(intel_output,
-+ sdvo_priv->caps.output_flags) != true) {
-+ DRM_DEBUG("SDVO output failed to setup on SDVO%c\n",
-+ output_device == SDVOB ? 'B' : 'C');
- goto err_i2c;
- }
-
-+
- connector = &intel_output->base;
- drm_connector_init(dev, connector, &intel_sdvo_connector_funcs,
-- connector_type);
-+ connector->connector_type);
-+
- drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs);
- connector->interlace_allowed = 0;
- connector->doublescan_allowed = 0;
- connector->display_info.subpixel_order = SubPixelHorizontalRGB;
-
-- drm_encoder_init(dev, &intel_output->enc, &intel_sdvo_enc_funcs, encoder_type);
-+ drm_encoder_init(dev, &intel_output->enc,
-+ &intel_sdvo_enc_funcs, intel_output->enc.encoder_type);
-+
- drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs);
-
- drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
---- a/drivers/gpu/drm/i915/intel_tv.c
-+++ b/drivers/gpu/drm/i915/intel_tv.c
-@@ -1490,6 +1490,27 @@ static struct input_res {
- {"1920x1080", 1920, 1080},
- };
-
-+/*
-+ * Chose preferred mode according to line number of TV format
-+ */
-+static void
-+intel_tv_chose_preferred_modes(struct drm_connector *connector,
-+ struct drm_display_mode *mode_ptr)
-+{
-+ struct intel_output *intel_output = to_intel_output(connector);
-+ const struct tv_mode *tv_mode = intel_tv_mode_find(intel_output);
-+
-+ if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
-+ mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-+ else if (tv_mode->nbr_end > 480) {
-+ if (tv_mode->progressive == true && tv_mode->nbr_end < 720) {
-+ if (mode_ptr->vdisplay == 720)
-+ mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-+ } else if (mode_ptr->vdisplay == 1080)
-+ mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
-+ }
-+}
-+
- /**
- * Stub get_modes function.
- *
-@@ -1544,6 +1565,7 @@ intel_tv_get_modes(struct drm_connector
- mode_ptr->clock = (int) tmp;
-
- mode_ptr->type = DRM_MODE_TYPE_DRIVER;
-+ intel_tv_chose_preferred_modes(connector, mode_ptr);
- drm_mode_probed_add(connector, mode_ptr);
- count++;
- }
---- a/drivers/gpu/drm/radeon/r600_cp.c
-+++ b/drivers/gpu/drm/radeon/r600_cp.c
-@@ -384,8 +384,9 @@ static void r600_cp_load_microcode(drm_r
- DRM_INFO("Loading RV670 PFP Microcode\n");
- for (i = 0; i < PFP_UCODE_SIZE; i++)
- RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RV670_pfp_microcode[i]);
-- } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) {
-- DRM_INFO("Loading RS780 CP Microcode\n");
-+ } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) {
-+ DRM_INFO("Loading RS780/RS880 CP Microcode\n");
- for (i = 0; i < PM4_UCODE_SIZE; i++) {
- RADEON_WRITE(R600_CP_ME_RAM_DATA,
- RS780_cp_microcode[i][0]);
-@@ -396,7 +397,7 @@ static void r600_cp_load_microcode(drm_r
- }
-
- RADEON_WRITE(R600_CP_PFP_UCODE_ADDR, 0);
-- DRM_INFO("Loading RS780 PFP Microcode\n");
-+ DRM_INFO("Loading RS780/RS880 PFP Microcode\n");
- for (i = 0; i < PFP_UCODE_SIZE; i++)
- RADEON_WRITE(R600_CP_PFP_UCODE_DATA, RS780_pfp_microcode[i]);
- }
-@@ -783,6 +784,7 @@ static void r600_gfx_init(struct drm_dev
- break;
- case CHIP_RV610:
- case CHIP_RS780:
-+ case CHIP_RS880:
- case CHIP_RV620:
- dev_priv->r600_max_pipes = 1;
- dev_priv->r600_max_tile_pipes = 1;
-@@ -917,7 +919,8 @@ static void r600_gfx_init(struct drm_dev
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV630) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
-- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780))
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880))
- RADEON_WRITE(R600_DB_DEBUG, R600_PREZ_MUST_WAIT_FOR_POSTZ_DONE);
- else
- RADEON_WRITE(R600_DB_DEBUG, 0);
-@@ -935,7 +938,8 @@ static void r600_gfx_init(struct drm_dev
- sq_ms_fifo_sizes = RADEON_READ(R600_SQ_MS_FIFO_SIZES);
- if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
-- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) {
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) {
- sq_ms_fifo_sizes = (R600_CACHE_FIFO_SIZE(0xa) |
- R600_FETCH_FIFO_HIWATER(0xa) |
- R600_DONE_FIFO_HIWATER(0xe0) |
-@@ -978,7 +982,8 @@ static void r600_gfx_init(struct drm_dev
- R600_NUM_ES_STACK_ENTRIES(0));
- } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
-- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780)) {
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880)) {
- /* no vertex cache */
- sq_config &= ~R600_VC_ENABLE;
-
-@@ -1035,7 +1040,8 @@ static void r600_gfx_init(struct drm_dev
-
- if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV610) ||
- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV620) ||
-- ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780))
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS780) ||
-+ ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS880))
- RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_TC_ONLY));
- else
- RADEON_WRITE(R600_VGT_CACHE_INVALIDATION, R600_CACHE_INVALIDATION(R600_VC_AND_TC));
-@@ -1078,6 +1084,7 @@ static void r600_gfx_init(struct drm_dev
- break;
- case CHIP_RV610:
- case CHIP_RS780:
-+ case CHIP_RS880:
- case CHIP_RV620:
- gs_prim_buffer_depth = 32;
- break;
-@@ -1123,6 +1130,7 @@ static void r600_gfx_init(struct drm_dev
- switch (dev_priv->flags & RADEON_FAMILY_MASK) {
- case CHIP_RV610:
- case CHIP_RS780:
-+ case CHIP_RS880:
- case CHIP_RV620:
- tc_cntl = R600_TC_L2_SIZE(8);
- break;
---- a/drivers/gpu/drm/radeon/radeon_device.c
-+++ b/drivers/gpu/drm/radeon/radeon_device.c
-@@ -152,7 +152,9 @@ int radeon_mc_setup(struct radeon_device
- }
- } else {
- rdev->mc.vram_location = 0;
-- rdev->mc.gtt_location = rdev->mc.mc_vram_size;
-+ tmp = rdev->mc.mc_vram_size;
-+ tmp = (tmp + rdev->mc.gtt_size - 1) & ~(rdev->mc.gtt_size - 1);
-+ rdev->mc.gtt_location = tmp;
- }
- DRM_INFO("radeon: VRAM %uM\n", rdev->mc.real_vram_size >> 20);
- DRM_INFO("radeon: VRAM from 0x%08X to 0x%08X\n",
---- a/drivers/gpu/drm/radeon/radeon_drv.h
-+++ b/drivers/gpu/drm/radeon/radeon_drv.h
-@@ -143,6 +143,7 @@ enum radeon_family {
- CHIP_RV635,
- CHIP_RV670,
- CHIP_RS780,
-+ CHIP_RS880,
- CHIP_RV770,
- CHIP_RV730,
- CHIP_RV710,
---- a/drivers/gpu/drm/radeon/radeon_object.c
-+++ b/drivers/gpu/drm/radeon/radeon_object.c
-@@ -106,7 +106,7 @@ static inline uint32_t radeon_object_fla
- flags |= TTM_PL_FLAG_VRAM | TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED;
- }
- if (domain & RADEON_GEM_DOMAIN_GTT) {
-- flags |= TTM_PL_FLAG_TT | TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED;
-+ flags |= TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
- }
- if (domain & RADEON_GEM_DOMAIN_CPU) {
- flags |= TTM_PL_FLAG_SYSTEM | TTM_PL_MASK_CACHING;
---- a/drivers/input/keyboard/matrix_keypad.c
-+++ b/drivers/input/keyboard/matrix_keypad.c
-@@ -27,6 +27,7 @@ struct matrix_keypad {
- const struct matrix_keypad_platform_data *pdata;
- struct input_dev *input_dev;
- unsigned short *keycodes;
-+ unsigned int row_shift;
-
- uint32_t last_key_state[MATRIX_MAX_COLS];
- struct delayed_work work;
-@@ -136,7 +137,7 @@ static void matrix_keypad_scan(struct wo
- if ((bits_changed & (1 << row)) == 0)
- continue;
-
-- code = (row << 4) + col;
-+ code = MATRIX_SCAN_CODE(row, col, keypad->row_shift);
- input_event(input_dev, EV_MSC, MSC_SCAN, code);
- input_report_key(input_dev,
- keypad->keycodes[code],
-@@ -317,6 +318,7 @@ static int __devinit matrix_keypad_probe
- struct matrix_keypad *keypad;
- struct input_dev *input_dev;
- unsigned short *keycodes;
-+ unsigned int row_shift;
- int i;
- int err;
-
-@@ -332,14 +334,11 @@ static int __devinit matrix_keypad_probe
- return -EINVAL;
- }
-
-- if (!keymap_data->max_keymap_size) {
-- dev_err(&pdev->dev, "invalid keymap data supplied\n");
-- return -EINVAL;
-- }
-+ row_shift = get_count_order(pdata->num_col_gpios);
-
- keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL);
-- keycodes = kzalloc(keymap_data->max_keymap_size *
-- sizeof(keypad->keycodes),
-+ keycodes = kzalloc((pdata->num_row_gpios << row_shift) *
-+ sizeof(*keycodes),
- GFP_KERNEL);
- input_dev = input_allocate_device();
- if (!keypad || !keycodes || !input_dev) {
-@@ -350,6 +349,7 @@ static int __devinit matrix_keypad_probe
- keypad->input_dev = input_dev;
- keypad->pdata = pdata;
- keypad->keycodes = keycodes;
-+ keypad->row_shift = row_shift;
- keypad->stopped = true;
- INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
- spin_lock_init(&keypad->lock);
-@@ -363,7 +363,7 @@ static int __devinit matrix_keypad_probe
-
- input_dev->keycode = keycodes;
- input_dev->keycodesize = sizeof(*keycodes);
-- input_dev->keycodemax = keymap_data->max_keymap_size;
-+ input_dev->keycodemax = pdata->num_row_gpios << keypad->row_shift;
-
- for (i = 0; i < keymap_data->keymap_size; i++) {
- unsigned int key = keymap_data->keymap[i];
-@@ -371,7 +371,7 @@ static int __devinit matrix_keypad_probe
- unsigned int col = KEY_COL(key);
- unsigned short code = KEY_VAL(key);
-
-- keycodes[(row << 4) + col] = code;
-+ keycodes[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
- __set_bit(code, input_dev->keybit);
- }
- __clear_bit(KEY_RESERVED, input_dev->keybit);
---- a/drivers/input/misc/wistron_btns.c
-+++ b/drivers/input/misc/wistron_btns.c
-@@ -611,6 +611,20 @@ static struct key_entry keymap_wistron_g
- { KE_END, 0 }
- };
-
-+static struct key_entry keymap_prestigio[] __initdata = {
-+ { KE_KEY, 0x11, {KEY_PROG1} },
-+ { KE_KEY, 0x12, {KEY_PROG2} },
-+ { KE_WIFI, 0x30 },
-+ { KE_KEY, 0x22, {KEY_REWIND} },
-+ { KE_KEY, 0x23, {KEY_FORWARD} },
-+ { KE_KEY, 0x24, {KEY_PLAYPAUSE} },
-+ { KE_KEY, 0x25, {KEY_STOPCD} },
-+ { KE_KEY, 0x31, {KEY_MAIL} },
-+ { KE_KEY, 0x36, {KEY_WWW} },
-+ { KE_END, 0 }
-+};
-+
-+
- /*
- * If your machine is not here (which is currently rather likely), please send
- * a list of buttons and their key codes (reported when loading this module
-@@ -971,6 +985,8 @@ static int __init select_keymap(void)
- if (keymap_name != NULL) {
- if (strcmp (keymap_name, "1557/MS2141") == 0)
- keymap = keymap_wistron_ms2141;
-+ else if (strcmp (keymap_name, "prestigio") == 0)
-+ keymap = keymap_prestigio;
- else if (strcmp (keymap_name, "generic") == 0)
- keymap = keymap_wistron_generic;
- else {
---- a/drivers/input/serio/i8042-x86ia64io.h
-+++ b/drivers/input/serio/i8042-x86ia64io.h
-@@ -78,6 +78,14 @@ static struct dmi_system_id __initdata i
- },
- },
- {
-+ .ident = "ASUS G1S",
-+ .matches = {
-+ DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
-+ DMI_MATCH(DMI_BOARD_NAME, "G1S"),
-+ DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
-+ },
-+ },
-+ {
- /* AUX LOOP command does not raise AUX IRQ */
- .ident = "ASUS P65UP5",
- .matches = {
---- a/drivers/mmc/host/sdhci-of.c
-+++ b/drivers/mmc/host/sdhci-of.c
-@@ -234,7 +234,7 @@ static int __devinit sdhci_of_probe(stru
- return -ENODEV;
-
- host = sdhci_alloc_host(&ofdev->dev, sizeof(*of_host));
-- if (!host)
-+ if (IS_ERR(host))
- return -ENOMEM;
-
- of_host = sdhci_priv(host);
---- a/drivers/mtd/maps/Kconfig
-+++ b/drivers/mtd/maps/Kconfig
-@@ -284,13 +284,6 @@ config MTD_L440GX
-
- BE VERY CAREFUL.
-
--config MTD_SBC8240
-- tristate "Flash device on SBC8240"
-- depends on MTD_JEDECPROBE && 8260
-- help
-- Flash access on the SBC8240 board from Wind River. See
-- <http://www.windriver.com/products/sbc8240/>
--
- config MTD_TQM8XXL
- tristate "CFI Flash device mapped on TQM8XXL"
- depends on MTD_CFI && TQM8xxL
---- a/drivers/mtd/maps/Makefile
-+++ b/drivers/mtd/maps/Makefile
-@@ -50,7 +50,6 @@ obj-$(CONFIG_MTD_UCLINUX) += uclinux.o
- obj-$(CONFIG_MTD_NETtel) += nettel.o
- obj-$(CONFIG_MTD_SCB2_FLASH) += scb2_flash.o
- obj-$(CONFIG_MTD_H720X) += h720x-flash.o
--obj-$(CONFIG_MTD_SBC8240) += sbc8240.o
- obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o
- obj-$(CONFIG_MTD_IXP2000) += ixp2000.o
- obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o
---- a/drivers/mtd/maps/sbc8240.c
-+++ /dev/null
-@@ -1,250 +0,0 @@
--/*
-- * Handle mapping of the flash memory access routines on the SBC8240 board.
-- *
-- * Carolyn Smith, Tektronix, Inc.
-- *
-- * This code is GPLed
-- */
--
--/*
-- * The SBC8240 has 2 flash banks.
-- * Bank 0 is a 512 KiB AMD AM29F040B; 8 x 64 KiB sectors.
-- * It contains the U-Boot code (7 sectors) and the environment (1 sector).
-- * Bank 1 is 4 x 1 MiB AMD AM29LV800BT; 15 x 64 KiB sectors, 1 x 32 KiB sector,
-- * 2 x 8 KiB sectors, 1 x 16 KiB sectors.
-- * Both parts are JEDEC compatible.
-- */
--
--#include <linux/module.h>
--#include <linux/types.h>
--#include <linux/kernel.h>
--#include <asm/io.h>
--
--#include <linux/mtd/mtd.h>
--#include <linux/mtd/map.h>
--#include <linux/mtd/cfi.h>
--
--#ifdef CONFIG_MTD_PARTITIONS
--#include <linux/mtd/partitions.h>
--#endif
--
--#define DEBUG
--
--#ifdef DEBUG
--# define debugk(fmt,args...) printk(fmt ,##args)
--#else
--# define debugk(fmt,args...)
--#endif
--
--
--#define WINDOW_ADDR0 0xFFF00000 /* 512 KiB */
--#define WINDOW_SIZE0 0x00080000
--#define BUSWIDTH0 1
--
--#define WINDOW_ADDR1 0xFF000000 /* 4 MiB */
--#define WINDOW_SIZE1 0x00400000
--#define BUSWIDTH1 8
--
--#define MSG_PREFIX "sbc8240:" /* prefix for our printk()'s */
--#define MTDID "sbc8240-%d" /* for mtdparts= partitioning */
--
--
--static struct map_info sbc8240_map[2] = {
-- {
-- .name = "sbc8240 Flash Bank #0",
-- .size = WINDOW_SIZE0,
-- .bankwidth = BUSWIDTH0,
-- },
-- {
-- .name = "sbc8240 Flash Bank #1",
-- .size = WINDOW_SIZE1,
-- .bankwidth = BUSWIDTH1,
-- }
--};
--
--#define NUM_FLASH_BANKS ARRAY_SIZE(sbc8240_map)
--
--/*
-- * The following defines the partition layout of SBC8240 boards.
-- *
-- * See include/linux/mtd/partitions.h for definition of the
-- * mtd_partition structure.
-- *
-- * The *_max_flash_size is the maximum possible mapped flash size
-- * which is not necessarily the actual flash size. It must correspond
-- * to the value specified in the mapping definition defined by the
-- * "struct map_desc *_io_desc" for the corresponding machine.
-- */
--
--#ifdef CONFIG_MTD_PARTITIONS
--
--static struct mtd_partition sbc8240_uboot_partitions [] = {
-- /* Bank 0 */
-- {
-- .name = "U-boot", /* U-Boot Firmware */
-- .offset = 0,
-- .size = 0x00070000, /* 7 x 64 KiB sectors */
-- .mask_flags = MTD_WRITEABLE, /* force read-only */
-- },
-- {
-- .name = "environment", /* U-Boot environment */
-- .offset = 0x00070000,
-- .size = 0x00010000, /* 1 x 64 KiB sector */
-- },
--};
--
--static struct mtd_partition sbc8240_fs_partitions [] = {
-- {
-- .name = "jffs", /* JFFS filesystem */
-- .offset = 0,
-- .size = 0x003C0000, /* 4 * 15 * 64KiB */
-- },
-- {
-- .name = "tmp32",
-- .offset = 0x003C0000,
-- .size = 0x00020000, /* 4 * 32KiB */
-- },
-- {
-- .name = "tmp8a",
-- .offset = 0x003E0000,
-- .size = 0x00008000, /* 4 * 8KiB */
-- },
-- {
-- .name = "tmp8b",
-- .offset = 0x003E8000,
-- .size = 0x00008000, /* 4 * 8KiB */
-- },
-- {
-- .name = "tmp16",
-- .offset = 0x003F0000,
-- .size = 0x00010000, /* 4 * 16KiB */
-- }
--};
--
--/* trivial struct to describe partition information */
--struct mtd_part_def
--{
-- int nums;
-- unsigned char *type;
-- struct mtd_partition* mtd_part;
--};
--
--static struct mtd_info *sbc8240_mtd[NUM_FLASH_BANKS];
--static struct mtd_part_def sbc8240_part_banks[NUM_FLASH_BANKS];
--
--
--#endif /* CONFIG_MTD_PARTITIONS */
--
--
--static int __init init_sbc8240_mtd (void)
--{
-- static struct _cjs {
-- u_long addr;
-- u_long size;
-- } pt[NUM_FLASH_BANKS] = {
-- {
-- .addr = WINDOW_ADDR0,
-- .size = WINDOW_SIZE0
-- },
-- {
-- .addr = WINDOW_ADDR1,
-- .size = WINDOW_SIZE1
-- },
-- };
--
-- int devicesfound = 0;
-- int i,j;
--
-- for (i = 0; i < NUM_FLASH_BANKS; i++) {
-- printk (KERN_NOTICE MSG_PREFIX
-- "Probing 0x%08lx at 0x%08lx\n", pt[i].size, pt[i].addr);
--
-- sbc8240_map[i].map_priv_1 =
-- (unsigned long) ioremap (pt[i].addr, pt[i].size);
-- if (!sbc8240_map[i].map_priv_1) {
-- printk (MSG_PREFIX "failed to ioremap\n");
-- for (j = 0; j < i; j++) {
-- iounmap((void *) sbc8240_map[j].map_priv_1);
-- sbc8240_map[j].map_priv_1 = 0;
-- }
-- return -EIO;
-- }
-- simple_map_init(&sbc8240_mtd[i]);
--
-- sbc8240_mtd[i] = do_map_probe("jedec_probe", &sbc8240_map[i]);
--
-- if (sbc8240_mtd[i]) {
-- sbc8240_mtd[i]->module = THIS_MODULE;
-- devicesfound++;
-- } else {
-- if (sbc8240_map[i].map_priv_1) {
-- iounmap((void *) sbc8240_map[i].map_priv_1);
-- sbc8240_map[i].map_priv_1 = 0;
-- }
-- }
-- }
--
-- if (!devicesfound) {
-- printk(KERN_NOTICE MSG_PREFIX
-- "No suppported flash chips found!\n");
-- return -ENXIO;
-- }
--
--#ifdef CONFIG_MTD_PARTITIONS
-- sbc8240_part_banks[0].mtd_part = sbc8240_uboot_partitions;
-- sbc8240_part_banks[0].type = "static image";
-- sbc8240_part_banks[0].nums = ARRAY_SIZE(sbc8240_uboot_partitions);
-- sbc8240_part_banks[1].mtd_part = sbc8240_fs_partitions;
-- sbc8240_part_banks[1].type = "static file system";
-- sbc8240_part_banks[1].nums = ARRAY_SIZE(sbc8240_fs_partitions);
--
-- for (i = 0; i < NUM_FLASH_BANKS; i++) {
--
-- if (!sbc8240_mtd[i]) continue;
-- if (sbc8240_part_banks[i].nums == 0) {
-- printk (KERN_NOTICE MSG_PREFIX
-- "No partition info available, registering whole device\n");
-- add_mtd_device(sbc8240_mtd[i]);
-- } else {
-- printk (KERN_NOTICE MSG_PREFIX
-- "Using %s partition definition\n", sbc8240_part_banks[i].mtd_part->name);
-- add_mtd_partitions (sbc8240_mtd[i],
-- sbc8240_part_banks[i].mtd_part,
-- sbc8240_part_banks[i].nums);
-- }
-- }
--#else
-- printk(KERN_NOTICE MSG_PREFIX
-- "Registering %d flash banks at once\n", devicesfound);
--
-- for (i = 0; i < devicesfound; i++) {
-- add_mtd_device(sbc8240_mtd[i]);
-- }
--#endif /* CONFIG_MTD_PARTITIONS */
--
-- return devicesfound == 0 ? -ENXIO : 0;
--}
--
--static void __exit cleanup_sbc8240_mtd (void)
--{
-- int i;
--
-- for (i = 0; i < NUM_FLASH_BANKS; i++) {
-- if (sbc8240_mtd[i]) {
-- del_mtd_device (sbc8240_mtd[i]);
-- map_destroy (sbc8240_mtd[i]);
-- }
-- if (sbc8240_map[i].map_priv_1) {
-- iounmap ((void *) sbc8240_map[i].map_priv_1);
-- sbc8240_map[i].map_priv_1 = 0;
-- }
-- }
--}
--
--module_init (init_sbc8240_mtd);
--module_exit (cleanup_sbc8240_mtd);
--
--MODULE_LICENSE ("GPL");
--MODULE_AUTHOR ("Carolyn Smith <carolyn.smith@tektronix.com>");
--MODULE_DESCRIPTION ("MTD map driver for SBC8240 boards");
--
---- a/drivers/mtd/mtd_blkdevs.c
-+++ b/drivers/mtd/mtd_blkdevs.c
-@@ -144,7 +144,7 @@ static int blktrans_open(struct block_de
- struct mtd_blktrans_ops *tr = dev->tr;
- int ret = -ENODEV;
-
-- if (!try_module_get(dev->mtd->owner))
-+ if (!get_mtd_device(NULL, dev->mtd->index))
- goto out;
-
- if (!try_module_get(tr->owner))
-@@ -158,7 +158,7 @@ static int blktrans_open(struct block_de
- ret = 0;
- if (tr->open && (ret = tr->open(dev))) {
- dev->mtd->usecount--;
-- module_put(dev->mtd->owner);
-+ put_mtd_device(dev->mtd);
- out_tr:
- module_put(tr->owner);
- }
-@@ -177,7 +177,7 @@ static int blktrans_release(struct gendi
-
- if (!ret) {
- dev->mtd->usecount--;
-- module_put(dev->mtd->owner);
-+ put_mtd_device(dev->mtd);
- module_put(tr->owner);
- }
-
---- a/drivers/mtd/mtdblock.c
-+++ b/drivers/mtd/mtdblock.c
-@@ -29,6 +29,8 @@ static struct mtdblk_dev {
- enum { STATE_EMPTY, STATE_CLEAN, STATE_DIRTY } cache_state;
- } *mtdblks[MAX_MTD_DEVICES];
-
-+static struct mutex mtdblks_lock;
-+
- /*
- * Cache stuff...
- *
-@@ -270,15 +272,19 @@ static int mtdblock_open(struct mtd_blkt
-
- DEBUG(MTD_DEBUG_LEVEL1,"mtdblock_open\n");
-
-+ mutex_lock(&mtdblks_lock);
- if (mtdblks[dev]) {
- mtdblks[dev]->count++;
-+ mutex_unlock(&mtdblks_lock);
- return 0;
- }
-
- /* OK, it's not open. Create cache info for it */
- mtdblk = kzalloc(sizeof(struct mtdblk_dev), GFP_KERNEL);
-- if (!mtdblk)
-+ if (!mtdblk) {
-+ mutex_unlock(&mtdblks_lock);
- return -ENOMEM;
-+ }
-
- mtdblk->count = 1;
- mtdblk->mtd = mtd;
-@@ -291,6 +297,7 @@ static int mtdblock_open(struct mtd_blkt
- }
-
- mtdblks[dev] = mtdblk;
-+ mutex_unlock(&mtdblks_lock);
-
- DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
-
-@@ -304,6 +311,8 @@ static int mtdblock_release(struct mtd_b
-
- DEBUG(MTD_DEBUG_LEVEL1, "mtdblock_release\n");
-
-+ mutex_lock(&mtdblks_lock);
-+
- mutex_lock(&mtdblk->cache_mutex);
- write_cached_data(mtdblk);
- mutex_unlock(&mtdblk->cache_mutex);
-@@ -316,6 +325,9 @@ static int mtdblock_release(struct mtd_b
- vfree(mtdblk->cache_data);
- kfree(mtdblk);
- }
-+
-+ mutex_unlock(&mtdblks_lock);
-+
- DEBUG(MTD_DEBUG_LEVEL1, "ok\n");
-
- return 0;
-@@ -376,6 +388,8 @@ static struct mtd_blktrans_ops mtdblock_
-
- static int __init init_mtdblock(void)
- {
-+ mutex_init(&mtdblks_lock);
-+
- return register_mtd_blktrans(&mtdblock_tr);
- }
-
---- a/drivers/mtd/mtdcore.c
-+++ b/drivers/mtd/mtdcore.c
-@@ -65,8 +65,8 @@ static void mtd_release(struct device *d
- static int mtd_cls_suspend(struct device *dev, pm_message_t state)
- {
- struct mtd_info *mtd = dev_to_mtd(dev);
--
-- if (mtd->suspend)
-+
-+ if (mtd && mtd->suspend)
- return mtd->suspend(mtd);
- else
- return 0;
-@@ -76,7 +76,7 @@ static int mtd_cls_resume(struct device
- {
- struct mtd_info *mtd = dev_to_mtd(dev);
-
-- if (mtd->resume)
-+ if (mtd && mtd->resume)
- mtd->resume(mtd);
- return 0;
- }
-@@ -298,6 +298,7 @@ int add_mtd_device(struct mtd_info *mtd)
- mtd->dev.class = &mtd_class;
- mtd->dev.devt = MTD_DEVT(i);
- dev_set_name(&mtd->dev, "mtd%d", i);
-+ dev_set_drvdata(&mtd->dev, mtd);
- if (device_register(&mtd->dev) != 0) {
- mtd_table[i] = NULL;
- break;
---- a/drivers/mtd/onenand/omap2.c
-+++ b/drivers/mtd/onenand/omap2.c
-@@ -266,7 +266,7 @@ static inline int omap2_onenand_bufferra
-
- if (ONENAND_CURRENT_BUFFERRAM(this)) {
- if (area == ONENAND_DATARAM)
-- return mtd->writesize;
-+ return this->writesize;
- if (area == ONENAND_SPARERAM)
- return mtd->oobsize;
- }
-@@ -770,6 +770,7 @@ static int __devexit omap2_onenand_remov
- }
- iounmap(c->onenand.base);
- release_mem_region(c->phys_base, ONENAND_IO_SIZE);
-+ gpmc_cs_free(c->gpmc_cs);
- kfree(c);
-
- return 0;
---- a/drivers/mtd/ubi/eba.c
-+++ b/drivers/mtd/ubi/eba.c
-@@ -1254,6 +1254,7 @@ out_free:
- if (!ubi->volumes[i])
- continue;
- kfree(ubi->volumes[i]->eba_tbl);
-+ ubi->volumes[i]->eba_tbl = NULL;
- }
- return err;
- }
---- a/drivers/mtd/ubi/scan.c
-+++ b/drivers/mtd/ubi/scan.c
-@@ -781,11 +781,22 @@ static int process_eb(struct ubi_device
- return -EINVAL;
- }
-
-+ /*
-+ * Make sure that all PEBs have the same image sequence number.
-+ * This allows us to detect situations when users flash UBI
-+ * images incorrectly, so that the flash has the new UBI image
-+ * and leftovers from the old one. This feature was added
-+ * relatively recently, and the sequence number was always
-+ * zero, because old UBI implementations always set it to zero.
-+ * For this reasons, we do not panic if some PEBs have zero
-+ * sequence number, while other PEBs have non-zero sequence
-+ * number.
-+ */
- image_seq = be32_to_cpu(ech->image_seq);
- if (!si->image_seq_set) {
- ubi->image_seq = image_seq;
- si->image_seq_set = 1;
-- } else if (ubi->image_seq != image_seq) {
-+ } else if (ubi->image_seq && ubi->image_seq != image_seq) {
- ubi_err("bad image sequence number %d in PEB %d, "
- "expected %d", image_seq, pnum, ubi->image_seq);
- ubi_dbg_dump_ec_hdr(ech);
---- a/drivers/pci/hotplug/sgi_hotplug.c
-+++ b/drivers/pci/hotplug/sgi_hotplug.c
-@@ -90,11 +90,10 @@ static struct hotplug_slot_ops sn_hotplu
-
- static DEFINE_MUTEX(sn_hotplug_mutex);
-
--static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot,
-- char *buf)
-+static ssize_t path_show(struct pci_slot *pci_slot, char *buf)
- {
- int retval = -ENOENT;
-- struct slot *slot = bss_hotplug_slot->private;
-+ struct slot *slot = pci_slot->hotplug->private;
-
- if (!slot)
- return retval;
-@@ -103,7 +102,7 @@ static ssize_t path_show (struct hotplug
- return retval;
- }
-
--static struct hotplug_slot_attribute sn_slot_path_attr = __ATTR_RO(path);
-+static struct pci_slot_attribute sn_slot_path_attr = __ATTR_RO(path);
-
- static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device)
- {
---- a/drivers/pci/intel-iommu.c
-+++ b/drivers/pci/intel-iommu.c
-@@ -1505,7 +1505,6 @@ static int domain_context_mapping_one(st
- }
-
- set_bit(num, iommu->domain_ids);
-- set_bit(iommu->seq_id, &domain->iommu_bmp);
- iommu->domains[num] = domain;
- id = num;
- }
-@@ -1648,6 +1647,14 @@ static int domain_context_mapped(struct
- tmp->devfn);
- }
-
-+/* Returns a number of VTD pages, but aligned to MM page size */
-+static inline unsigned long aligned_nrpages(unsigned long host_addr,
-+ size_t size)
-+{
-+ host_addr &= ~PAGE_MASK;
-+ return PAGE_ALIGN(host_addr + size) >> VTD_PAGE_SHIFT;
-+}
-+
- static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn,
- struct scatterlist *sg, unsigned long phys_pfn,
- unsigned long nr_pages, int prot)
-@@ -1675,7 +1682,7 @@ static int __domain_mapping(struct dmar_
- uint64_t tmp;
-
- if (!sg_res) {
-- sg_res = (sg->offset + sg->length + VTD_PAGE_SIZE - 1) >> VTD_PAGE_SHIFT;
-+ sg_res = aligned_nrpages(sg->offset, sg->length);
- sg->dma_address = ((dma_addr_t)iov_pfn << VTD_PAGE_SHIFT) + sg->offset;
- sg->dma_length = sg->length;
- pteval = page_to_phys(sg_page(sg)) | prot;
-@@ -2415,14 +2422,6 @@ error:
- return ret;
- }
-
--/* Returns a number of VTD pages, but aligned to MM page size */
--static inline unsigned long aligned_nrpages(unsigned long host_addr,
-- size_t size)
--{
-- host_addr &= ~PAGE_MASK;
-- return PAGE_ALIGN(host_addr + size) >> VTD_PAGE_SHIFT;
--}
--
- /* This takes a number of _MM_ pages, not VTD pages */
- static struct iova *intel_alloc_iova(struct device *dev,
- struct dmar_domain *domain,
-@@ -2551,6 +2550,7 @@ static dma_addr_t __intel_map_single(str
- int prot = 0;
- int ret;
- struct intel_iommu *iommu;
-+ unsigned long paddr_pfn = paddr >> PAGE_SHIFT;
-
- BUG_ON(dir == DMA_NONE);
-
-@@ -2585,7 +2585,7 @@ static dma_addr_t __intel_map_single(str
- * is not a big problem
- */
- ret = domain_pfn_mapping(domain, mm_to_dma_pfn(iova->pfn_lo),
-- paddr >> VTD_PAGE_SHIFT, size, prot);
-+ mm_to_dma_pfn(paddr_pfn), size, prot);
- if (ret)
- goto error;
-
-@@ -2875,7 +2875,7 @@ static int intel_map_sg(struct device *h
-
- start_vpfn = mm_to_dma_pfn(iova->pfn_lo);
-
-- ret = domain_sg_mapping(domain, start_vpfn, sglist, mm_to_dma_pfn(size), prot);
-+ ret = domain_sg_mapping(domain, start_vpfn, sglist, size, prot);
- if (unlikely(ret)) {
- /* clear the page */
- dma_pte_clear_range(domain, start_vpfn,
-@@ -3408,6 +3408,7 @@ static int md_domain_init(struct dmar_do
-
- domain->iommu_count = 0;
- domain->iommu_coherency = 0;
-+ domain->iommu_snooping = 0;
- domain->max_addr = 0;
-
- /* always allocate the top pgd */
---- a/drivers/serial/s3c2400.c
-+++ b/drivers/serial/s3c2400.c
-@@ -76,7 +76,7 @@ static int s3c2400_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c2400_uart_inf);
- }
-
--static struct platform_driver s3c2400_serial_drv = {
-+static struct platform_driver s3c2400_serial_driver = {
- .probe = s3c2400_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -85,16 +85,16 @@ static struct platform_driver s3c2400_se
- },
- };
-
--s3c24xx_console_init(&s3c2400_serial_drv, &s3c2400_uart_inf);
-+s3c24xx_console_init(&s3c2400_serial_driver, &s3c2400_uart_inf);
-
- static inline int s3c2400_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c2400_serial_drv, &s3c2400_uart_inf);
-+ return s3c24xx_serial_init(&s3c2400_serial_driver, &s3c2400_uart_inf);
- }
-
- static inline void s3c2400_serial_exit(void)
- {
-- platform_driver_unregister(&s3c2400_serial_drv);
-+ platform_driver_unregister(&s3c2400_serial_driver);
- }
-
- module_init(s3c2400_serial_init);
---- a/drivers/serial/s3c2410.c
-+++ b/drivers/serial/s3c2410.c
-@@ -88,7 +88,7 @@ static int s3c2410_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c2410_uart_inf);
- }
-
--static struct platform_driver s3c2410_serial_drv = {
-+static struct platform_driver s3c2410_serial_driver = {
- .probe = s3c2410_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -97,16 +97,16 @@ static struct platform_driver s3c2410_se
- },
- };
-
--s3c24xx_console_init(&s3c2410_serial_drv, &s3c2410_uart_inf);
-+s3c24xx_console_init(&s3c2410_serial_driver, &s3c2410_uart_inf);
-
- static int __init s3c2410_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c2410_serial_drv, &s3c2410_uart_inf);
-+ return s3c24xx_serial_init(&s3c2410_serial_driver, &s3c2410_uart_inf);
- }
-
- static void __exit s3c2410_serial_exit(void)
- {
-- platform_driver_unregister(&s3c2410_serial_drv);
-+ platform_driver_unregister(&s3c2410_serial_driver);
- }
-
- module_init(s3c2410_serial_init);
---- a/drivers/serial/s3c2412.c
-+++ b/drivers/serial/s3c2412.c
-@@ -121,7 +121,7 @@ static int s3c2412_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c2412_uart_inf);
- }
-
--static struct platform_driver s3c2412_serial_drv = {
-+static struct platform_driver s3c2412_serial_driver = {
- .probe = s3c2412_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -130,16 +130,16 @@ static struct platform_driver s3c2412_se
- },
- };
-
--s3c24xx_console_init(&s3c2412_serial_drv, &s3c2412_uart_inf);
-+s3c24xx_console_init(&s3c2412_serial_driver, &s3c2412_uart_inf);
-
- static inline int s3c2412_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c2412_serial_drv, &s3c2412_uart_inf);
-+ return s3c24xx_serial_init(&s3c2412_serial_driver, &s3c2412_uart_inf);
- }
-
- static inline void s3c2412_serial_exit(void)
- {
-- platform_driver_unregister(&s3c2412_serial_drv);
-+ platform_driver_unregister(&s3c2412_serial_driver);
- }
-
- module_init(s3c2412_serial_init);
---- a/drivers/serial/s3c2440.c
-+++ b/drivers/serial/s3c2440.c
-@@ -151,7 +151,7 @@ static int s3c2440_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c2440_uart_inf);
- }
-
--static struct platform_driver s3c2440_serial_drv = {
-+static struct platform_driver s3c2440_serial_driver = {
- .probe = s3c2440_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -160,16 +160,16 @@ static struct platform_driver s3c2440_se
- },
- };
-
--s3c24xx_console_init(&s3c2440_serial_drv, &s3c2440_uart_inf);
-+s3c24xx_console_init(&s3c2440_serial_driver, &s3c2440_uart_inf);
-
- static int __init s3c2440_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c2440_serial_drv, &s3c2440_uart_inf);
-+ return s3c24xx_serial_init(&s3c2440_serial_driver, &s3c2440_uart_inf);
- }
-
- static void __exit s3c2440_serial_exit(void)
- {
-- platform_driver_unregister(&s3c2440_serial_drv);
-+ platform_driver_unregister(&s3c2440_serial_driver);
- }
-
- module_init(s3c2440_serial_init);
---- a/drivers/serial/s3c24a0.c
-+++ b/drivers/serial/s3c24a0.c
-@@ -92,7 +92,7 @@ static int s3c24a0_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c24a0_uart_inf);
- }
-
--static struct platform_driver s3c24a0_serial_drv = {
-+static struct platform_driver s3c24a0_serial_driver = {
- .probe = s3c24a0_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -101,16 +101,16 @@ static struct platform_driver s3c24a0_se
- },
- };
-
--s3c24xx_console_init(&s3c24a0_serial_drv, &s3c24a0_uart_inf);
-+s3c24xx_console_init(&s3c24a0_serial_driver, &s3c24a0_uart_inf);
-
- static int __init s3c24a0_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c24a0_serial_drv, &s3c24a0_uart_inf);
-+ return s3c24xx_serial_init(&s3c24a0_serial_driver, &s3c24a0_uart_inf);
- }
-
- static void __exit s3c24a0_serial_exit(void)
- {
-- platform_driver_unregister(&s3c24a0_serial_drv);
-+ platform_driver_unregister(&s3c24a0_serial_driver);
- }
-
- module_init(s3c24a0_serial_init);
---- a/drivers/serial/s3c6400.c
-+++ b/drivers/serial/s3c6400.c
-@@ -122,7 +122,7 @@ static int s3c6400_serial_probe(struct p
- return s3c24xx_serial_probe(dev, &s3c6400_uart_inf);
- }
-
--static struct platform_driver s3c6400_serial_drv = {
-+static struct platform_driver s3c6400_serial_driver = {
- .probe = s3c6400_serial_probe,
- .remove = __devexit_p(s3c24xx_serial_remove),
- .driver = {
-@@ -131,16 +131,16 @@ static struct platform_driver s3c6400_se
- },
- };
-
--s3c24xx_console_init(&s3c6400_serial_drv, &s3c6400_uart_inf);
-+s3c24xx_console_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
-
- static int __init s3c6400_serial_init(void)
- {
-- return s3c24xx_serial_init(&s3c6400_serial_drv, &s3c6400_uart_inf);
-+ return s3c24xx_serial_init(&s3c6400_serial_driver, &s3c6400_uart_inf);
- }
-
- static void __exit s3c6400_serial_exit(void)
- {
-- platform_driver_unregister(&s3c6400_serial_drv);
-+ platform_driver_unregister(&s3c6400_serial_driver);
- }
-
- module_init(s3c6400_serial_init);
---- a/drivers/serial/serial_ks8695.c
-+++ b/drivers/serial/serial_ks8695.c
-@@ -549,7 +549,7 @@ static struct uart_port ks8695uart_ports
- .mapbase = KS8695_UART_VA,
- .iotype = SERIAL_IO_MEM,
- .irq = KS8695_IRQ_UART_TX,
-- .uartclk = CLOCK_TICK_RATE * 16,
-+ .uartclk = KS8695_CLOCK_RATE * 16,
- .fifosize = 16,
- .ops = &ks8695uart_pops,
- .flags = ASYNC_BOOT_AUTOCONF,
---- a/drivers/staging/b3dfg/Kconfig
-+++ b/drivers/staging/b3dfg/Kconfig
-@@ -1,5 +1,6 @@
- config B3DFG
- tristate "Brontes 3d Frame Framegrabber"
-+ depends on PCI
- default n
- ---help---
- This driver provides support for the Brontes 3d Framegrabber
---- a/drivers/staging/heci/Kconfig
-+++ b/drivers/staging/heci/Kconfig
-@@ -1,5 +1,6 @@
- config HECI
- tristate "Intel Management Engine Interface (MEI) Support"
-+ depends on PCI
- ---help---
- The Intel Management Engine Interface (Intel MEI) driver allows
- applications to access the Active Management Technology
---- a/drivers/staging/rspiusb/rspiusb.c
-+++ b/drivers/staging/rspiusb/rspiusb.c
-@@ -716,6 +716,8 @@ static int MapUserBuffer(struct ioctl_st
- pdx->PixelUrb[frameInfo][i]->transfer_flags =
- URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT;
- }
-+ if (i == 0)
-+ return -EINVAL;
- /* only interrupt when last URB completes */
- pdx->PixelUrb[frameInfo][--i]->transfer_flags &= ~URB_NO_INTERRUPT;
- pdx->pendedPixelUrbs[frameInfo] =
---- a/drivers/staging/rt2860/rt_linux.h
-+++ b/drivers/staging/rt2860/rt_linux.h
-@@ -43,9 +43,6 @@
- #include "rtmp_type.h"
- #include <linux/module.h>
- #include <linux/kernel.h>
--#if !defined(RT2860) && !defined(RT30xx)
--#include <linux/kthread.h>
--#endif
-
- #include <linux/spinlock.h>
- #include <linux/init.h>
-@@ -166,9 +163,7 @@ typedef int (*HARD_START_XMIT_FUNC)(stru
-
- #ifndef RT30xx
- typedef struct pid * THREAD_PID;
--#ifdef RT2860
- #define THREAD_PID_INIT_VALUE NULL
--#endif
- #define GET_PID(_v) find_get_pid(_v)
- #define GET_PID_NUMBER(_v) pid_nr(_v)
- #define CHECK_PID_LEGALITY(_pid) if (pid_nr(_pid) >= 0)
-@@ -188,12 +183,12 @@ struct os_cookie {
- dma_addr_t pAd_pa;
- #endif
- #ifdef RT2870
-- struct usb_device *pUsb_Dev;
-+ struct usb_device *pUsb_Dev;
-
- #ifndef RT30xx
-- struct task_struct *MLMEThr_task;
-- struct task_struct *RTUSBCmdThr_task;
-- struct task_struct *TimerQThr_task;
-+ THREAD_PID MLMEThr_pid;
-+ THREAD_PID RTUSBCmdThr_pid;
-+ THREAD_PID TimerQThr_pid;
- #endif
- #ifdef RT30xx
- struct pid *MLMEThr_pid;
---- a/drivers/staging/rt2870/2870_main_dev.c
-+++ b/drivers/staging/rt2870/2870_main_dev.c
-@@ -235,7 +235,7 @@ INT MlmeThread(
- DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
-
- #ifndef RT30xx
-- pObj->MLMEThr_task = NULL;
-+ pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
- #endif
- #ifdef RT30xx
- pObj->MLMEThr_pid = NULL;
-@@ -348,7 +348,7 @@ INT RTUSBCmdThread(
- DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));
-
- #ifndef RT30xx
-- pObj->RTUSBCmdThr_task = NULL;
-+ pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
- #endif
- #ifdef RT30xx
- pObj->RTUSBCmdThr_pid = NULL;
-@@ -447,7 +447,7 @@ INT TimerQThread(
- DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
-
- #ifndef RT30xx
-- pObj->TimerQThr_task = NULL;
-+ pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
- #endif
- #ifdef RT30xx
- pObj->TimerQThr_pid = NULL;
-@@ -883,46 +883,69 @@ VOID RT28xxThreadTerminate(
-
- // Terminate Threads
- #ifndef RT30xx
-- BUG_ON(pObj->TimerQThr_task == NULL);
-- CHECK_PID_LEGALITY(task_pid(pObj->TimerQThr_task))
-+ CHECK_PID_LEGALITY(pObj->TimerQThr_pid)
- {
- POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
-
-- printk(KERN_DEBUG "Terminate the TimerQThr pid=%d!\n",
-- pid_nr(task_pid(pObj->TimerQThr_task)));
-+ printk("Terminate the TimerQThr_pid=%d!\n", GET_PID_NUMBER(pObj->TimerQThr_pid));
- mb();
- pAd->TimerFunc_kill = 1;
- mb();
-- kthread_stop(pObj->TimerQThr_task);
-- pObj->TimerQThr_task = NULL;
-+ ret = KILL_THREAD_PID(pObj->TimerQThr_pid, SIGTERM, 1);
-+ if (ret)
-+ {
-+ printk(KERN_WARNING "%s: unable to stop TimerQThread, pid=%d, ret=%d!\n",
-+ pAd->net_dev->name, GET_PID_NUMBER(pObj->TimerQThr_pid), ret);
-+ }
-+ else
-+ {
-+ wait_for_completion(&pAd->TimerQComplete);
-+ pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
-+ }
- }
-
-- BUG_ON(pObj->MLMEThr_task == NULL);
-- CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task))
-+ CHECK_PID_LEGALITY(pObj->MLMEThr_pid)
- {
-- printk(KERN_DEBUG "Terminate the MLMEThr pid=%d!\n",
-- pid_nr(task_pid(pObj->MLMEThr_task)));
-+ printk("Terminate the MLMEThr_pid=%d!\n", GET_PID_NUMBER(pObj->MLMEThr_pid));
- mb();
- pAd->mlme_kill = 1;
- //RT28XX_MLME_HANDLER(pAd);
- mb();
-- kthread_stop(pObj->MLMEThr_task);
-- pObj->MLMEThr_task = NULL;
-+ ret = KILL_THREAD_PID(pObj->MLMEThr_pid, SIGTERM, 1);
-+ if (ret)
-+ {
-+ printk (KERN_WARNING "%s: unable to Mlme thread, pid=%d, ret=%d!\n",
-+ pAd->net_dev->name, GET_PID_NUMBER(pObj->MLMEThr_pid), ret);
-+ }
-+ else
-+ {
-+ //wait_for_completion (&pAd->notify);
-+ wait_for_completion (&pAd->mlmeComplete);
-+ pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
-+ }
- }
-
-- BUG_ON(pObj->RTUSBCmdThr_task == NULL);
-- CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))
-+ CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)
- {
-- printk(KERN_DEBUG "Terminate the RTUSBCmdThr pid=%d!\n",
-- pid_nr(task_pid(pObj->RTUSBCmdThr_task)));
-+ printk("Terminate the RTUSBCmdThr_pid=%d!\n", GET_PID_NUMBER(pObj->RTUSBCmdThr_pid));
- mb();
- NdisAcquireSpinLock(&pAd->CmdQLock);
- pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED;
- NdisReleaseSpinLock(&pAd->CmdQLock);
- mb();
- //RTUSBCMDUp(pAd);
-- kthread_stop(pObj->RTUSBCmdThr_task);
-- pObj->RTUSBCmdThr_task = NULL;
-+ ret = KILL_THREAD_PID(pObj->RTUSBCmdThr_pid, SIGTERM, 1);
-+ if (ret)
-+ {
-+ printk(KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d, ret=%d!\n",
-+ pAd->net_dev->name, GET_PID_NUMBER(pObj->RTUSBCmdThr_pid), ret);
-+ }
-+ else
-+ {
-+ //wait_for_completion (&pAd->notify);
-+ wait_for_completion (&pAd->CmdQComplete);
-+ pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
-+ }
- }
- #endif
- #ifdef RT30xx
-@@ -1045,7 +1068,7 @@ BOOLEAN RT28XXChipsetCheck(
- dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct)
- {
- #ifndef RT30xx
-- printk(KERN_DEBUG "rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
-+ printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
- #endif
- #ifdef RT30xx
- printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
---- a/drivers/staging/rt2870/common/2870_rtmp_init.c
-+++ b/drivers/staging/rt2870/common/2870_rtmp_init.c
-@@ -700,8 +700,8 @@ NDIS_STATUS AdapterBlockAllocateMemory(
- usb_dev = pObj->pUsb_Dev;
-
- #ifndef RT30xx
-- pObj->MLMEThr_task = NULL;
-- pObj->RTUSBCmdThr_task = NULL;
-+ pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
-+ pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
- #endif
- #ifdef RT30xx
- pObj->MLMEThr_pid = NULL;
-@@ -743,7 +743,7 @@ NDIS_STATUS CreateThreads(
- PRTMP_ADAPTER pAd = net_dev->ml_priv;
- POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
- #ifndef RT30xx
-- struct task_struct *tsk;
-+ pid_t pid_number = -1;
- #endif
- #ifdef RT30xx
- pid_t pid_number;
-@@ -762,10 +762,10 @@ NDIS_STATUS CreateThreads(
-
- // Creat MLME Thread
- #ifndef RT30xx
-- pObj->MLMEThr_task = NULL;
-- tsk = kthread_run(MlmeThread, pAd, "%s", pAd->net_dev->name);
--
-- if (IS_ERR(tsk)) {
-+ pObj->MLMEThr_pid= THREAD_PID_INIT_VALUE;
-+ pid_number = kernel_thread(MlmeThread, pAd, CLONE_VM);
-+ if (pid_number < 0)
-+ {
- #endif
- #ifdef RT30xx
- pObj->MLMEThr_pid = NULL;
-@@ -778,7 +778,7 @@ NDIS_STATUS CreateThreads(
- }
-
- #ifndef RT30xx
-- pObj->MLMEThr_task = tsk;
-+ pObj->MLMEThr_pid = GET_PID(pid_number);
- #endif
- #ifdef RT30xx
- pObj->MLMEThr_pid = find_get_pid(pid_number);
-@@ -788,10 +788,9 @@ NDIS_STATUS CreateThreads(
-
- // Creat Command Thread
- #ifndef RT30xx
-- pObj->RTUSBCmdThr_task = NULL;
-- tsk = kthread_run(RTUSBCmdThread, pAd, "%s", pAd->net_dev->name);
--
-- if (IS_ERR(tsk) < 0)
-+ pObj->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE;
-+ pid_number = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM);
-+ if (pid_number < 0)
- #endif
- #ifdef RT30xx
- pObj->RTUSBCmdThr_pid = NULL;
-@@ -804,7 +803,7 @@ NDIS_STATUS CreateThreads(
- }
-
- #ifndef RT30xx
-- pObj->RTUSBCmdThr_task = tsk;
-+ pObj->RTUSBCmdThr_pid = GET_PID(pid_number);
- #endif
- #ifdef RT30xx
- pObj->RTUSBCmdThr_pid = find_get_pid(pid_number);
-@@ -812,9 +811,9 @@ NDIS_STATUS CreateThreads(
- wait_for_completion(&(pAd->CmdQComplete));
-
- #ifndef RT30xx
-- pObj->TimerQThr_task = NULL;
-- tsk = kthread_run(TimerQThread, pAd, "%s", pAd->net_dev->name);
-- if (IS_ERR(tsk) < 0)
-+ pObj->TimerQThr_pid= THREAD_PID_INIT_VALUE;
-+ pid_number = kernel_thread(TimerQThread, pAd, CLONE_VM);
-+ if (pid_number < 0)
- #endif
- #ifdef RT30xx
- pObj->TimerQThr_pid = NULL;
-@@ -826,7 +825,7 @@ NDIS_STATUS CreateThreads(
- return NDIS_STATUS_FAILURE;
- }
- #ifndef RT30xx
-- pObj->TimerQThr_task = tsk;
-+ pObj->TimerQThr_pid = GET_PID(pid_number);
- #endif
- #ifdef RT30xx
- pObj->TimerQThr_pid = find_get_pid(pid_number);
---- a/drivers/staging/rt2870/common/rtusb_io.c
-+++ b/drivers/staging/rt2870/common/rtusb_io.c
-@@ -984,8 +984,7 @@ NDIS_STATUS RTUSBEnqueueCmdFromNdis(
- POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
-
- #ifndef RT30xx
-- BUG_ON(pObj->RTUSBCmdThr_task == NULL);
-- CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))
-+ CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)
- #endif
- #ifdef RT30xx
- if (pObj->RTUSBCmdThr_pid < 0)
---- a/drivers/staging/rt2870/rt2870.h
-+++ b/drivers/staging/rt2870/rt2870.h
-@@ -79,6 +79,7 @@
- { \
- {USB_DEVICE(0x148F,0x2770)}, /* Ralink */ \
- {USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */ \
-+ {USB_DEVICE(0x1737,0x0070)}, /* Linksys */ \
- {USB_DEVICE(0x148F,0x2870)}, /* Ralink */ \
- {USB_DEVICE(0x148F,0x3070)}, /* Ralink */ \
- {USB_DEVICE(0x0B05,0x1731)}, /* Asus */ \
-@@ -93,12 +94,14 @@
- {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ \
- {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ \
- {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ \
-+ {USB_DEVICE(0x2019,0xED14)}, /* Planex Communications, Inc. */ \
- {USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */ \
- {USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */ \
- {USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */ \
- {USB_DEVICE(0x14B2,0x3C07)}, /* AL */ \
- {USB_DEVICE(0x14B2,0x3C12)}, /* AL */ \
- {USB_DEVICE(0x050D,0x8053)}, /* Belkin */ \
-+ {USB_DEVICE(0x050D,0x815C)}, /* Belkin */ \
- {USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */ \
- {USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */ \
- {USB_DEVICE(0x07AA,0x002F)}, /* Corega */ \
-@@ -587,16 +590,14 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, s
- #define RTUSBMlmeUp(pAd) \
- { \
- POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \
-- BUG_ON(pObj->MLMEThr_task == NULL); \
-- CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task)) \
-+ CHECK_PID_LEGALITY(pObj->MLMEThr_pid) \
- up(&(pAd->mlme_semaphore)); \
- }
-
- #define RTUSBCMDUp(pAd) \
- { \
- POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie; \
-- BUG_ON(pObj->RTUSBCmdThr_task == NULL); \
-- CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task)) \
-+ CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid) \
- up(&(pAd->RTUSBCmd_semaphore)); \
- }
- #endif
---- a/drivers/staging/rtl8192su/ieee80211.h
-+++ b/drivers/staging/rtl8192su/ieee80211.h
-@@ -2645,7 +2645,7 @@ extern int ieee80211_encrypt_fragment(
- struct sk_buff *frag,
- int hdr_len);
-
--extern int ieee80211_xmit(struct sk_buff *skb,
-+extern int rtl8192_ieee80211_xmit(struct sk_buff *skb,
- struct net_device *dev);
- extern void ieee80211_txb_free(struct ieee80211_txb *);
-
---- a/drivers/staging/rtl8192su/ieee80211/ieee80211.h
-+++ b/drivers/staging/rtl8192su/ieee80211/ieee80211.h
-@@ -2645,7 +2645,7 @@ extern int ieee80211_encrypt_fragment(
- struct sk_buff *frag,
- int hdr_len);
-
--extern int ieee80211_xmit(struct sk_buff *skb,
-+extern int rtl8192_ieee80211_xmit(struct sk_buff *skb,
- struct net_device *dev);
- extern void ieee80211_txb_free(struct ieee80211_txb *);
-
---- a/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c
-+++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_tx.c
-@@ -618,7 +618,7 @@ void ieee80211_query_seqnum(struct ieee8
- }
- }
-
--int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
-+int rtl8192_ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
- {
- #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
- struct ieee80211_device *ieee = netdev_priv(dev);
-@@ -943,5 +943,6 @@ int ieee80211_xmit(struct sk_buff *skb,
- return 1;
-
- }
-+EXPORT_SYMBOL(rtl8192_ieee80211_xmit);
-
- EXPORT_SYMBOL(ieee80211_txb_free);
---- a/drivers/staging/rtl8192su/r8192U_core.c
-+++ b/drivers/staging/rtl8192su/r8192U_core.c
-@@ -12142,7 +12142,7 @@ static const struct net_device_ops rtl81
- .ndo_set_mac_address = r8192_set_mac_adr,
- .ndo_validate_addr = eth_validate_addr,
- .ndo_change_mtu = eth_change_mtu,
-- .ndo_start_xmit = ieee80211_xmit,
-+ .ndo_start_xmit = rtl8192_ieee80211_xmit,
- };
-
- #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
---- a/drivers/usb/class/cdc-acm.c
-+++ b/drivers/usb/class/cdc-acm.c
-@@ -387,7 +387,6 @@ static void acm_rx_tasklet(unsigned long
- struct acm_ru *rcv;
- unsigned long flags;
- unsigned char throttled;
-- struct usb_host_endpoint *ep;
-
- dbg("Entering acm_rx_tasklet");
-
-@@ -463,14 +462,12 @@ urbs:
-
- rcv->buffer = buf;
-
-- ep = (usb_pipein(acm->rx_endpoint) ? acm->dev->ep_in : acm->dev->ep_out)
-- [usb_pipeendpoint(acm->rx_endpoint)];
-- if (usb_endpoint_xfer_int(&ep->desc))
-+ if (acm->is_int_ep)
- usb_fill_int_urb(rcv->urb, acm->dev,
- acm->rx_endpoint,
- buf->base,
- acm->readsize,
-- acm_read_bulk, rcv, ep->desc.bInterval);
-+ acm_read_bulk, rcv, acm->bInterval);
- else
- usb_fill_bulk_urb(rcv->urb, acm->dev,
- acm->rx_endpoint,
-@@ -1183,6 +1180,9 @@ made_compressed_probe:
- spin_lock_init(&acm->read_lock);
- mutex_init(&acm->mutex);
- acm->rx_endpoint = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
-+ acm->is_int_ep = usb_endpoint_xfer_int(epread);
-+ if (acm->is_int_ep)
-+ acm->bInterval = epread->bInterval;
- tty_port_init(&acm->port);
- acm->port.ops = &acm_port_ops;
-
---- a/drivers/usb/class/cdc-acm.h
-+++ b/drivers/usb/class/cdc-acm.h
-@@ -126,6 +126,8 @@ struct acm {
- unsigned int ctrl_caps; /* control capabilities from the class specific header */
- unsigned int susp_count; /* number of suspended interfaces */
- int combined_interfaces:1; /* control and data collapsed */
-+ int is_int_ep:1; /* interrupt endpoints contrary to spec used */
-+ u8 bInterval;
- struct acm_wb *delayed_wb; /* write queued for a device about to be woken */
- };
-
---- a/drivers/usb/core/devio.c
-+++ b/drivers/usb/core/devio.c
-@@ -595,7 +595,7 @@ static int usbdev_open(struct inode *ino
- if (!ps)
- goto out;
-
-- ret = -ENOENT;
-+ ret = -ENODEV;
-
- /* usbdev device-node */
- if (imajor(inode) == USB_DEVICE_MAJOR)
-@@ -1321,7 +1321,8 @@ static int get_urb32(struct usbdevfs_urb
- struct usbdevfs_urb32 __user *uurb)
- {
- __u32 uptr;
-- if (get_user(kurb->type, &uurb->type) ||
-+ if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
-+ __get_user(kurb->type, &uurb->type) ||
- __get_user(kurb->endpoint, &uurb->endpoint) ||
- __get_user(kurb->status, &uurb->status) ||
- __get_user(kurb->flags, &uurb->flags) ||
-@@ -1536,8 +1537,9 @@ static int proc_ioctl_compat(struct dev_
- u32 udata;
-
- uioc = compat_ptr((long)arg);
-- if (get_user(ctrl.ifno, &uioc->ifno) ||
-- get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
-+ if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
-+ __get_user(ctrl.ifno, &uioc->ifno) ||
-+ __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
- __get_user(udata, &uioc->data))
- return -EFAULT;
- ctrl.data = compat_ptr(udata);
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -903,7 +903,8 @@ static int ehci_urb_dequeue(struct usb_h
- /* already started */
- break;
- case QH_STATE_IDLE:
-- WARN_ON(1);
-+ /* QH might be waiting for a Clear-TT-Buffer */
-+ qh_completions(ehci, qh);
- break;
- }
- break;
---- a/drivers/usb/host/ehci-q.c
-+++ b/drivers/usb/host/ehci-q.c
-@@ -375,12 +375,11 @@ qh_completions (struct ehci_hcd *ehci, s
- */
- if ((token & QTD_STS_XACT) &&
- QTD_CERR(token) == 0 &&
-- --qh->xacterrs > 0 &&
-+ ++qh->xacterrs < QH_XACTERR_MAX &&
- !urb->unlinked) {
- ehci_dbg(ehci,
- "detected XactErr len %zu/%zu retry %d\n",
-- qtd->length - QTD_LENGTH(token), qtd->length,
-- QH_XACTERR_MAX - qh->xacterrs);
-+ qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs);
-
- /* reset the token in the qtd and the
- * qh overlay (which still contains
-@@ -494,7 +493,7 @@ halt:
- last = qtd;
-
- /* reinit the xacterr counter for the next qtd */
-- qh->xacterrs = QH_XACTERR_MAX;
-+ qh->xacterrs = 0;
- }
-
- /* last urb's completion might still need calling */
-@@ -940,7 +939,8 @@ static void qh_link_async (struct ehci_h
- head->qh_next.qh = qh;
- head->hw_next = dma;
-
-- qh->xacterrs = QH_XACTERR_MAX;
-+ qh_get(qh);
-+ qh->xacterrs = 0;
- qh->qh_state = QH_STATE_LINKED;
- /* qtd completions reported later by interrupt */
- }
-@@ -1080,7 +1080,7 @@ submit_async (
- * the HC and TT handle it when the TT has a buffer ready.
- */
- if (likely (qh->qh_state == QH_STATE_IDLE))
-- qh_link_async (ehci, qh_get (qh));
-+ qh_link_async(ehci, qh);
- done:
- spin_unlock_irqrestore (&ehci->lock, flags);
- if (unlikely (qh == NULL))
-@@ -1115,8 +1115,6 @@ static void end_unlink_async (struct ehc
- && HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
- qh_link_async (ehci, qh);
- else {
-- qh_put (qh); // refcount from async list
--
- /* it's not free to turn the async schedule on/off; leave it
- * active but idle for a while once it empties.
- */
-@@ -1124,6 +1122,7 @@ static void end_unlink_async (struct ehc
- && ehci->async->qh_next.qh == NULL)
- timer_action (ehci, TIMER_ASYNC_OFF);
- }
-+ qh_put(qh); /* refcount from async list */
-
- if (next) {
- ehci->reclaim = NULL;
---- a/drivers/usb/host/ehci-sched.c
-+++ b/drivers/usb/host/ehci-sched.c
-@@ -542,6 +542,7 @@ static int qh_link_periodic (struct ehci
- }
- }
- qh->qh_state = QH_STATE_LINKED;
-+ qh->xacterrs = 0;
- qh_get (qh);
-
- /* update per-qh bandwidth for usbfs */
---- a/drivers/usb/musb/Kconfig
-+++ b/drivers/usb/musb/Kconfig
-@@ -12,6 +12,7 @@ config USB_MUSB_HDRC
- depends on !SUPERH
- select NOP_USB_XCEIV if ARCH_DAVINCI
- select TWL4030_USB if MACH_OMAP_3430SDP
-+ select NOP_USB_XCEIV if MACH_OMAP3EVM
- select USB_OTG_UTILS
- tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)'
- help
---- a/drivers/usb/serial/ftdi_sio.c
-+++ b/drivers/usb/serial/ftdi_sio.c
-@@ -699,6 +699,9 @@ static struct usb_device_id id_table_com
- .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
- { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
- { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
-+ { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
-+ { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
-+ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
- { }, /* Optional parameter entry */
- { } /* Terminating entry */
- };
---- a/drivers/usb/serial/ftdi_sio.h
-+++ b/drivers/usb/serial/ftdi_sio.h
-@@ -954,6 +954,20 @@
- #define AURICAL_USB_PID 0x0010 /* Aurical USB Audiometer */
-
- /*
-+ * Bayer Ascensia Contour blood glucose meter USB-converter cable.
-+ * http://winglucofacts.com/cables/
-+ */
-+#define BAYER_VID 0x1A79
-+#define BAYER_CONTOUR_CABLE_PID 0x6001
-+
-+/*
-+ * Marvell OpenRD Base, Client
-+ * http://www.open-rd.org
-+ * OpenRD Base, Client use VID 0x0403
-+ */
-+#define MARVELL_OPENRD_PID 0x9e90
-+
-+/*
- * BmRequestType: 1100 0000b
- * bRequest: FTDI_E2_READ
- * wValue: 0
---- a/drivers/usb/serial/pl2303.c
-+++ b/drivers/usb/serial/pl2303.c
-@@ -95,6 +95,7 @@ static struct usb_device_id id_table []
- { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
- { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
- { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
-+ { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
- { } /* Terminating entry */
- };
-
---- a/drivers/usb/serial/pl2303.h
-+++ b/drivers/usb/serial/pl2303.h
-@@ -126,3 +126,7 @@
- /* Cressi Edy (diving computer) PC interface */
- #define CRESSI_VENDOR_ID 0x04b8
- #define CRESSI_EDY_PRODUCT_ID 0x0521
-+
-+/* Sony, USB data cable for CMD-Jxx mobile phones */
-+#define SONY_VENDOR_ID 0x054c
-+#define SONY_QN3USB_PRODUCT_ID 0x0437
---- a/drivers/usb/storage/unusual_devs.h
-+++ b/drivers/usb/storage/unusual_devs.h
-@@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0
- US_SC_DEVICE, US_PR_DEVICE, NULL,
- US_FL_FIX_CAPACITY ),
-
-+/* Reported by Rogerio Brito <rbrito@ime.usp.br> */
-+UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
-+ "Prolific Technology, Inc.",
-+ "Mass Storage Device",
-+ US_SC_DEVICE, US_PR_DEVICE, NULL,
-+ US_FL_NOT_LOCKABLE ),
-+
- /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
- /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
- * Thomas Bartosik <tbartdev@gmx-topmail.de> */
---- a/drivers/video/console/fbcon.c
-+++ b/drivers/video/console/fbcon.c
-@@ -1082,7 +1082,6 @@ static void fbcon_init(struct vc_data *v
- new_rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
- new_cols /= vc->vc_font.width;
- new_rows /= vc->vc_font.height;
-- vc_resize(vc, new_cols, new_rows);
-
- /*
- * We must always set the mode. The mode of the previous console
-@@ -1111,10 +1110,11 @@ static void fbcon_init(struct vc_data *v
- * vc_{cols,rows}, but we must not set those if we are only
- * resizing the console.
- */
-- if (!init) {
-+ if (init) {
- vc->vc_cols = new_cols;
- vc->vc_rows = new_rows;
-- }
-+ } else
-+ vc_resize(vc, new_cols, new_rows);
-
- if (logo)
- fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
---- a/drivers/video/console/fbcon_rotate.h
-+++ b/drivers/video/console/fbcon_rotate.h
-@@ -45,7 +45,7 @@ static inline void rotate_ud(const char
- width = (width + 7) & ~7;
-
- for (i = 0; i < height; i++) {
-- for (j = 0; j < width; j++) {
-+ for (j = 0; j < width - shift; j++) {
- if (pattern_test_bit(j, i, width, in))
- pattern_set_bit(width - (1 + j + shift),
- height - (1 + i),
---- a/drivers/video/mx3fb.c
-+++ b/drivers/video/mx3fb.c
-@@ -669,7 +669,8 @@ static uint32_t bpp_to_pixfmt(int bpp)
- }
-
- static int mx3fb_blank(int blank, struct fb_info *fbi);
--static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len);
-+static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len,
-+ bool lock);
- static int mx3fb_unmap_video_memory(struct fb_info *fbi);
-
- /**
-@@ -711,12 +712,7 @@ static void mx3fb_dma_done(void *arg)
- complete(&mx3_fbi->flip_cmpl);
- }
-
--/**
-- * mx3fb_set_par() - set framebuffer parameters and change the operating mode.
-- * @fbi: framebuffer information pointer.
-- * @return: 0 on success or negative error code on failure.
-- */
--static int mx3fb_set_par(struct fb_info *fbi)
-+static int __set_par(struct fb_info *fbi, bool lock)
- {
- u32 mem_len;
- struct ipu_di_signal_cfg sig_cfg;
-@@ -727,10 +723,6 @@ static int mx3fb_set_par(struct fb_info
- struct idmac_video_param *video = &ichan->params.video;
- struct scatterlist *sg = mx3_fbi->sg;
-
-- dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+');
--
-- mutex_lock(&mx3_fbi->mutex);
--
- /* Total cleanup */
- if (mx3_fbi->txd)
- sdc_disable_channel(mx3_fbi);
-@@ -742,10 +734,8 @@ static int mx3fb_set_par(struct fb_info
- if (fbi->fix.smem_start)
- mx3fb_unmap_video_memory(fbi);
-
-- if (mx3fb_map_video_memory(fbi, mem_len) < 0) {
-- mutex_unlock(&mx3_fbi->mutex);
-+ if (mx3fb_map_video_memory(fbi, mem_len, lock) < 0)
- return -ENOMEM;
-- }
- }
-
- sg_init_table(&sg[0], 1);
-@@ -791,7 +781,6 @@ static int mx3fb_set_par(struct fb_info
- fbi->var.vsync_len,
- fbi->var.lower_margin +
- fbi->var.vsync_len, sig_cfg) != 0) {
-- mutex_unlock(&mx3_fbi->mutex);
- dev_err(fbi->device,
- "mx3fb: Error initializing panel.\n");
- return -EINVAL;
-@@ -810,9 +799,30 @@ static int mx3fb_set_par(struct fb_info
- if (mx3_fbi->blank == FB_BLANK_UNBLANK)
- sdc_enable_channel(mx3_fbi);
-
-+ return 0;
-+}
-+
-+/**
-+ * mx3fb_set_par() - set framebuffer parameters and change the operating mode.
-+ * @fbi: framebuffer information pointer.
-+ * @return: 0 on success or negative error code on failure.
-+ */
-+static int mx3fb_set_par(struct fb_info *fbi)
-+{
-+ struct mx3fb_info *mx3_fbi = fbi->par;
-+ struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
-+ struct idmac_channel *ichan = mx3_fbi->idmac_channel;
-+ int ret;
-+
-+ dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+');
-+
-+ mutex_lock(&mx3_fbi->mutex);
-+
-+ ret = __set_par(fbi, true);
-+
- mutex_unlock(&mx3_fbi->mutex);
-
-- return 0;
-+ return ret;
- }
-
- /**
-@@ -966,21 +976,11 @@ static int mx3fb_setcolreg(unsigned int
- return ret;
- }
-
--/**
-- * mx3fb_blank() - blank the display.
-- */
--static int mx3fb_blank(int blank, struct fb_info *fbi)
-+static void __blank(int blank, struct fb_info *fbi)
- {
- struct mx3fb_info *mx3_fbi = fbi->par;
- struct mx3fb_data *mx3fb = mx3_fbi->mx3fb;
-
-- dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__,
-- blank, fbi->screen_base, fbi->fix.smem_len);
--
-- if (mx3_fbi->blank == blank)
-- return 0;
--
-- mutex_lock(&mx3_fbi->mutex);
- mx3_fbi->blank = blank;
-
- switch (blank) {
-@@ -999,6 +999,23 @@ static int mx3fb_blank(int blank, struct
- sdc_set_brightness(mx3fb, mx3fb->backlight_level);
- break;
- }
-+}
-+
-+/**
-+ * mx3fb_blank() - blank the display.
-+ */
-+static int mx3fb_blank(int blank, struct fb_info *fbi)
-+{
-+ struct mx3fb_info *mx3_fbi = fbi->par;
-+
-+ dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__,
-+ blank, fbi->screen_base, fbi->fix.smem_len);
-+
-+ if (mx3_fbi->blank == blank)
-+ return 0;
-+
-+ mutex_lock(&mx3_fbi->mutex);
-+ __blank(blank, fbi);
- mutex_unlock(&mx3_fbi->mutex);
-
- return 0;
-@@ -1198,6 +1215,7 @@ static int mx3fb_resume(struct platform_
- * mx3fb_map_video_memory() - allocates the DRAM memory for the frame buffer.
- * @fbi: framebuffer information pointer
- * @mem_len: length of mapped memory
-+ * @lock: do not lock during initialisation
- * @return: Error code indicating success or failure
- *
- * This buffer is remapped into a non-cached, non-buffered, memory region to
-@@ -1205,7 +1223,8 @@ static int mx3fb_resume(struct platform_
- * area is remapped, all virtual memory access to the video memory should occur
- * at the new region.
- */
--static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len)
-+static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len,
-+ bool lock)
- {
- int retval = 0;
- dma_addr_t addr;
-@@ -1221,10 +1240,12 @@ static int mx3fb_map_video_memory(struct
- goto err0;
- }
-
-- mutex_lock(&fbi->mm_lock);
-+ if (lock)
-+ mutex_lock(&fbi->mm_lock);
- fbi->fix.smem_start = addr;
- fbi->fix.smem_len = mem_len;
-- mutex_unlock(&fbi->mm_lock);
-+ if (lock)
-+ mutex_unlock(&fbi->mm_lock);
-
- dev_dbg(fbi->device, "allocated fb @ p=0x%08x, v=0x%p, size=%d.\n",
- (uint32_t) fbi->fix.smem_start, fbi->screen_base, fbi->fix.smem_len);
-@@ -1365,6 +1386,11 @@ static int init_fb_chan(struct mx3fb_dat
- init_completion(&mx3fbi->flip_cmpl);
- disable_irq(ichan->eof_irq);
- dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq);
-+ ret = __set_par(fbi, false);
-+ if (ret < 0)
-+ goto esetpar;
-+
-+ __blank(FB_BLANK_UNBLANK, fbi);
-
- dev_info(dev, "registered, using mode %s\n", fb_mode);
-
---- a/drivers/video/via/hw.c
-+++ b/drivers/video/via/hw.c
-@@ -2407,14 +2407,14 @@ int viafb_setmode(int vmode_index, int h
- viafb_dvi_set_mode(viafb_get_mode_index
- (viaparinfo->tmds_setting_info->h_active,
- viaparinfo->tmds_setting_info->
-- v_active, 1),
-+ v_active),
- video_bpp1, viaparinfo->
- tmds_setting_info->iga_path);
- } else {
- viafb_dvi_set_mode(viafb_get_mode_index
- (viaparinfo->tmds_setting_info->h_active,
- viaparinfo->
-- tmds_setting_info->v_active, 0),
-+ tmds_setting_info->v_active),
- video_bpp, viaparinfo->
- tmds_setting_info->iga_path);
- }
---- a/drivers/video/via/lcd.c
-+++ b/drivers/video/via/lcd.c
-@@ -580,10 +580,7 @@ static void load_lcd_k400_patch_tbl(int
- int reg_num = 0;
- struct io_reg *lcd_patch_reg = NULL;
-
-- if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-- else
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
-+ vmode_index = viafb_get_mode_index(set_hres, set_vres);
- switch (panel_id) {
- /* LCD 800x600 */
- case LCD_PANEL_ID1_800X600:
-@@ -761,10 +758,7 @@ static void load_lcd_p880_patch_tbl(int
- int reg_num = 0;
- struct io_reg *lcd_patch_reg = NULL;
-
-- if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-- else
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
-+ vmode_index = viafb_get_mode_index(set_hres, set_vres);
-
- switch (panel_id) {
- case LCD_PANEL_ID5_1400X1050:
-@@ -832,10 +826,7 @@ static void load_lcd_patch_regs(int set_
- {
- int vmode_index;
-
-- if (viaparinfo->lvds_setting_info->iga_path == IGA2)
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 1);
-- else
-- vmode_index = viafb_get_mode_index(set_hres, set_vres, 0);
-+ vmode_index = viafb_get_mode_index(set_hres, set_vres);
-
- viafb_unlock_crt();
-
---- a/drivers/video/via/viafbdev.c
-+++ b/drivers/video/via/viafbdev.c
-@@ -32,7 +32,6 @@ static u32 pseudo_pal[17];
- /* video mode */
- static char *viafb_mode = "640x480";
- static char *viafb_mode1 = "640x480";
--static int viafb_resMode = VIA_RES_640X480;
-
- /* Added for specifying active devices.*/
- char *viafb_active_dev = "";
-@@ -56,47 +55,47 @@ static void viafb_get_video_device(u32 *
-
- /* Mode information */
- static const struct viafb_modeinfo viafb_modentry[] = {
-- {480, 640, VIA_RES_480X640, "480x640"},
-- {640, 480, VIA_RES_640X480, "640x480"},
-- {800, 480, VIA_RES_800X480, "800x480"},
-- {800, 600, VIA_RES_800X600, "800x600"},
-- {1024, 768, VIA_RES_1024X768, "1024x768"},
-- {1152, 864, VIA_RES_1152X864, "1152x864"},
-- {1280, 1024, VIA_RES_1280X1024, "1280x1024"},
-- {1600, 1200, VIA_RES_1600X1200, "1600x1200"},
-- {1440, 1050, VIA_RES_1440X1050, "1440x1050"},
-- {1280, 768, VIA_RES_1280X768, "1280x768"},
-- {1280, 800, VIA_RES_1280X800, "1280x800"},
-- {1280, 960, VIA_RES_1280X960, "1280x960"},
-- {1920, 1440, VIA_RES_1920X1440, "1920x1440"},
-- {848, 480, VIA_RES_848X480, "848x480"},
-- {1400, 1050, VIA_RES_1400X1050, "1400x1050"},
-- {720, 480, VIA_RES_720X480, "720x480"},
-- {720, 576, VIA_RES_720X576, "720x576"},
-- {1024, 512, VIA_RES_1024X512, "1024x512"},
-- {1024, 576, VIA_RES_1024X576, "1024x576"},
-- {1024, 600, VIA_RES_1024X600, "1024x600"},
-- {1280, 720, VIA_RES_1280X720, "1280x720"},
-- {1920, 1080, VIA_RES_1920X1080, "1920x1080"},
-- {1366, 768, VIA_RES_1368X768, "1368x768"},
-- {1680, 1050, VIA_RES_1680X1050, "1680x1050"},
-- {960, 600, VIA_RES_960X600, "960x600"},
-- {1000, 600, VIA_RES_1000X600, "1000x600"},
-- {1024, 576, VIA_RES_1024X576, "1024x576"},
-- {1024, 600, VIA_RES_1024X600, "1024x600"},
-- {1088, 612, VIA_RES_1088X612, "1088x612"},
-- {1152, 720, VIA_RES_1152X720, "1152x720"},
-- {1200, 720, VIA_RES_1200X720, "1200x720"},
-- {1280, 600, VIA_RES_1280X600, "1280x600"},
-- {1360, 768, VIA_RES_1360X768, "1360x768"},
-- {1440, 900, VIA_RES_1440X900, "1440x900"},
-- {1600, 900, VIA_RES_1600X900, "1600x900"},
-- {1600, 1024, VIA_RES_1600X1024, "1600x1024"},
-- {1792, 1344, VIA_RES_1792X1344, "1792x1344"},
-- {1856, 1392, VIA_RES_1856X1392, "1856x1392"},
-- {1920, 1200, VIA_RES_1920X1200, "1920x1200"},
-- {2048, 1536, VIA_RES_2048X1536, "2048x1536"},
-- {0, 0, VIA_RES_INVALID, "640x480"}
-+ {480, 640, VIA_RES_480X640},
-+ {640, 480, VIA_RES_640X480},
-+ {800, 480, VIA_RES_800X480},
-+ {800, 600, VIA_RES_800X600},
-+ {1024, 768, VIA_RES_1024X768},
-+ {1152, 864, VIA_RES_1152X864},
-+ {1280, 1024, VIA_RES_1280X1024},
-+ {1600, 1200, VIA_RES_1600X1200},
-+ {1440, 1050, VIA_RES_1440X1050},
-+ {1280, 768, VIA_RES_1280X768,},
-+ {1280, 800, VIA_RES_1280X800},
-+ {1280, 960, VIA_RES_1280X960},
-+ {1920, 1440, VIA_RES_1920X1440},
-+ {848, 480, VIA_RES_848X480},
-+ {1400, 1050, VIA_RES_1400X1050},
-+ {720, 480, VIA_RES_720X480},
-+ {720, 576, VIA_RES_720X576},
-+ {1024, 512, VIA_RES_1024X512},
-+ {1024, 576, VIA_RES_1024X576},
-+ {1024, 600, VIA_RES_1024X600},
-+ {1280, 720, VIA_RES_1280X720},
-+ {1920, 1080, VIA_RES_1920X1080},
-+ {1366, 768, VIA_RES_1368X768},
-+ {1680, 1050, VIA_RES_1680X1050},
-+ {960, 600, VIA_RES_960X600},
-+ {1000, 600, VIA_RES_1000X600},
-+ {1024, 576, VIA_RES_1024X576},
-+ {1024, 600, VIA_RES_1024X600},
-+ {1088, 612, VIA_RES_1088X612},
-+ {1152, 720, VIA_RES_1152X720},
-+ {1200, 720, VIA_RES_1200X720},
-+ {1280, 600, VIA_RES_1280X600},
-+ {1360, 768, VIA_RES_1360X768},
-+ {1440, 900, VIA_RES_1440X900},
-+ {1600, 900, VIA_RES_1600X900},
-+ {1600, 1024, VIA_RES_1600X1024},
-+ {1792, 1344, VIA_RES_1792X1344},
-+ {1856, 1392, VIA_RES_1856X1392},
-+ {1920, 1200, VIA_RES_1920X1200},
-+ {2048, 1536, VIA_RES_2048X1536},
-+ {0, 0, VIA_RES_INVALID}
- };
-
- static struct fb_ops viafb_ops;
-@@ -177,7 +176,7 @@ static int viafb_check_var(struct fb_var
- if (var->vmode & FB_VMODE_INTERLACED || var->vmode & FB_VMODE_DOUBLE)
- return -EINVAL;
-
-- vmode_index = viafb_get_mode_index(var->xres, var->yres, 0);
-+ vmode_index = viafb_get_mode_index(var->xres, var->yres);
- if (vmode_index == VIA_RES_INVALID) {
- DEBUG_MSG(KERN_INFO
- "viafb: Mode %dx%dx%d not supported!!\n",
-@@ -233,14 +232,14 @@ static int viafb_set_par(struct fb_info
- viafb_update_device_setting(info->var.xres, info->var.yres,
- info->var.bits_per_pixel, viafb_refresh, 0);
-
-- vmode_index = viafb_get_mode_index(info->var.xres, info->var.yres, 0);
-+ vmode_index = viafb_get_mode_index(info->var.xres, info->var.yres);
-
- if (viafb_SAMM_ON == 1) {
- DEBUG_MSG(KERN_INFO
- "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
- viafb_second_xres, viafb_second_yres, viafb_bpp1);
- vmode_index1 = viafb_get_mode_index(viafb_second_xres,
-- viafb_second_yres, 1);
-+ viafb_second_yres);
- DEBUG_MSG(KERN_INFO "->viafb_SAMM_ON: index=%d\n",
- vmode_index1);
-
-@@ -1262,7 +1261,7 @@ static int viafb_sync(struct fb_info *in
- return 0;
- }
-
--int viafb_get_mode_index(int hres, int vres, int flag)
-+int viafb_get_mode_index(int hres, int vres)
- {
- u32 i;
- DEBUG_MSG(KERN_INFO "viafb_get_mode_index!\n");
-@@ -1272,13 +1271,7 @@ int viafb_get_mode_index(int hres, int v
- viafb_modentry[i].yres == vres)
- break;
-
-- viafb_resMode = viafb_modentry[i].mode_index;
-- if (flag)
-- viafb_mode1 = viafb_modentry[i].mode_res;
-- else
-- viafb_mode = viafb_modentry[i].mode_res;
--
-- return viafb_resMode;
-+ return viafb_modentry[i].mode_index;
- }
-
- static void check_available_device_to_enable(int device_id)
-@@ -2199,7 +2192,7 @@ static int __devinit via_pci_probe(void)
- strict_strtoul(tmpc, 0, &default_xres);
- strict_strtoul(tmpm, 0, &default_yres);
-
-- vmode_index = viafb_get_mode_index(default_xres, default_yres, 0);
-+ vmode_index = viafb_get_mode_index(default_xres, default_yres);
- DEBUG_MSG(KERN_INFO "0->index=%d\n", vmode_index);
-
- if (viafb_SAMM_ON == 1) {
---- a/drivers/video/via/viafbdev.h
-+++ b/drivers/video/via/viafbdev.h
-@@ -81,7 +81,6 @@ struct viafb_modeinfo {
- u32 xres;
- u32 yres;
- int mode_index;
-- char *mode_res;
- };
- extern unsigned int viafb_second_virtual_yres;
- extern unsigned int viafb_second_virtual_xres;
-@@ -102,7 +101,7 @@ extern int strict_strtoul(const char *cp
- void viafb_memory_pitch_patch(struct fb_info *info);
- void viafb_fill_var_timing_info(struct fb_var_screeninfo *var, int refresh,
- int mode_index);
--int viafb_get_mode_index(int hres, int vres, int flag);
-+int viafb_get_mode_index(int hres, int vres);
- u8 viafb_gpio_i2c_read_lvds(struct lvds_setting_information
- *plvds_setting_info, struct lvds_chip_information
- *plvds_chip_info, u8 index);
---- a/drivers/w1/masters/omap_hdq.c
-+++ b/drivers/w1/masters/omap_hdq.c
-@@ -687,6 +687,7 @@ static int omap_hdq_remove(struct platfo
-
- if (hdq_data->hdq_usecount) {
- dev_dbg(&pdev->dev, "removed when use count is not zero\n");
-+ mutex_unlock(&hdq_data->hdq_mutex);
- return -EBUSY;
- }
-
---- a/drivers/watchdog/ks8695_wdt.c
-+++ b/drivers/watchdog/ks8695_wdt.c
-@@ -66,7 +66,7 @@ static inline void ks8695_wdt_stop(void)
- static inline void ks8695_wdt_start(void)
- {
- unsigned long tmcon;
-- unsigned long tval = wdt_time * CLOCK_TICK_RATE;
-+ unsigned long tval = wdt_time * KS8695_CLOCK_RATE;
-
- spin_lock(&ks8695_lock);
- /* disable timer0 */
-@@ -103,7 +103,7 @@ static inline void ks8695_wdt_reload(voi
- static int ks8695_wdt_settimeout(int new_time)
- {
- /*
-- * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz
-+ * All counting occurs at KS8695_CLOCK_RATE / 128 = 0.256 Hz
- *
- * Since WDV is a 16-bit counter, the maximum period is
- * 65536 / 0.256 = 256 seconds.
---- a/fs/binfmt_flat.c
-+++ b/fs/binfmt_flat.c
-@@ -828,15 +828,22 @@ static int load_flat_shared_library(int
- if (IS_ERR(bprm.file))
- return res;
-
-+ bprm.cred = prepare_exec_creds();
-+ res = -ENOMEM;
-+ if (!bprm.cred)
-+ goto out;
-+
- res = prepare_binprm(&bprm);
-
- if (res <= (unsigned long)-4096)
- res = load_flat_file(&bprm, libs, id, NULL);
-- if (bprm.file) {
-- allow_write_access(bprm.file);
-- fput(bprm.file);
-- bprm.file = NULL;
-- }
-+
-+ abort_creds(bprm.cred);
-+
-+out:
-+ allow_write_access(bprm.file);
-+ fput(bprm.file);
-+
- return(res);
- }
-
---- a/fs/btrfs/extent-tree.c
-+++ b/fs/btrfs/extent-tree.c
-@@ -265,10 +265,6 @@ static int caching_kthread(void *data)
-
- atomic_inc(&block_group->space_info->caching_threads);
- last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET);
--again:
-- /* need to make sure the commit_root doesn't disappear */
-- down_read(&fs_info->extent_commit_sem);
--
- /*
- * We don't want to deadlock with somebody trying to allocate a new
- * extent for the extent root while also trying to search the extent
-@@ -282,6 +278,10 @@ again:
- key.objectid = last;
- key.offset = 0;
- btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY);
-+again:
-+ /* need to make sure the commit_root doesn't disappear */
-+ down_read(&fs_info->extent_commit_sem);
-+
- ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
- if (ret < 0)
- goto err;
-@@ -304,6 +304,19 @@ again:
-
- if (need_resched() ||
- btrfs_transaction_in_commit(fs_info)) {
-+ leaf = path->nodes[0];
-+
-+ /* this shouldn't happen, but if the
-+ * leaf is empty just move on.
-+ */
-+ if (btrfs_header_nritems(leaf) == 0)
-+ break;
-+ /*
-+ * we need to copy the key out so that
-+ * we are sure the next search advances
-+ * us forward in the btree.
-+ */
-+ btrfs_item_key_to_cpu(leaf, &key, 0);
- btrfs_release_path(fs_info->extent_root, path);
- up_read(&fs_info->extent_commit_sem);
- schedule_timeout(1);
---- a/fs/btrfs/free-space-cache.c
-+++ b/fs/btrfs/free-space-cache.c
-@@ -414,11 +414,29 @@ static noinline int remove_from_bitmap(s
- u64 *offset, u64 *bytes)
- {
- u64 end;
-+ u64 search_start, search_bytes;
-+ int ret;
-
- again:
- end = bitmap_info->offset +
- (u64)(BITS_PER_BITMAP * block_group->sectorsize) - 1;
-
-+ /*
-+ * XXX - this can go away after a few releases.
-+ *
-+ * since the only user of btrfs_remove_free_space is the tree logging
-+ * stuff, and the only way to test that is under crash conditions, we
-+ * want to have this debug stuff here just in case somethings not
-+ * working. Search the bitmap for the space we are trying to use to
-+ * make sure its actually there. If its not there then we need to stop
-+ * because something has gone wrong.
-+ */
-+ search_start = *offset;
-+ search_bytes = *bytes;
-+ ret = search_bitmap(block_group, bitmap_info, &search_start,
-+ &search_bytes);
-+ BUG_ON(ret < 0 || search_start != *offset);
-+
- if (*offset > bitmap_info->offset && *offset + *bytes > end) {
- bitmap_clear_bits(block_group, bitmap_info, *offset,
- end - *offset + 1);
-@@ -430,6 +448,7 @@ again:
- }
-
- if (*bytes) {
-+ struct rb_node *next = rb_next(&bitmap_info->offset_index);
- if (!bitmap_info->bytes) {
- unlink_free_space(block_group, bitmap_info);
- kfree(bitmap_info->bitmap);
-@@ -438,16 +457,36 @@ again:
- recalculate_thresholds(block_group);
- }
-
-- bitmap_info = tree_search_offset(block_group,
-- offset_to_bitmap(block_group,
-- *offset),
-- 1, 0);
-- if (!bitmap_info)
-+ /*
-+ * no entry after this bitmap, but we still have bytes to
-+ * remove, so something has gone wrong.
-+ */
-+ if (!next)
- return -EINVAL;
-
-+ bitmap_info = rb_entry(next, struct btrfs_free_space,
-+ offset_index);
-+
-+ /*
-+ * if the next entry isn't a bitmap we need to return to let the
-+ * extent stuff do its work.
-+ */
- if (!bitmap_info->bitmap)
- return -EAGAIN;
-
-+ /*
-+ * Ok the next item is a bitmap, but it may not actually hold
-+ * the information for the rest of this free space stuff, so
-+ * look for it, and if we don't find it return so we can try
-+ * everything over again.
-+ */
-+ search_start = *offset;
-+ search_bytes = *bytes;
-+ ret = search_bitmap(block_group, bitmap_info, &search_start,
-+ &search_bytes);
-+ if (ret < 0 || search_start != *offset)
-+ return -EAGAIN;
-+
- goto again;
- } else if (!bitmap_info->bytes) {
- unlink_free_space(block_group, bitmap_info);
-@@ -644,8 +683,17 @@ int btrfs_remove_free_space(struct btrfs
- again:
- info = tree_search_offset(block_group, offset, 0, 0);
- if (!info) {
-- WARN_ON(1);
-- goto out_lock;
-+ /*
-+ * oops didn't find an extent that matched the space we wanted
-+ * to remove, look for a bitmap instead
-+ */
-+ info = tree_search_offset(block_group,
-+ offset_to_bitmap(block_group, offset),
-+ 1, 0);
-+ if (!info) {
-+ WARN_ON(1);
-+ goto out_lock;
-+ }
- }
-
- if (info->bytes < bytes && rb_next(&info->offset_index)) {
-@@ -957,8 +1005,15 @@ static u64 btrfs_alloc_from_bitmap(struc
- if (cluster->block_group != block_group)
- goto out;
-
-- entry = tree_search_offset(block_group, search_start, 0, 0);
--
-+ /*
-+ * search_start is the beginning of the bitmap, but at some point it may
-+ * be a good idea to point to the actual start of the free area in the
-+ * bitmap, so do the offset_to_bitmap trick anyway, and set bitmap_only
-+ * to 1 to make sure we get the bitmap entry
-+ */
-+ entry = tree_search_offset(block_group,
-+ offset_to_bitmap(block_group, search_start),
-+ 1, 0);
- if (!entry || !entry->bitmap)
- goto out;
-
---- a/fs/btrfs/inode.c
-+++ b/fs/btrfs/inode.c
-@@ -4785,8 +4785,7 @@ static int btrfs_rename(struct inode *ol
- * and the replacement file is large. Start IO on it now so
- * we don't add too much work to the end of the transaction
- */
-- if (new_inode && old_inode && S_ISREG(old_inode->i_mode) &&
-- new_inode->i_size &&
-+ if (new_inode && S_ISREG(old_inode->i_mode) && new_inode->i_size &&
- old_inode->i_size > BTRFS_ORDERED_OPERATIONS_FLUSH_LIMIT)
- filemap_flush(old_inode->i_mapping);
-
---- a/fs/btrfs/relocation.c
-+++ b/fs/btrfs/relocation.c
-@@ -2553,8 +2553,13 @@ int relocate_inode_pages(struct inode *i
- last_index = (start + len - 1) >> PAGE_CACHE_SHIFT;
-
- /* make sure the dirty trick played by the caller work */
-- ret = invalidate_inode_pages2_range(inode->i_mapping,
-- first_index, last_index);
-+ while (1) {
-+ ret = invalidate_inode_pages2_range(inode->i_mapping,
-+ first_index, last_index);
-+ if (ret != -EBUSY)
-+ break;
-+ schedule_timeout(HZ/10);
-+ }
- if (ret)
- goto out_unlock;
-
---- a/fs/btrfs/zlib.c
-+++ b/fs/btrfs/zlib.c
-@@ -208,7 +208,7 @@ int btrfs_zlib_compress_pages(struct add
- *total_in = 0;
-
- workspace = find_zlib_workspace();
-- if (!workspace)
-+ if (IS_ERR(workspace))
- return -1;
-
- if (Z_OK != zlib_deflateInit(&workspace->def_strm, 3)) {
-@@ -366,7 +366,7 @@ int btrfs_zlib_decompress_biovec(struct
- char *kaddr;
-
- workspace = find_zlib_workspace();
-- if (!workspace)
-+ if (IS_ERR(workspace))
- return -ENOMEM;
-
- data_in = kmap(pages_in[page_in_index]);
-@@ -547,7 +547,7 @@ int btrfs_zlib_decompress(unsigned char
- return -ENOMEM;
-
- workspace = find_zlib_workspace();
-- if (!workspace)
-+ if (IS_ERR(workspace))
- return -ENOMEM;
-
- workspace->inf_strm.next_in = data_in;
---- a/fs/compat_ioctl.c
-+++ b/fs/compat_ioctl.c
-@@ -1905,6 +1905,7 @@ COMPATIBLE_IOCTL(FIONCLEX)
- COMPATIBLE_IOCTL(FIOASYNC)
- COMPATIBLE_IOCTL(FIONBIO)
- COMPATIBLE_IOCTL(FIONREAD) /* This is also TIOCINQ */
-+COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
- /* 0x00 */
- COMPATIBLE_IOCTL(FIBMAP)
- COMPATIBLE_IOCTL(FIGETBSZ)
---- a/fs/inode.c
-+++ b/fs/inode.c
-@@ -120,12 +120,11 @@ static void wake_up_inode(struct inode *
- * These are initializations that need to be done on every inode
- * allocation as the fields are not initialised by slab allocation.
- */
--struct inode *inode_init_always(struct super_block *sb, struct inode *inode)
-+int inode_init_always(struct super_block *sb, struct inode *inode)
- {
- static const struct address_space_operations empty_aops;
- static struct inode_operations empty_iops;
- static const struct file_operations empty_fops;
--
- struct address_space *const mapping = &inode->i_data;
-
- inode->i_sb = sb;
-@@ -152,7 +151,7 @@ struct inode *inode_init_always(struct s
- inode->dirtied_when = 0;
-
- if (security_inode_alloc(inode))
-- goto out_free_inode;
-+ goto out;
-
- /* allocate and initialize an i_integrity */
- if (ima_inode_alloc(inode))
-@@ -198,16 +197,12 @@ struct inode *inode_init_always(struct s
- inode->i_fsnotify_mask = 0;
- #endif
-
-- return inode;
-+ return 0;
-
- out_free_security:
- security_inode_free(inode);
--out_free_inode:
-- if (inode->i_sb->s_op->destroy_inode)
-- inode->i_sb->s_op->destroy_inode(inode);
-- else
-- kmem_cache_free(inode_cachep, (inode));
-- return NULL;
-+out:
-+ return -ENOMEM;
- }
- EXPORT_SYMBOL(inode_init_always);
-
-@@ -220,12 +215,21 @@ static struct inode *alloc_inode(struct
- else
- inode = kmem_cache_alloc(inode_cachep, GFP_KERNEL);
-
-- if (inode)
-- return inode_init_always(sb, inode);
-- return NULL;
-+ if (!inode)
-+ return NULL;
-+
-+ if (unlikely(inode_init_always(sb, inode))) {
-+ if (inode->i_sb->s_op->destroy_inode)
-+ inode->i_sb->s_op->destroy_inode(inode);
-+ else
-+ kmem_cache_free(inode_cachep, inode);
-+ return NULL;
-+ }
-+
-+ return inode;
- }
-
--void destroy_inode(struct inode *inode)
-+void __destroy_inode(struct inode *inode)
- {
- BUG_ON(inode_has_buffers(inode));
- ima_inode_free(inode);
-@@ -237,13 +241,17 @@ void destroy_inode(struct inode *inode)
- if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED)
- posix_acl_release(inode->i_default_acl);
- #endif
-+}
-+EXPORT_SYMBOL(__destroy_inode);
-+
-+void destroy_inode(struct inode *inode)
-+{
-+ __destroy_inode(inode);
- if (inode->i_sb->s_op->destroy_inode)
- inode->i_sb->s_op->destroy_inode(inode);
- else
- kmem_cache_free(inode_cachep, (inode));
- }
--EXPORT_SYMBOL(destroy_inode);
--
-
- /*
- * These are initializations that only need to be done
---- a/fs/jffs2/file.c
-+++ b/fs/jffs2/file.c
-@@ -99,7 +99,7 @@ static int jffs2_do_readpage_nolock (str
- kunmap(pg);
-
- D2(printk(KERN_DEBUG "readpage finished\n"));
-- return 0;
-+ return ret;
- }
-
- int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg)
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -316,7 +316,8 @@ EXPORT_SYMBOL_GPL(mnt_clone_write);
- */
- int mnt_want_write_file(struct file *file)
- {
-- if (!(file->f_mode & FMODE_WRITE))
-+ struct inode *inode = file->f_dentry->d_inode;
-+ if (!(file->f_mode & FMODE_WRITE) || special_file(inode->i_mode))
- return mnt_want_write(file->f_path.mnt);
- else
- return mnt_clone_write(file->f_path.mnt);
---- a/fs/nfs/direct.c
-+++ b/fs/nfs/direct.c
-@@ -255,7 +255,7 @@ static void nfs_direct_read_release(void
-
- if (put_dreq(dreq))
- nfs_direct_complete(dreq);
-- nfs_readdata_release(calldata);
-+ nfs_readdata_free(data);
- }
-
- static const struct rpc_call_ops nfs_read_direct_ops = {
-@@ -314,14 +314,14 @@ static ssize_t nfs_direct_read_schedule_
- data->npages, 1, 0, data->pagevec, NULL);
- up_read(&current->mm->mmap_sem);
- if (result < 0) {
-- nfs_readdata_release(data);
-+ nfs_readdata_free(data);
- break;
- }
- if ((unsigned)result < data->npages) {
- bytes = result * PAGE_SIZE;
- if (bytes <= pgbase) {
- nfs_direct_release_pages(data->pagevec, result);
-- nfs_readdata_release(data);
-+ nfs_readdata_free(data);
- break;
- }
- bytes -= pgbase;
-@@ -334,7 +334,7 @@ static ssize_t nfs_direct_read_schedule_
- data->inode = inode;
- data->cred = msg.rpc_cred;
- data->args.fh = NFS_FH(inode);
-- data->args.context = get_nfs_open_context(ctx);
-+ data->args.context = ctx;
- data->args.offset = pos;
- data->args.pgbase = pgbase;
- data->args.pages = data->pagevec;
-@@ -441,7 +441,7 @@ static void nfs_direct_free_writedata(st
- struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
- list_del(&data->pages);
- nfs_direct_release_pages(data->pagevec, data->npages);
-- nfs_writedata_release(data);
-+ nfs_writedata_free(data);
- }
- }
-
-@@ -534,7 +534,7 @@ static void nfs_direct_commit_release(vo
-
- dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
- nfs_direct_write_complete(dreq, data->inode);
-- nfs_commitdata_release(calldata);
-+ nfs_commit_free(data);
- }
-
- static const struct rpc_call_ops nfs_commit_direct_ops = {
-@@ -570,7 +570,7 @@ static void nfs_direct_commit_schedule(s
- data->args.fh = NFS_FH(data->inode);
- data->args.offset = 0;
- data->args.count = 0;
-- data->args.context = get_nfs_open_context(dreq->ctx);
-+ data->args.context = dreq->ctx;
- data->res.count = 0;
- data->res.fattr = &data->fattr;
- data->res.verf = &data->verf;
-@@ -734,14 +734,14 @@ static ssize_t nfs_direct_write_schedule
- data->npages, 0, 0, data->pagevec, NULL);
- up_read(&current->mm->mmap_sem);
- if (result < 0) {
-- nfs_writedata_release(data);
-+ nfs_writedata_free(data);
- break;
- }
- if ((unsigned)result < data->npages) {
- bytes = result * PAGE_SIZE;
- if (bytes <= pgbase) {
- nfs_direct_release_pages(data->pagevec, result);
-- nfs_writedata_release(data);
-+ nfs_writedata_free(data);
- break;
- }
- bytes -= pgbase;
-@@ -756,7 +756,7 @@ static ssize_t nfs_direct_write_schedule
- data->inode = inode;
- data->cred = msg.rpc_cred;
- data->args.fh = NFS_FH(inode);
-- data->args.context = get_nfs_open_context(ctx);
-+ data->args.context = ctx;
- data->args.offset = pos;
- data->args.pgbase = pgbase;
- data->args.pages = data->pagevec;
---- a/fs/nfs/read.c
-+++ b/fs/nfs/read.c
-@@ -60,17 +60,15 @@ struct nfs_read_data *nfs_readdata_alloc
- return p;
- }
-
--static void nfs_readdata_free(struct nfs_read_data *p)
-+void nfs_readdata_free(struct nfs_read_data *p)
- {
- if (p && (p->pagevec != &p->page_array[0]))
- kfree(p->pagevec);
- mempool_free(p, nfs_rdata_mempool);
- }
-
--void nfs_readdata_release(void *data)
-+static void nfs_readdata_release(struct nfs_read_data *rdata)
- {
-- struct nfs_read_data *rdata = data;
--
- put_nfs_open_context(rdata->args.context);
- nfs_readdata_free(rdata);
- }
---- a/fs/nfs/write.c
-+++ b/fs/nfs/write.c
-@@ -87,17 +87,15 @@ struct nfs_write_data *nfs_writedata_all
- return p;
- }
-
--static void nfs_writedata_free(struct nfs_write_data *p)
-+void nfs_writedata_free(struct nfs_write_data *p)
- {
- if (p && (p->pagevec != &p->page_array[0]))
- kfree(p->pagevec);
- mempool_free(p, nfs_wdata_mempool);
- }
-
--void nfs_writedata_release(void *data)
-+static void nfs_writedata_release(struct nfs_write_data *wdata)
- {
-- struct nfs_write_data *wdata = data;
--
- put_nfs_open_context(wdata->args.context);
- nfs_writedata_free(wdata);
- }
---- a/fs/proc/base.c
-+++ b/fs/proc/base.c
-@@ -234,23 +234,20 @@ static int check_mem_permission(struct t
-
- struct mm_struct *mm_for_maps(struct task_struct *task)
- {
-- struct mm_struct *mm = get_task_mm(task);
-- if (!mm)
-+ struct mm_struct *mm;
-+
-+ if (mutex_lock_killable(&task->cred_guard_mutex))
- return NULL;
-- down_read(&mm->mmap_sem);
-- task_lock(task);
-- if (task->mm != mm)
-- goto out;
-- if (task->mm != current->mm &&
-- __ptrace_may_access(task, PTRACE_MODE_READ) < 0)
-- goto out;
-- task_unlock(task);
-+
-+ mm = get_task_mm(task);
-+ if (mm && mm != current->mm &&
-+ !ptrace_may_access(task, PTRACE_MODE_READ)) {
-+ mmput(mm);
-+ mm = NULL;
-+ }
-+ mutex_unlock(&task->cred_guard_mutex);
-+
- return mm;
--out:
-- task_unlock(task);
-- up_read(&mm->mmap_sem);
-- mmput(mm);
-- return NULL;
- }
-
- static int proc_pid_cmdline(struct task_struct *task, char * buffer)
---- a/fs/proc/task_mmu.c
-+++ b/fs/proc/task_mmu.c
-@@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m,
- mm = mm_for_maps(priv->task);
- if (!mm)
- return NULL;
-+ down_read(&mm->mmap_sem);
-
- tail_vma = get_gate_vma(priv->task);
- priv->tail_vma = tail_vma;
---- a/fs/proc/task_nommu.c
-+++ b/fs/proc/task_nommu.c
-@@ -189,6 +189,7 @@ static void *m_start(struct seq_file *m,
- priv->task = NULL;
- return NULL;
- }
-+ down_read(&mm->mmap_sem);
-
- /* start from the Nth VMA */
- for (p = rb_first(&mm->mm_rb); p; p = rb_next(p))
---- a/fs/xfs/linux-2.6/xfs_buf.c
-+++ b/fs/xfs/linux-2.6/xfs_buf.c
-@@ -770,7 +770,7 @@ xfs_buf_associate_memory(
- bp->b_pages = NULL;
- bp->b_addr = mem;
-
-- rval = _xfs_buf_get_pages(bp, page_count, 0);
-+ rval = _xfs_buf_get_pages(bp, page_count, XBF_DONT_BLOCK);
- if (rval)
- return rval;
-
---- a/fs/xfs/xfs_attr.c
-+++ b/fs/xfs/xfs_attr.c
-@@ -2010,7 +2010,9 @@ xfs_attr_rmtval_get(xfs_da_args_t *args)
- dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock);
- blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount);
- error = xfs_read_buf(mp, mp->m_ddev_targp, dblkno,
-- blkcnt, XFS_BUF_LOCK, &bp);
-+ blkcnt,
-+ XFS_BUF_LOCK | XBF_DONT_BLOCK,
-+ &bp);
- if (error)
- return(error);
-
-@@ -2141,8 +2143,8 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
- dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock),
- blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount);
-
-- bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno,
-- blkcnt, XFS_BUF_LOCK);
-+ bp = xfs_buf_get_flags(mp->m_ddev_targp, dblkno, blkcnt,
-+ XFS_BUF_LOCK | XBF_DONT_BLOCK);
- ASSERT(bp);
- ASSERT(!XFS_BUF_GETERROR(bp));
-
---- a/fs/xfs/xfs_bmap.c
-+++ b/fs/xfs/xfs_bmap.c
-@@ -6009,7 +6009,7 @@ xfs_getbmap(
- */
- error = ENOMEM;
- subnex = 16;
-- map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL);
-+ map = kmem_alloc(subnex * sizeof(*map), KM_MAYFAIL | KM_NOFS);
- if (!map)
- goto out_unlock_ilock;
-
---- a/fs/xfs/xfs_btree.c
-+++ b/fs/xfs/xfs_btree.c
-@@ -120,8 +120,8 @@ xfs_btree_check_sblock(
- XFS_RANDOM_BTREE_CHECK_SBLOCK))) {
- if (bp)
- xfs_buftrace("SBTREE ERROR", bp);
-- XFS_ERROR_REPORT("xfs_btree_check_sblock", XFS_ERRLEVEL_LOW,
-- cur->bc_mp);
-+ XFS_CORRUPTION_ERROR("xfs_btree_check_sblock",
-+ XFS_ERRLEVEL_LOW, cur->bc_mp, block);
- return XFS_ERROR(EFSCORRUPTED);
- }
- return 0;
---- a/fs/xfs/xfs_da_btree.c
-+++ b/fs/xfs/xfs_da_btree.c
-@@ -2201,7 +2201,7 @@ kmem_zone_t *xfs_dabuf_zone; /* dabuf z
- xfs_da_state_t *
- xfs_da_state_alloc(void)
- {
-- return kmem_zone_zalloc(xfs_da_state_zone, KM_SLEEP);
-+ return kmem_zone_zalloc(xfs_da_state_zone, KM_NOFS);
- }
-
- /*
-@@ -2261,9 +2261,9 @@ xfs_da_buf_make(int nbuf, xfs_buf_t **bp
- int off;
-
- if (nbuf == 1)
-- dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP);
-+ dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_NOFS);
- else
-- dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP);
-+ dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_NOFS);
- dabuf->dirty = 0;
- #ifdef XFS_DABUF_DEBUG
- dabuf->ra = ra;
---- a/fs/xfs/xfs_dir2.c
-+++ b/fs/xfs/xfs_dir2.c
-@@ -256,7 +256,7 @@ xfs_dir_cilookup_result(
- !(args->op_flags & XFS_DA_OP_CILOOKUP))
- return EEXIST;
-
-- args->value = kmem_alloc(len, KM_MAYFAIL);
-+ args->value = kmem_alloc(len, KM_NOFS | KM_MAYFAIL);
- if (!args->value)
- return ENOMEM;
-
---- a/fs/xfs/xfs_fsops.c
-+++ b/fs/xfs/xfs_fsops.c
-@@ -167,17 +167,25 @@ xfs_growfs_data_private(
- new = nb - mp->m_sb.sb_dblocks;
- oagcount = mp->m_sb.sb_agcount;
- if (nagcount > oagcount) {
-+ void *new_perag, *old_perag;
-+
- xfs_filestream_flush(mp);
-+
-+ new_perag = kmem_zalloc(sizeof(xfs_perag_t) * nagcount,
-+ KM_MAYFAIL);
-+ if (!new_perag)
-+ return XFS_ERROR(ENOMEM);
-+
- down_write(&mp->m_peraglock);
-- mp->m_perag = kmem_realloc(mp->m_perag,
-- sizeof(xfs_perag_t) * nagcount,
-- sizeof(xfs_perag_t) * oagcount,
-- KM_SLEEP);
-- memset(&mp->m_perag[oagcount], 0,
-- (nagcount - oagcount) * sizeof(xfs_perag_t));
-+ memcpy(new_perag, mp->m_perag, sizeof(xfs_perag_t) * oagcount);
-+ old_perag = mp->m_perag;
-+ mp->m_perag = new_perag;
-+
- mp->m_flags |= XFS_MOUNT_32BITINODES;
- nagimax = xfs_initialize_perag(mp, nagcount);
- up_write(&mp->m_peraglock);
-+
-+ kmem_free(old_perag);
- }
- tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
- tp->t_flags |= XFS_TRANS_RESERVE;
---- a/fs/xfs/xfs_iget.c
-+++ b/fs/xfs/xfs_iget.c
-@@ -64,6 +64,10 @@ xfs_inode_alloc(
- ip = kmem_zone_alloc(xfs_inode_zone, KM_SLEEP);
- if (!ip)
- return NULL;
-+ if (inode_init_always(mp->m_super, VFS_I(ip))) {
-+ kmem_zone_free(xfs_inode_zone, ip);
-+ return NULL;
-+ }
-
- ASSERT(atomic_read(&ip->i_iocount) == 0);
- ASSERT(atomic_read(&ip->i_pincount) == 0);
-@@ -105,17 +109,6 @@ xfs_inode_alloc(
- #ifdef XFS_DIR2_TRACE
- ip->i_dir_trace = ktrace_alloc(XFS_DIR2_KTRACE_SIZE, KM_NOFS);
- #endif
-- /*
-- * Now initialise the VFS inode. We do this after the xfs_inode
-- * initialisation as internal failures will result in ->destroy_inode
-- * being called and that will pass down through the reclaim path and
-- * free the XFS inode. This path requires the XFS inode to already be
-- * initialised. Hence if this call fails, the xfs_inode has already
-- * been freed and we should not reference it at all in the error
-- * handling.
-- */
-- if (!inode_init_always(mp->m_super, VFS_I(ip)))
-- return NULL;
-
- /* prevent anyone from using this yet */
- VFS_I(ip)->i_state = I_NEW|I_LOCK;
-@@ -123,6 +116,71 @@ xfs_inode_alloc(
- return ip;
- }
-
-+STATIC void
-+xfs_inode_free(
-+ struct xfs_inode *ip)
-+{
-+ switch (ip->i_d.di_mode & S_IFMT) {
-+ case S_IFREG:
-+ case S_IFDIR:
-+ case S_IFLNK:
-+ xfs_idestroy_fork(ip, XFS_DATA_FORK);
-+ break;
-+ }
-+
-+ if (ip->i_afp)
-+ xfs_idestroy_fork(ip, XFS_ATTR_FORK);
-+
-+#ifdef XFS_INODE_TRACE
-+ ktrace_free(ip->i_trace);
-+#endif
-+#ifdef XFS_BMAP_TRACE
-+ ktrace_free(ip->i_xtrace);
-+#endif
-+#ifdef XFS_BTREE_TRACE
-+ ktrace_free(ip->i_btrace);
-+#endif
-+#ifdef XFS_RW_TRACE
-+ ktrace_free(ip->i_rwtrace);
-+#endif
-+#ifdef XFS_ILOCK_TRACE
-+ ktrace_free(ip->i_lock_trace);
-+#endif
-+#ifdef XFS_DIR2_TRACE
-+ ktrace_free(ip->i_dir_trace);
-+#endif
-+
-+ if (ip->i_itemp) {
-+ /*
-+ * Only if we are shutting down the fs will we see an
-+ * inode still in the AIL. If it is there, we should remove
-+ * it to prevent a use-after-free from occurring.
-+ */
-+ xfs_log_item_t *lip = &ip->i_itemp->ili_item;
-+ struct xfs_ail *ailp = lip->li_ailp;
-+
-+ ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) ||
-+ XFS_FORCED_SHUTDOWN(ip->i_mount));
-+ if (lip->li_flags & XFS_LI_IN_AIL) {
-+ spin_lock(&ailp->xa_lock);
-+ if (lip->li_flags & XFS_LI_IN_AIL)
-+ xfs_trans_ail_delete(ailp, lip);
-+ else
-+ spin_unlock(&ailp->xa_lock);
-+ }
-+ xfs_inode_item_destroy(ip);
-+ ip->i_itemp = NULL;
-+ }
-+
-+ /* asserts to verify all state is correct here */
-+ ASSERT(atomic_read(&ip->i_iocount) == 0);
-+ ASSERT(atomic_read(&ip->i_pincount) == 0);
-+ ASSERT(!spin_is_locked(&ip->i_flags_lock));
-+ ASSERT(completion_done(&ip->i_flush));
-+
-+ kmem_zone_free(xfs_inode_zone, ip);
-+}
-+
- /*
- * Check the validity of the inode we just found it the cache
- */
-@@ -167,7 +225,7 @@ xfs_iget_cache_hit(
- * errors cleanly, then tag it so it can be set up correctly
- * later.
- */
-- if (!inode_init_always(mp->m_super, VFS_I(ip))) {
-+ if (inode_init_always(mp->m_super, VFS_I(ip))) {
- error = ENOMEM;
- goto out_error;
- }
-@@ -299,7 +357,8 @@ out_preload_end:
- if (lock_flags)
- xfs_iunlock(ip, lock_flags);
- out_destroy:
-- xfs_destroy_inode(ip);
-+ __destroy_inode(VFS_I(ip));
-+ xfs_inode_free(ip);
- return error;
- }
-
-@@ -504,62 +563,7 @@ xfs_ireclaim(
- xfs_qm_dqdetach(ip);
- xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
-
-- switch (ip->i_d.di_mode & S_IFMT) {
-- case S_IFREG:
-- case S_IFDIR:
-- case S_IFLNK:
-- xfs_idestroy_fork(ip, XFS_DATA_FORK);
-- break;
-- }
--
-- if (ip->i_afp)
-- xfs_idestroy_fork(ip, XFS_ATTR_FORK);
--
--#ifdef XFS_INODE_TRACE
-- ktrace_free(ip->i_trace);
--#endif
--#ifdef XFS_BMAP_TRACE
-- ktrace_free(ip->i_xtrace);
--#endif
--#ifdef XFS_BTREE_TRACE
-- ktrace_free(ip->i_btrace);
--#endif
--#ifdef XFS_RW_TRACE
-- ktrace_free(ip->i_rwtrace);
--#endif
--#ifdef XFS_ILOCK_TRACE
-- ktrace_free(ip->i_lock_trace);
--#endif
--#ifdef XFS_DIR2_TRACE
-- ktrace_free(ip->i_dir_trace);
--#endif
-- if (ip->i_itemp) {
-- /*
-- * Only if we are shutting down the fs will we see an
-- * inode still in the AIL. If it is there, we should remove
-- * it to prevent a use-after-free from occurring.
-- */
-- xfs_log_item_t *lip = &ip->i_itemp->ili_item;
-- struct xfs_ail *ailp = lip->li_ailp;
--
-- ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) ||
-- XFS_FORCED_SHUTDOWN(ip->i_mount));
-- if (lip->li_flags & XFS_LI_IN_AIL) {
-- spin_lock(&ailp->xa_lock);
-- if (lip->li_flags & XFS_LI_IN_AIL)
-- xfs_trans_ail_delete(ailp, lip);
-- else
-- spin_unlock(&ailp->xa_lock);
-- }
-- xfs_inode_item_destroy(ip);
-- ip->i_itemp = NULL;
-- }
-- /* asserts to verify all state is correct here */
-- ASSERT(atomic_read(&ip->i_iocount) == 0);
-- ASSERT(atomic_read(&ip->i_pincount) == 0);
-- ASSERT(!spin_is_locked(&ip->i_flags_lock));
-- ASSERT(completion_done(&ip->i_flush));
-- kmem_zone_free(xfs_inode_zone, ip);
-+ xfs_inode_free(ip);
- }
-
- /*
---- a/fs/xfs/xfs_inode.c
-+++ b/fs/xfs/xfs_inode.c
-@@ -343,6 +343,16 @@ xfs_iformat(
- return XFS_ERROR(EFSCORRUPTED);
- }
-
-+ if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) &&
-+ !ip->i_mount->m_rtdev_targp)) {
-+ xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
-+ "corrupt dinode %Lu, has realtime flag set.",
-+ ip->i_ino);
-+ XFS_CORRUPTION_ERROR("xfs_iformat(realtime)",
-+ XFS_ERRLEVEL_LOW, ip->i_mount, dip);
-+ return XFS_ERROR(EFSCORRUPTED);
-+ }
-+
- switch (ip->i_d.di_mode & S_IFMT) {
- case S_IFIFO:
- case S_IFCHR:
---- a/fs/xfs/xfs_inode.h
-+++ b/fs/xfs/xfs_inode.h
-@@ -310,23 +310,6 @@ static inline struct inode *VFS_I(struct
- }
-
- /*
-- * Get rid of a partially initialized inode.
-- *
-- * We have to go through destroy_inode to make sure allocations
-- * from init_inode_always like the security data are undone.
-- *
-- * We mark the inode bad so that it takes the short cut in
-- * the reclaim path instead of going through the flush path
-- * which doesn't make sense for an inode that has never seen the
-- * light of day.
-- */
--static inline void xfs_destroy_inode(struct xfs_inode *ip)
--{
-- make_bad_inode(VFS_I(ip));
-- return destroy_inode(VFS_I(ip));
--}
--
--/*
- * i_flags helper functions
- */
- static inline void
---- a/fs/xfs/xfs_log.c
-+++ b/fs/xfs/xfs_log.c
-@@ -3180,7 +3180,7 @@ try_again:
- STATIC void
- xlog_state_want_sync(xlog_t *log, xlog_in_core_t *iclog)
- {
-- ASSERT(spin_is_locked(&log->l_icloglock));
-+ assert_spin_locked(&log->l_icloglock);
-
- if (iclog->ic_state == XLOG_STATE_ACTIVE) {
- xlog_state_switch_iclogs(log, iclog, 0);
---- a/fs/xfs/xfs_vnodeops.c
-+++ b/fs/xfs/xfs_vnodeops.c
-@@ -538,7 +538,9 @@ xfs_readlink_bmap(
- d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock);
- byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount);
-
-- bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0);
-+ bp = xfs_buf_read_flags(mp->m_ddev_targp, d, BTOBB(byte_cnt),
-+ XBF_LOCK | XBF_MAPPED |
-+ XBF_DONT_BLOCK);
- error = XFS_BUF_GETERROR(bp);
- if (error) {
- xfs_ioerror_alert("xfs_readlink",
---- a/include/drm/drm_pciids.h
-+++ b/include/drm/drm_pciids.h
-@@ -370,6 +370,11 @@
- {0x1002, 0x9614, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
- {0x1002, 0x9615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
- {0x1002, 0x9616, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
-+ {0x1002, 0x9710, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
-+ {0x1002, 0x9711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
-+ {0x1002, 0x9712, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
-+ {0x1002, 0x9713, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
-+ {0x1002, 0x9714, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS880|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
- {0, 0, 0}
-
- #define r128_PCI_IDS \
---- a/include/linux/decompress/generic.h
-+++ b/include/linux/decompress/generic.h
-@@ -1,31 +1,37 @@
- #ifndef DECOMPRESS_GENERIC_H
- #define DECOMPRESS_GENERIC_H
-
--/* Minimal chunksize to be read.
-- *Bzip2 prefers at least 4096
-- *Lzma prefers 0x10000 */
--#define COMPR_IOBUF_SIZE 4096
--
- typedef int (*decompress_fn) (unsigned char *inbuf, int len,
- int(*fill)(void*, unsigned int),
-- int(*writebb)(void*, unsigned int),
-- unsigned char *output,
-+ int(*flush)(void*, unsigned int),
-+ unsigned char *outbuf,
- int *posp,
- void(*error)(char *x));
-
- /* inbuf - input buffer
- *len - len of pre-read data in inbuf
-- *fill - function to fill inbuf if empty
-- *writebb - function to write out outbug
-+ *fill - function to fill inbuf when empty
-+ *flush - function to write out outbuf
-+ *outbuf - output buffer
- *posp - if non-null, input position (number of bytes read) will be
- * returned here
- *
-- *If len != 0, the inbuf is initialized (with as much data), and fill
-- *should not be called
-- *If len = 0, the inbuf is allocated, but empty. Its size is IOBUF_SIZE
-- *fill should be called (repeatedly...) to read data, at most IOBUF_SIZE
-+ *If len != 0, inbuf should contain all the necessary input data, and fill
-+ *should be NULL
-+ *If len = 0, inbuf can be NULL, in which case the decompressor will allocate
-+ *the input buffer. If inbuf != NULL it must be at least XXX_IOBUF_SIZE bytes.
-+ *fill will be called (repeatedly...) to read data, at most XXX_IOBUF_SIZE
-+ *bytes should be read per call. Replace XXX with the appropriate decompressor
-+ *name, i.e. LZMA_IOBUF_SIZE.
-+ *
-+ *If flush = NULL, outbuf must be large enough to buffer all the expected
-+ *output. If flush != NULL, the output buffer will be allocated by the
-+ *decompressor (outbuf = NULL), and the flush function will be called to
-+ *flush the output buffer at the appropriate time (decompressor and stream
-+ *dependent).
- */
-
-+
- /* Utility routine to detect the decompression method */
- decompress_fn decompress_method(const unsigned char *inbuf, int len,
- const char **name);
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -2137,7 +2137,7 @@ extern loff_t default_llseek(struct file
-
- extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin);
-
--extern struct inode * inode_init_always(struct super_block *, struct inode *);
-+extern int inode_init_always(struct super_block *, struct inode *);
- extern void inode_init_once(struct inode *);
- extern void inode_add_to_lists(struct super_block *, struct inode *);
- extern void iput(struct inode *);
-@@ -2164,6 +2164,7 @@ extern void __iget(struct inode * inode)
- extern void iget_failed(struct inode *);
- extern void clear_inode(struct inode *);
- extern void destroy_inode(struct inode *);
-+extern void __destroy_inode(struct inode *);
- extern struct inode *new_inode(struct super_block *);
- extern int should_remove_suid(struct dentry *);
- extern int file_remove_suid(struct file *);
---- a/include/linux/ftrace_event.h
-+++ b/include/linux/ftrace_event.h
-@@ -89,7 +89,9 @@ enum print_line_t {
- TRACE_TYPE_NO_CONSUME = 3 /* Handled but ask to not consume */
- };
-
--
-+void tracing_generic_entry_update(struct trace_entry *entry,
-+ unsigned long flags,
-+ int pc);
- struct ring_buffer_event *
- trace_current_buffer_lock_reserve(int type, unsigned long len,
- unsigned long flags, int pc);
-@@ -119,11 +121,9 @@ struct ftrace_event_call {
- void *filter;
- void *mod;
-
--#ifdef CONFIG_EVENT_PROFILE
-- atomic_t profile_count;
-- int (*profile_enable)(struct ftrace_event_call *);
-- void (*profile_disable)(struct ftrace_event_call *);
--#endif
-+ atomic_t profile_count;
-+ int (*profile_enable)(struct ftrace_event_call *);
-+ void (*profile_disable)(struct ftrace_event_call *);
- };
-
- #define MAX_FILTER_PRED 32
---- a/include/linux/input/matrix_keypad.h
-+++ b/include/linux/input/matrix_keypad.h
-@@ -15,12 +15,13 @@
- #define KEY_COL(k) (((k) >> 16) & 0xff)
- #define KEY_VAL(k) ((k) & 0xffff)
-
-+#define MATRIX_SCAN_CODE(row, col, row_shift) (((row) << (row_shift)) + (col))
-+
- /**
- * struct matrix_keymap_data - keymap for matrix keyboards
- * @keymap: pointer to array of uint32 values encoded with KEY() macro
- * representing keymap
- * @keymap_size: number of entries (initialized) in this keymap
-- * @max_keymap_size: maximum size of keymap supported by the device
- *
- * This structure is supposed to be used by platform code to supply
- * keymaps to drivers that implement matrix-like keypads/keyboards.
-@@ -28,14 +29,13 @@
- struct matrix_keymap_data {
- const uint32_t *keymap;
- unsigned int keymap_size;
-- unsigned int max_keymap_size;
- };
-
- /**
- * struct matrix_keypad_platform_data - platform-dependent keypad data
- * @keymap_data: pointer to &matrix_keymap_data
-- * @row_gpios: array of gpio numbers reporesenting rows
-- * @col_gpios: array of gpio numbers reporesenting colums
-+ * @row_gpios: pointer to array of gpio numbers representing rows
-+ * @col_gpios: pointer to array of gpio numbers reporesenting colums
- * @num_row_gpios: actual number of row gpios used by device
- * @num_col_gpios: actual number of col gpios used by device
- * @col_scan_delay_us: delay, measured in microseconds, that is
-@@ -48,8 +48,9 @@ struct matrix_keymap_data {
- struct matrix_keypad_platform_data {
- const struct matrix_keymap_data *keymap_data;
-
-- unsigned int row_gpios[MATRIX_MAX_ROWS];
-- unsigned int col_gpios[MATRIX_MAX_COLS];
-+ const unsigned int *row_gpios;
-+ const unsigned int *col_gpios;
-+
- unsigned int num_row_gpios;
- unsigned int num_col_gpios;
-
---- a/include/linux/kvm_host.h
-+++ b/include/linux/kvm_host.h
-@@ -110,6 +110,7 @@ struct kvm_memory_slot {
-
- struct kvm_kernel_irq_routing_entry {
- u32 gsi;
-+ u32 type;
- int (*set)(struct kvm_kernel_irq_routing_entry *e,
- struct kvm *kvm, int level);
- union {
---- a/include/linux/mtd/mtd.h
-+++ b/include/linux/mtd/mtd.h
-@@ -251,7 +251,7 @@ struct mtd_info {
-
- static inline struct mtd_info *dev_to_mtd(struct device *dev)
- {
-- return dev ? container_of(dev, struct mtd_info, dev) : NULL;
-+ return dev ? dev_get_drvdata(dev) : NULL;
- }
-
- static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -47,6 +47,8 @@ struct mtd_partition {
- #define MTDPART_SIZ_FULL (0)
-
-
-+struct mtd_info;
-+
- int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
- int del_mtd_partitions(struct mtd_info *);
-
---- a/include/linux/nfs_fs.h
-+++ b/include/linux/nfs_fs.h
-@@ -473,7 +473,6 @@ extern int nfs_writepages(struct addres
- extern int nfs_flush_incompatible(struct file *file, struct page *page);
- extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
- extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
--extern void nfs_writedata_release(void *);
-
- /*
- * Try to write back everything synchronously (but check the
-@@ -488,7 +487,6 @@ extern int nfs_wb_page_cancel(struct ino
- extern int nfs_commit_inode(struct inode *, int);
- extern struct nfs_write_data *nfs_commitdata_alloc(void);
- extern void nfs_commit_free(struct nfs_write_data *wdata);
--extern void nfs_commitdata_release(void *wdata);
- #else
- static inline int
- nfs_commit_inode(struct inode *inode, int how)
-@@ -507,6 +505,7 @@ nfs_have_writebacks(struct inode *inode)
- * Allocate nfs_write_data structures
- */
- extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages);
-+extern void nfs_writedata_free(struct nfs_write_data *);
-
- /*
- * linux/fs/nfs/read.c
-@@ -515,7 +514,6 @@ extern int nfs_readpage(struct file *,
- extern int nfs_readpages(struct file *, struct address_space *,
- struct list_head *, unsigned);
- extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
--extern void nfs_readdata_release(void *data);
- extern int nfs_readpage_async(struct nfs_open_context *, struct inode *,
- struct page *);
-
-@@ -523,6 +521,7 @@ extern int nfs_readpage_async(struct nf
- * Allocate nfs_read_data structures
- */
- extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages);
-+extern void nfs_readdata_free(struct nfs_read_data *);
-
- /*
- * linux/fs/nfs3proc.c
---- a/include/linux/nodemask.h
-+++ b/include/linux/nodemask.h
-@@ -82,6 +82,12 @@
- * to generate slightly worse code. So use a simple one-line #define
- * for node_isset(), instead of wrapping an inline inside a macro, the
- * way we do the other calls.
-+ *
-+ * NODEMASK_SCRATCH
-+ * When doing above logical AND, OR, XOR, Remap operations the callers tend to
-+ * need temporary nodemask_t's on the stack. But if NODES_SHIFT is large,
-+ * nodemask_t's consume too much stack space. NODEMASK_SCRATCH is a helper
-+ * for such situations. See below and CPUMASK_ALLOC also.
- */
-
- #include <linux/kernel.h>
-@@ -473,4 +479,26 @@ static inline int num_node_state(enum no
- #define for_each_node(node) for_each_node_state(node, N_POSSIBLE)
- #define for_each_online_node(node) for_each_node_state(node, N_ONLINE)
-
-+/*
-+ * For nodemask scrach area.(See CPUMASK_ALLOC() in cpumask.h)
-+ */
-+
-+#if NODES_SHIFT > 8 /* nodemask_t > 64 bytes */
-+#define NODEMASK_ALLOC(x, m) struct x *m = kmalloc(sizeof(*m), GFP_KERNEL)
-+#define NODEMASK_FREE(m) kfree(m)
-+#else
-+#define NODEMASK_ALLOC(x, m) struct x _m, *m = &_m
-+#define NODEMASK_FREE(m)
-+#endif
-+
-+/* A example struture for using NODEMASK_ALLOC, used in mempolicy. */
-+struct nodemask_scratch {
-+ nodemask_t mask1;
-+ nodemask_t mask2;
-+};
-+
-+#define NODEMASK_SCRATCH(x) NODEMASK_ALLOC(nodemask_scratch, x)
-+#define NODEMASK_SCRATCH_FREE(x) NODEMASK_FREE(x)
-+
-+
- #endif /* __LINUX_NODEMASK_H */
---- a/include/linux/perf_counter.h
-+++ b/include/linux/perf_counter.h
-@@ -121,8 +121,9 @@ enum perf_counter_sample_format {
- PERF_SAMPLE_CPU = 1U << 7,
- PERF_SAMPLE_PERIOD = 1U << 8,
- PERF_SAMPLE_STREAM_ID = 1U << 9,
-+ PERF_SAMPLE_RAW = 1U << 10,
-
-- PERF_SAMPLE_MAX = 1U << 10, /* non-ABI */
-+ PERF_SAMPLE_MAX = 1U << 11, /* non-ABI */
- };
-
- /*
-@@ -368,6 +369,8 @@ enum perf_event_type {
- *
- * { u64 nr,
- * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN
-+ * { u32 size;
-+ * char data[size];}&& PERF_SAMPLE_RAW
- * };
- */
- PERF_EVENT_SAMPLE = 9,
-@@ -413,6 +416,11 @@ struct perf_callchain_entry {
- __u64 ip[PERF_MAX_STACK_DEPTH];
- };
-
-+struct perf_raw_record {
-+ u32 size;
-+ void *data;
-+};
-+
- struct task_struct;
-
- /**
-@@ -681,6 +689,7 @@ struct perf_sample_data {
- struct pt_regs *regs;
- u64 addr;
- u64 period;
-+ struct perf_raw_record *raw;
- };
-
- extern int perf_counter_overflow(struct perf_counter *counter, int nmi,
---- a/include/trace/ftrace.h
-+++ b/include/trace/ftrace.h
-@@ -144,6 +144,9 @@
- #undef TP_fast_assign
- #define TP_fast_assign(args...) args
-
-+#undef TP_perf_assign
-+#define TP_perf_assign(args...)
-+
- #undef TRACE_EVENT
- #define TRACE_EVENT(call, proto, args, tstruct, func, print) \
- static int \
-@@ -345,6 +348,56 @@ static inline int ftrace_get_offsets_##c
-
- #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-
-+#ifdef CONFIG_EVENT_PROFILE
-+
-+/*
-+ * Generate the functions needed for tracepoint perf_counter support.
-+ *
-+ * NOTE: The insertion profile callback (ftrace_profile_<call>) is defined later
-+ *
-+ * static int ftrace_profile_enable_<call>(struct ftrace_event_call *event_call)
-+ * {
-+ * int ret = 0;
-+ *
-+ * if (!atomic_inc_return(&event_call->profile_count))
-+ * ret = register_trace_<call>(ftrace_profile_<call>);
-+ *
-+ * return ret;
-+ * }
-+ *
-+ * static void ftrace_profile_disable_<call>(struct ftrace_event_call *event_call)
-+ * {
-+ * if (atomic_add_negative(-1, &event->call->profile_count))
-+ * unregister_trace_<call>(ftrace_profile_<call>);
-+ * }
-+ *
-+ */
-+
-+#undef TRACE_EVENT
-+#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \
-+ \
-+static void ftrace_profile_##call(proto); \
-+ \
-+static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \
-+{ \
-+ int ret = 0; \
-+ \
-+ if (!atomic_inc_return(&event_call->profile_count)) \
-+ ret = register_trace_##call(ftrace_profile_##call); \
-+ \
-+ return ret; \
-+} \
-+ \
-+static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\
-+{ \
-+ if (atomic_add_negative(-1, &event_call->profile_count)) \
-+ unregister_trace_##call(ftrace_profile_##call); \
-+}
-+
-+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-+
-+#endif
-+
- /*
- * Stage 4 of the trace events.
- *
-@@ -447,28 +500,6 @@ static inline int ftrace_get_offsets_##c
- #define TP_FMT(fmt, args...) fmt "\n", ##args
-
- #ifdef CONFIG_EVENT_PROFILE
--#define _TRACE_PROFILE(call, proto, args) \
--static void ftrace_profile_##call(proto) \
--{ \
-- extern void perf_tpcounter_event(int); \
-- perf_tpcounter_event(event_##call.id); \
--} \
-- \
--static int ftrace_profile_enable_##call(struct ftrace_event_call *event_call) \
--{ \
-- int ret = 0; \
-- \
-- if (!atomic_inc_return(&event_call->profile_count)) \
-- ret = register_trace_##call(ftrace_profile_##call); \
-- \
-- return ret; \
--} \
-- \
--static void ftrace_profile_disable_##call(struct ftrace_event_call *event_call)\
--{ \
-- if (atomic_add_negative(-1, &event_call->profile_count)) \
-- unregister_trace_##call(ftrace_profile_##call); \
--}
-
- #define _TRACE_PROFILE_INIT(call) \
- .profile_count = ATOMIC_INIT(-1), \
-@@ -476,7 +507,6 @@ static void ftrace_profile_disable_##cal
- .profile_disable = ftrace_profile_disable_##call,
-
- #else
--#define _TRACE_PROFILE(call, proto, args)
- #define _TRACE_PROFILE_INIT(call)
- #endif
-
-@@ -502,7 +532,6 @@ static void ftrace_profile_disable_##cal
-
- #undef TRACE_EVENT
- #define TRACE_EVENT(call, proto, args, tstruct, assign, print) \
--_TRACE_PROFILE(call, PARAMS(proto), PARAMS(args)) \
- \
- static struct ftrace_event_call event_##call; \
- \
-@@ -586,6 +615,110 @@ __attribute__((section("_ftrace_events")
-
- #include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-
--#undef _TRACE_PROFILE
-+/*
-+ * Define the insertion callback to profile events
-+ *
-+ * The job is very similar to ftrace_raw_event_<call> except that we don't
-+ * insert in the ring buffer but in a perf counter.
-+ *
-+ * static void ftrace_profile_<call>(proto)
-+ * {
-+ * struct ftrace_data_offsets_<call> __maybe_unused __data_offsets;
-+ * struct ftrace_event_call *event_call = &event_<call>;
-+ * extern void perf_tpcounter_event(int, u64, u64, void *, int);
-+ * struct ftrace_raw_##call *entry;
-+ * u64 __addr = 0, __count = 1;
-+ * unsigned long irq_flags;
-+ * int __entry_size;
-+ * int __data_size;
-+ * int pc;
-+ *
-+ * local_save_flags(irq_flags);
-+ * pc = preempt_count();
-+ *
-+ * __data_size = ftrace_get_offsets_<call>(&__data_offsets, args);
-+ *
-+ * // Below we want to get the aligned size by taking into account
-+ * // the u32 field that will later store the buffer size
-+ * __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),
-+ * sizeof(u64));
-+ * __entry_size -= sizeof(u32);
-+ *
-+ * do {
-+ * char raw_data[__entry_size]; <- allocate our sample in the stack
-+ * struct trace_entry *ent;
-+ *
-+ * zero dead bytes from alignment to avoid stack leak to userspace:
-+ *
-+ * *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL;
-+ * entry = (struct ftrace_raw_<call> *)raw_data;
-+ * ent = &entry->ent;
-+ * tracing_generic_entry_update(ent, irq_flags, pc);
-+ * ent->type = event_call->id;
-+ *
-+ * <tstruct> <- do some jobs with dynamic arrays
-+ *
-+ * <assign> <- affect our values
-+ *
-+ * perf_tpcounter_event(event_call->id, __addr, __count, entry,
-+ * __entry_size); <- submit them to perf counter
-+ * } while (0);
-+ *
-+ * }
-+ */
-+
-+#ifdef CONFIG_EVENT_PROFILE
-+
-+#undef __perf_addr
-+#define __perf_addr(a) __addr = (a)
-+
-+#undef __perf_count
-+#define __perf_count(c) __count = (c)
-+
-+#undef TRACE_EVENT
-+#define TRACE_EVENT(call, proto, args, tstruct, assign, print) \
-+static void ftrace_profile_##call(proto) \
-+{ \
-+ struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\
-+ struct ftrace_event_call *event_call = &event_##call; \
-+ extern void perf_tpcounter_event(int, u64, u64, void *, int); \
-+ struct ftrace_raw_##call *entry; \
-+ u64 __addr = 0, __count = 1; \
-+ unsigned long irq_flags; \
-+ int __entry_size; \
-+ int __data_size; \
-+ int pc; \
-+ \
-+ local_save_flags(irq_flags); \
-+ pc = preempt_count(); \
-+ \
-+ __data_size = ftrace_get_offsets_##call(&__data_offsets, args); \
-+ __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\
-+ sizeof(u64)); \
-+ __entry_size -= sizeof(u32); \
-+ \
-+ do { \
-+ char raw_data[__entry_size]; \
-+ struct trace_entry *ent; \
-+ \
-+ *(u64 *)(&raw_data[__entry_size - sizeof(u64)]) = 0ULL; \
-+ entry = (struct ftrace_raw_##call *)raw_data; \
-+ ent = &entry->ent; \
-+ tracing_generic_entry_update(ent, irq_flags, pc); \
-+ ent->type = event_call->id; \
-+ \
-+ tstruct \
-+ \
-+ { assign; } \
-+ \
-+ perf_tpcounter_event(event_call->id, __addr, __count, entry,\
-+ __entry_size); \
-+ } while (0); \
-+ \
-+}
-+
-+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
-+#endif /* CONFIG_EVENT_PROFILE */
-+
- #undef _TRACE_PROFILE_INIT
-
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -568,18 +568,18 @@ void mm_release(struct task_struct *tsk,
- * the value intact in a core dump, and to save the unnecessary
- * trouble otherwise. Userland only wants this done for a sys_exit.
- */
-- if (tsk->clear_child_tid
-- && !(tsk->flags & PF_SIGNALED)
-- && atomic_read(&mm->mm_users) > 1) {
-- u32 __user * tidptr = tsk->clear_child_tid;
-+ if (tsk->clear_child_tid) {
-+ if (!(tsk->flags & PF_SIGNALED) &&
-+ atomic_read(&mm->mm_users) > 1) {
-+ /*
-+ * We don't check the error code - if userspace has
-+ * not set up a proper pointer then tough luck.
-+ */
-+ put_user(0, tsk->clear_child_tid);
-+ sys_futex(tsk->clear_child_tid, FUTEX_WAKE,
-+ 1, NULL, NULL, 0);
-+ }
- tsk->clear_child_tid = NULL;
--
-- /*
-- * We don't check the error code - if userspace has
-- * not set up a proper pointer then tough luck.
-- */
-- put_user(0, tidptr);
-- sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0);
- }
- }
-
---- a/kernel/irq/numa_migrate.c
-+++ b/kernel/irq/numa_migrate.c
-@@ -107,8 +107,8 @@ out_unlock:
-
- struct irq_desc *move_irq_desc(struct irq_desc *desc, int node)
- {
-- /* those all static, do move them */
-- if (desc->irq < NR_IRQS_LEGACY)
-+ /* those static or target node is -1, do not move them */
-+ if (desc->irq < NR_IRQS_LEGACY || node == -1)
- return desc;
-
- if (desc->node != node)
---- a/kernel/lockdep_proc.c
-+++ b/kernel/lockdep_proc.c