[kernel] r7068 - in dists/trunk/linux-2.6/debian: . arch/amd64 arch/i386 arch/ia64 arch/mips arch/mipsel arch/powerpc patches patches/series

maximilian attems maks-guest at costa.debian.org
Tue Jul 25 20:39:48 UTC 2006


Author: maks-guest
Date: Tue Jul 25 20:39:42 2006
New Revision: 7068

Added:
   dists/trunk/linux-2.6/debian/patches/2.6.17.7
   dists/trunk/linux-2.6/debian/patches/budget-av-compile-fix.patch
Modified:
   dists/trunk/linux-2.6/debian/arch/alpha/config
   dists/trunk/linux-2.6/debian/arch/amd64/config
   dists/trunk/linux-2.6/debian/arch/i386/config
   dists/trunk/linux-2.6/debian/arch/ia64/config
   dists/trunk/linux-2.6/debian/arch/mips/config.r5k-ip32
   dists/trunk/linux-2.6/debian/arch/mips/config.sb1-bcm91250a
   dists/trunk/linux-2.6/debian/arch/mips/config.sb1a-bcm91480b
   dists/trunk/linux-2.6/debian/arch/mipsel/config.r5k-cobalt
   dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1-bcm91250a
   dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1a-bcm91480b
   dists/trunk/linux-2.6/debian/arch/powerpc/config
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/5

Log:
add 2.6.17.7
add buildfix
set CONFIG_SND_FM801_TEA575X_BOOL=y, where CONFIG_SND_FM801_TEA575X=m



Modified: dists/trunk/linux-2.6/debian/arch/alpha/config
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/alpha/config	(original)
+++ dists/trunk/linux-2.6/debian/arch/alpha/config	Tue Jul 25 20:39:42 2006
@@ -1267,6 +1267,7 @@
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m

Modified: dists/trunk/linux-2.6/debian/arch/amd64/config
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/amd64/config	(original)
+++ dists/trunk/linux-2.6/debian/arch/amd64/config	Tue Jul 25 20:39:42 2006
@@ -1175,6 +1175,7 @@
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m

Modified: dists/trunk/linux-2.6/debian/arch/i386/config
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/i386/config	(original)
+++ dists/trunk/linux-2.6/debian/arch/i386/config	Tue Jul 25 20:39:42 2006
@@ -1426,6 +1426,7 @@
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m

Modified: dists/trunk/linux-2.6/debian/arch/ia64/config
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/ia64/config	(original)
+++ dists/trunk/linux-2.6/debian/arch/ia64/config	Tue Jul 25 20:39:42 2006
@@ -993,6 +993,7 @@
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m

Modified: dists/trunk/linux-2.6/debian/arch/mips/config.r5k-ip32
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mips/config.r5k-ip32	(original)
+++ dists/trunk/linux-2.6/debian/arch/mips/config.r5k-ip32	Tue Jul 25 20:39:42 2006
@@ -1518,6 +1518,7 @@
 CONFIG_SOUND_EMU10K1=m
 # CONFIG_SOUND_VIA82CXXX is not set
 CONFIG_SND_MPU401_UART=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SERIAL_8250_PCI=y
 CONFIG_SOUND_BT878=m

Modified: dists/trunk/linux-2.6/debian/arch/mips/config.sb1-bcm91250a
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mips/config.sb1-bcm91250a	(original)
+++ dists/trunk/linux-2.6/debian/arch/mips/config.sb1-bcm91250a	Tue Jul 25 20:39:42 2006
@@ -1331,6 +1331,7 @@
 CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_HDA_INTEL=m
 CONFIG_SND_HDSP=m

Modified: dists/trunk/linux-2.6/debian/arch/mips/config.sb1a-bcm91480b
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mips/config.sb1a-bcm91480b	(original)
+++ dists/trunk/linux-2.6/debian/arch/mips/config.sb1a-bcm91480b	Tue Jul 25 20:39:42 2006
@@ -1326,6 +1326,7 @@
 CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_HDA_INTEL=m
 CONFIG_SND_HDSP=m

Modified: dists/trunk/linux-2.6/debian/arch/mipsel/config.r5k-cobalt
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mipsel/config.r5k-cobalt	(original)
+++ dists/trunk/linux-2.6/debian/arch/mipsel/config.r5k-cobalt	Tue Jul 25 20:39:42 2006
@@ -1128,6 +1128,7 @@
 CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_HDA_INTEL=m
 CONFIG_SND_HDSP=m

Modified: dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1-bcm91250a
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1-bcm91250a	(original)
+++ dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1-bcm91250a	Tue Jul 25 20:39:42 2006
@@ -1331,6 +1331,7 @@
 CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_HDA_INTEL=m
 CONFIG_SND_HDSP=m

Modified: dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1a-bcm91480b
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1a-bcm91480b	(original)
+++ dists/trunk/linux-2.6/debian/arch/mipsel/config.sb1a-bcm91480b	Tue Jul 25 20:39:42 2006
@@ -1326,6 +1326,7 @@
 CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_HDA_INTEL=m
 CONFIG_SND_HDSP=m

Modified: dists/trunk/linux-2.6/debian/arch/powerpc/config
==============================================================================
--- dists/trunk/linux-2.6/debian/arch/powerpc/config	(original)
+++ dists/trunk/linux-2.6/debian/arch/powerpc/config	Tue Jul 25 20:39:42 2006
@@ -972,6 +972,7 @@
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X_BOOL=y
 CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	(original)
+++ dists/trunk/linux-2.6/debian/changelog	Tue Jul 25 20:39:42 2006
@@ -6,7 +6,58 @@
   [ Frederik Schüler ]
   * [amd64] Apply rediffed smp-alternatives patch from 2.6.18-rc1.
 
- -- Frederik Schüler <fs at debian.org>  Sat, 22 Jul 2006 01:29:08 +0200
+  [ maximilian attems ]
+  * Add stable release 2.6.17.7:
+    - BLOCK: Fix bounce limit address check
+    - v4l/dvb: Fix budget-av frontend detection
+    - v4l/dvb: Fix CI on old KNC1 DVBC cards
+    - v4l/dvb: Fix CI interface on PRO KNC1 cards
+    - v4l/dvb: Backport fix to artec USB DVB devices
+    - v4l/dvb: Backport the DISEQC regression fix to 2.6.17.x
+    - v4l/dvb: stradis: dont export MODULE_DEVICE_TABLE
+    - pnp: suppress request_irq() warning
+    - generic_file_buffered_write(): handle zero-length iovec segments
+    - serial 8250: sysrq deadlock fix
+    - Reduce ACPI verbosity on null handle condition
+    - ieee80211: TKIP requires CRC32
+    - Make powernow-k7 work on SMP kernels.
+    - via-velocity: the link is not correctly detected when the device starts
+    - Add missing UFO initialisations
+    - USB serial ftdi_sio: Prevent userspace DoS (CVE-2006-2936)
+    - cdrom: fix bad cgc.buflen assignment
+    - splice: fix problems with sys_tee()
+    - fix fdset leakage
+    - struct file leakage
+    - XFS: corruption fix
+    - v4l/dvb: Kconfig: fix description and dependencies for saa7115 module
+    - dvb-bt8xx: fix frontend detection for DViCO FusionHDTV DVB-T Lite rev 1.2
+    - IB/mthca: restore missing PCI registers after reset
+    - v4l/dvb: Backport the budget driver DISEQC instability fix
+    - Fix IPv4/DECnet routing rule dumping
+    - pdflush: handle resume wakeups
+    - x86_64: Fix modular pc speaker
+    - Fix powernow-k8 SMP kernel on UP hardware bug.
+    - ALSA: RME HDSP - fixed proc interface (missing {})
+    - ALSA: au88x0 - Fix 64bit address of MPU401 MMIO port
+    - ALSA: Fix a deadlock in snd-rtctimer
+    - ALSA: Fix missing array terminators in AD1988 codec support
+    - ALSA: Fix model for HP dc7600
+    - ALSA: Fix mute switch on VAIO laptops with STAC7661
+    - ALSA: fix the SND_FM801_TEA575X dependencies
+    - ALSA: Fix undefined (missing) references in ISA MIRO sound driver
+    - ALSA: Fix workaround for AD1988A rev2 codec
+    - ALSA: hda-intel - Fix race in remove
+    - Suppress irq handler mismatch messages in ALSA ISA drivers
+    - PKT_SCHED: Fix illegal memory dereferences when dumping actions
+    - PKT_SCHED: Return ENOENT if action module is unavailable
+    - PKT_SCHED: Fix error handling while dumping actions
+    - generic_file_buffered_write(): deadlock on vectored write
+    - ethtool: oops in ethtool_set_pauseparam()
+    - memory hotplug: solve config broken: undefined reference to `online_page'
+  * Add budget-av-compile-fix.patch stable compile fix.
+  * Enable in all configs setting SND_FM801_TEA575X SND_FM801_TEA575X_BOOL=y.
+
+ -- maximilian attems <maks at sternwelten.at>  Tue, 25 Jul 2006 22:26:52 +0200
 
 linux-2.6 (2.6.17-4) unstable; urgency=low
 

Added: dists/trunk/linux-2.6/debian/patches/2.6.17.7
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/2.6.17.7	Tue Jul 25 20:39:42 2006
@@ -0,0 +1,1599 @@
+diff --git a/arch/i386/Kconfig b/arch/i386/Kconfig
+index 8dfa305..6ad5144 100644
+--- a/arch/i386/Kconfig
++++ b/arch/i386/Kconfig
+@@ -765,6 +765,9 @@ config HOTPLUG_CPU
+ 
+ endmenu
+ 
++config ARCH_ENABLE_MEMORY_HOTPLUG
++	def_bool y
++	depends on HIGHMEM
+ 
+ menu "Power management options (ACPI, APM)"
+ 	depends on !X86_VOYAGER
+diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c
+index 2bf4237..a748409 100644
+--- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c
++++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c
+@@ -581,10 +581,7 @@ static int __init powernow_cpu_init (str
+ 
+ 	rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val);
+ 
+-	/* recalibrate cpu_khz */
+-	result = recalibrate_cpu_khz();
+-	if (result)
+-		return result;
++	recalibrate_cpu_khz();
+ 
+ 	fsb = (10 * cpu_khz) / fid_codes[fidvidstatus.bits.CFID];
+ 	if (!fsb) {
+diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
+index 71fffa1..2ea3c6c 100644
+--- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
++++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c
+@@ -1008,7 +1008,7 @@ static int __cpuinit powernowk8_cpu_init
+ 		 * an UP version, and is deprecated by AMD.
+ 		 */
+ 
+-		if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
++		if (num_online_cpus() != 1) {
+ 			printk(KERN_ERR PFX "MP systems not supported by PSB BIOS structure\n");
+ 			kfree(data);
+ 			return -ENODEV;
+diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
+index 0f3076a..0c0cd0a 100644
+--- a/arch/ia64/Kconfig
++++ b/arch/ia64/Kconfig
+@@ -270,6 +270,9 @@ config HOTPLUG_CPU
+ 	  can be controlled through /sys/devices/system/cpu/cpu#.
+ 	  Say N if you want to disable CPU hotplug.
+ 
++config ARCH_ENABLE_MEMORY_HOTPLUG
++	def_bool y
++
+ config SCHED_SMT
+ 	bool "SMT scheduler support"
+ 	depends on SMP
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index 6729c98..fbc2b7f 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -599,6 +599,9 @@ config HOTPLUG_CPU
+ 
+ 	  Say N if you are unsure.
+ 
++config ARCH_ENABLE_MEMORY_HOTPLUG
++	def_bool y
++
+ config KEXEC
+ 	bool "kexec system call (EXPERIMENTAL)"
+ 	depends on PPC_MULTIPLATFORM && EXPERIMENTAL
+diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig
+index 408d44a..ce0c797 100644
+--- a/arch/x86_64/Kconfig
++++ b/arch/x86_64/Kconfig
+@@ -369,6 +369,8 @@ config HOTPLUG_CPU
+ 		can be controlled through /sys/devices/system/cpu/cpu#.
+ 		Say N if you want to disable CPU hotplug.
+ 
++config ARCH_ENABLE_MEMORY_HOTPLUG
++	def_bool y
+ 
+ config HPET_TIMER
+ 	bool
+diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
+index 655b919..e8d5f84 100644
+--- a/arch/x86_64/kernel/setup.c
++++ b/arch/x86_64/kernel/setup.c
+@@ -1440,7 +1440,7 @@ struct seq_operations cpuinfo_op = {
+ 	.show =	show_cpuinfo,
+ };
+ 
+-#ifdef CONFIG_INPUT_PCSPKR
++#if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE)
+ #include <linux/platform_device.h>
+ static __init int add_pcspkr(void)
+ {
+diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
+index 7eb36c5..4293143 100644
+--- a/block/ll_rw_blk.c
++++ b/block/ll_rw_blk.c
+@@ -638,7 +638,7 @@ #if BITS_PER_LONG == 64
+ 	/* Assume anything <= 4GB can be handled by IOMMU.
+ 	   Actually some IOMMUs can handle everything, but I don't
+ 	   know of a way to test this here. */
+-	if (bounce_pfn < (0xffffffff>>PAGE_SHIFT))
++	if (bounce_pfn < (min_t(u64,0xffffffff,BLK_BOUNCE_HIGH) >> PAGE_SHIFT))
+ 		dma = 1;
+ 	q->bounce_pfn = max_low_pfn;
+ #else
+diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c
+index a95f636..d7791fb 100644
+--- a/drivers/acpi/namespace/nsxfeval.c
++++ b/drivers/acpi/namespace/nsxfeval.c
+@@ -238,8 +238,9 @@ acpi_evaluate_object(acpi_handle handle,
+ 			ACPI_ERROR((AE_INFO,
+ 				    "Both Handle and Pathname are NULL"));
+ 		} else {
+-			ACPI_ERROR((AE_INFO,
+-				    "Handle is NULL and Pathname is relative"));
++			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
++					  "Null Handle with relative pathname [%s]",
++					  pathname));
+ 		}
+ 
+ 		status = AE_BAD_PARAMETER;
+diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
+index 3170eaa..fdd37e4 100644
+--- a/drivers/cdrom/cdrom.c
++++ b/drivers/cdrom/cdrom.c
+@@ -1838,7 +1838,7 @@ static int dvd_read_bca(struct cdrom_dev
+ 	init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
+ 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
+ 	cgc.cmd[7] = s->type;
+-	cgc.cmd[9] = cgc.buflen = 0xff;
++	cgc.cmd[9] = cgc.buflen & 0xff;
+ 
+ 	if ((ret = cdo->generic_packet(cdi, &cgc)))
+ 		return ret;
+diff --git a/drivers/infiniband/hw/mthca/mthca_reset.c b/drivers/infiniband/hw/mthca/mthca_reset.c
+index df5e494..f4fddd5 100644
+--- a/drivers/infiniband/hw/mthca/mthca_reset.c
++++ b/drivers/infiniband/hw/mthca/mthca_reset.c
+@@ -49,6 +49,12 @@ int mthca_reset(struct mthca_dev *mdev)
+ 	u32 *hca_header    = NULL;
+ 	u32 *bridge_header = NULL;
+ 	struct pci_dev *bridge = NULL;
++	int bridge_pcix_cap = 0;
++	int hca_pcie_cap = 0;
++	int hca_pcix_cap = 0;
++
++	u16 devctl;
++	u16 linkctl;
+ 
+ #define MTHCA_RESET_OFFSET 0xf0010
+ #define MTHCA_RESET_VALUE  swab32(1)
+@@ -110,6 +116,9 @@ #define MTHCA_RESET_VALUE  swab32(1)
+ 		}
+ 	}
+ 
++	hca_pcix_cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX);
++	hca_pcie_cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_EXP);
++
+ 	if (bridge) {
+ 		bridge_header = kmalloc(256, GFP_KERNEL);
+ 		if (!bridge_header) {
+@@ -129,6 +138,13 @@ #define MTHCA_RESET_VALUE  swab32(1)
+ 				goto out;
+ 			}
+ 		}
++		bridge_pcix_cap = pci_find_capability(bridge, PCI_CAP_ID_PCIX);
++		if (!bridge_pcix_cap) {
++				err = -ENODEV;
++				mthca_err(mdev, "Couldn't locate HCA bridge "
++					  "PCI-X capability, aborting.\n");
++				goto out;
++		}
+ 	}
+ 
+ 	/* actually hit reset */
+@@ -178,6 +194,20 @@ #define MTHCA_RESET_VALUE  swab32(1)
+ good:
+ 	/* Now restore the PCI headers */
+ 	if (bridge) {
++		if (pci_write_config_dword(bridge, bridge_pcix_cap + 0x8,
++				 bridge_header[(bridge_pcix_cap + 0x8) / 4])) {
++			err = -ENODEV;
++			mthca_err(mdev, "Couldn't restore HCA bridge Upstream "
++				  "split transaction control, aborting.\n");
++			goto out;
++		}
++		if (pci_write_config_dword(bridge, bridge_pcix_cap + 0xc,
++				 bridge_header[(bridge_pcix_cap + 0xc) / 4])) {
++			err = -ENODEV;
++			mthca_err(mdev, "Couldn't restore HCA bridge Downstream "
++				  "split transaction control, aborting.\n");
++			goto out;
++		}
+ 		/*
+ 		 * Bridge control register is at 0x3e, so we'll
+ 		 * naturally restore it last in this loop.
+@@ -203,6 +233,35 @@ good:
+ 		}
+ 	}
+ 
++	if (hca_pcix_cap) {
++		if (pci_write_config_dword(mdev->pdev, hca_pcix_cap,
++				 hca_header[hca_pcix_cap / 4])) {
++			err = -ENODEV;
++			mthca_err(mdev, "Couldn't restore HCA PCI-X "
++				  "command register, aborting.\n");
++			goto out;
++		}
++	}
++
++	if (hca_pcie_cap) {
++		devctl = hca_header[(hca_pcie_cap + PCI_EXP_DEVCTL) / 4];
++		if (pci_write_config_word(mdev->pdev, hca_pcie_cap + PCI_EXP_DEVCTL,
++					   devctl)) {
++			err = -ENODEV;
++			mthca_err(mdev, "Couldn't restore HCA PCI Express "
++				  "Device Control register, aborting.\n");
++			goto out;
++		}
++		linkctl = hca_header[(hca_pcie_cap + PCI_EXP_LNKCTL) / 4];
++		if (pci_write_config_word(mdev->pdev, hca_pcie_cap + PCI_EXP_LNKCTL,
++					   linkctl)) {
++			err = -ENODEV;
++			mthca_err(mdev, "Couldn't restore HCA PCI Express "
++				  "Link control register, aborting.\n");
++			goto out;
++		}
++	}
++
+ 	for (i = 0; i < 16; ++i) {
+ 		if (i * 4 == PCI_COMMAND)
+ 			continue;
+diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+index ccc7b2e..0bcaa35 100644
+--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c
++++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c
+@@ -184,6 +184,11 @@ static struct mt352_config thomson_dtt75
+ 	.pll_set = thomson_dtt7579_pll_set,
+ };
+ 
++static struct zl10353_config thomson_dtt7579_zl10353_config = {
++	.demod_address = 0x0f,
++	.pll_set = thomson_dtt7579_pll_set,
++};
++
+ static int cx24108_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params)
+ {
+ 	u32 freq = params->frequency;
+@@ -617,6 +622,11 @@ static void frontend_init(struct dvb_bt8
+ 	switch(type) {
+ 	case BTTV_BOARD_DVICO_DVBT_LITE:
+ 		card->fe = mt352_attach(&thomson_dtt7579_config, card->i2c_adapter);
++
++		if (card->fe == NULL)
++			card->fe = zl10353_attach(&thomson_dtt7579_zl10353_config,
++						  card->i2c_adapter);
++
+ 		if (card->fe != NULL) {
+ 			card->fe->ops->info.frequency_min = 174000000;
+ 			card->fe->ops->info.frequency_max = 862000000;
+diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.h b/drivers/media/dvb/bt8xx/dvb-bt8xx.h
+index 00dd9fa..e41066a 100644
+--- a/drivers/media/dvb/bt8xx/dvb-bt8xx.h
++++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.h
+@@ -37,6 +37,7 @@ #include "nxt6000.h"
+ #include "cx24110.h"
+ #include "or51211.h"
+ #include "lgdt330x.h"
++#include "zl10353.h"
+ 
+ struct dvb_bt8xx_card {
+ 	struct mutex lock;
+diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
+index a051790..cb69372 100644
+--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
++++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
+@@ -519,7 +519,9 @@ static int dvb_frontend_thread(void *dat
+ 	fepriv->delay = 3*HZ;
+ 	fepriv->status = 0;
+ 	fepriv->wakeup = 0;
+-	fepriv->reinitialise = 1;
++	fepriv->reinitialise = 0;
++
++	dvb_frontend_init(fe);
+ 
+ 	while (1) {
+ 		up(&fepriv->sem);	    /* is locked when we enter the thread... */
+@@ -996,17 +998,17 @@ static int dvb_frontend_open(struct inod
+ 		return ret;
+ 
+ 	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
++		/* normal tune mode when opened R/W */
++		fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
++		fepriv->tone = -1;
++		fepriv->voltage = -1;
++
+ 		ret = dvb_frontend_start (fe);
+ 		if (ret)
+ 			dvb_generic_release (inode, file);
+ 
+ 		/*  empty event queue */
+ 		fepriv->events.eventr = fepriv->events.eventw = 0;
+-
+-		/* normal tune mode when opened R/W */
+-		fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
+-		fepriv->tone = -1;
+-		fepriv->voltage = -1;
+ 	}
+ 
+ 	return ret;
+diff --git a/drivers/media/dvb/frontends/dvb-pll.c b/drivers/media/dvb/frontends/dvb-pll.c
+index 791706e..40930a3 100644
+--- a/drivers/media/dvb/frontends/dvb-pll.c
++++ b/drivers/media/dvb/frontends/dvb-pll.c
+@@ -194,11 +194,11 @@ struct dvb_pll_desc dvb_pll_tda665x = {
+ 		{  253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0  10 */ },
+ 		{  383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0  10 */ },
+ 		{  443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
+-		{  444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0  11 */ },
+-		{  583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0  11 */ },
+-		{  793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0  11 */ },
+-		{  444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0  11 */ },
+-		{  861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0  11 */ },
++		{  444000000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
++		{  583834000, 36249333, 166667, 0xca, 0x64 /* 011 0 0 1  00 */ },
++		{  793834000, 36249333, 166667, 0xca, 0xa4 /* 101 0 0 1  00 */ },
++		{  444834000, 36249333, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
++		{  861000000, 36249333, 166667, 0xca, 0xe4 /* 111 0 0 1  00 */ },
+ 	}
+ };
+ EXPORT_SYMBOL(dvb_pll_tda665x);
+diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c
+index 8a7cd7d..aaaae40 100644
+--- a/drivers/media/dvb/ttpci/budget-av.c
++++ b/drivers/media/dvb/ttpci/budget-av.c
+@@ -1017,12 +1017,13 @@ static void frontend_init(struct budget_
+ 	struct saa7146_dev * saa = budget_av->budget.dev;
+ 	struct dvb_frontend * fe = NULL;
+ 
++	/* Enable / PowerON Frontend */
++	saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);
++
+ 	switch (saa->pci->subsystem_device) {
+ 		case SUBID_DVBS_KNC1_PLUS:
+ 		case SUBID_DVBC_KNC1_PLUS:
+ 		case SUBID_DVBT_KNC1_PLUS:
+-			// Enable / PowerON Frontend
+-			saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);
+ 			saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTHI);
+ 			break;
+ 	}
+@@ -1059,6 +1060,15 @@ static void frontend_init(struct budget_
+ 		break;
+ 
+ 	case SUBID_DVBC_KNC1:
++		budget_av->reinitialise_demod = 1;
++		fe = tda10021_attach(&philips_cu1216_config,
++				     &budget_av->budget.i2c_adap,
++				     read_pwm(budget_av));
++		if (fe) {
++			fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params;
++		}
++		break;
++
+ 	case SUBID_DVBC_KNC1_PLUS:
+ 		fe = tda10021_attach(&philips_cu1216_config,
+ 				     &budget_av->budget.i2c_adap,
+@@ -1208,11 +1218,7 @@ static int budget_av_attach(struct saa71
+ 
+ 	budget_av->budget.dvb_adapter.priv = budget_av;
+ 	frontend_init(budget_av);
+-
+-	if (!budget_av->has_saa7113) {
+-		ciintf_init(budget_av);
+-	}
+-
++	ciintf_init(budget_av);
+ 	return 0;
+ }
+ 
+diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c
+index c23c02d..3cdc767 100644
+--- a/drivers/media/dvb/ttpci/budget.c
++++ b/drivers/media/dvb/ttpci/budget.c
+@@ -367,12 +367,6 @@ static void frontend_init(struct budget 
+ 
+ 		// try the ALPS BSRU6 now
+ 		budget->dvb_frontend = stv0299_attach(&alps_bsru6_config, &budget->i2c_adap);
+-		if (budget->dvb_frontend) {
+-			budget->dvb_frontend->ops->diseqc_send_master_cmd = budget_diseqc_send_master_cmd;
+-			budget->dvb_frontend->ops->diseqc_send_burst = budget_diseqc_send_burst;
+-			budget->dvb_frontend->ops->set_tone = budget_set_tone;
+-			break;
+-		}
+ 		break;
+ 
+ 	case 0x1004: // Hauppauge/TT DVB-C budget (ves1820/ALPS TDBE2(sp5659))
+diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
+index 6b41970..67d729a 100644
+--- a/drivers/media/video/Kconfig
++++ b/drivers/media/video/Kconfig
+@@ -380,10 +380,10 @@ config VIDEO_WM8739
+ source "drivers/media/video/cx25840/Kconfig"
+ 
+ config VIDEO_SAA711X
+-	tristate "Philips SAA7113/4/5 video decoders (OBSOLETED)"
+-	depends on VIDEO_V4L1 && I2C && EXPERIMENTAL
++	tristate "Philips SAA7113/4/5 video decoders"
++	depends on VIDEO_DEV && I2C && EXPERIMENTAL
+ 	---help---
+-	  Old support for the Philips SAA7113/4 video decoders.
++	  Support for the Philips SAA7113/4/5 video decoders.
+ 
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called saa7115.
+diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c
+index 07476c7..af372dd 100644
+--- a/drivers/media/video/stradis.c
++++ b/drivers/media/video/stradis.c
+@@ -2180,7 +2180,6 @@ static struct pci_device_id stradis_pci_
+ 	{ 0 }
+ };
+ 
+-MODULE_DEVICE_TABLE(pci, stradis_pci_tbl);
+ 
+ static struct pci_driver stradis_driver = {
+ 	.name = "stradis",
+diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c
+index ed1f837..6e59ab5 100644
+--- a/drivers/net/via-velocity.c
++++ b/drivers/net/via-velocity.c
+@@ -248,6 +248,7 @@ static void velocity_free_rd_ring(struct
+ static void velocity_free_tx_buf(struct velocity_info *vptr, struct velocity_td_info *);
+ static int velocity_soft_reset(struct velocity_info *vptr);
+ static void mii_init(struct velocity_info *vptr, u32 mii_status);
++static u32 velocity_get_link(struct net_device *dev);
+ static u32 velocity_get_opt_media_mode(struct velocity_info *vptr);
+ static void velocity_print_link_status(struct velocity_info *vptr);
+ static void safe_disable_mii_autopoll(struct mac_regs __iomem * regs);
+@@ -798,6 +799,9 @@ #endif
+ 	if (ret < 0)
+ 		goto err_iounmap;
+ 
++	if (velocity_get_link(dev))
++		netif_carrier_off(dev);
++
+ 	velocity_print_info(vptr);
+ 	pci_set_drvdata(pdev, dev);
+ 	
+@@ -1653,8 +1657,10 @@ static void velocity_error(struct veloci
+ 
+ 		if (linked) {
+ 			vptr->mii_status &= ~VELOCITY_LINK_FAIL;
++			netif_carrier_on(vptr->dev);
+ 		} else {
+ 			vptr->mii_status |= VELOCITY_LINK_FAIL;
++			netif_carrier_off(vptr->dev);
+ 		}
+ 
+ 		velocity_print_link_status(vptr);
+diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c
+index 6ded527..688421d 100644
+--- a/drivers/pnp/resource.c
++++ b/drivers/pnp/resource.c
+@@ -396,7 +396,8 @@ #endif
+ 	/* check if the resource is already in use, skip if the
+ 	 * device is active because it itself may be in use */
+ 	if(!dev->active) {
+-		if (request_irq(*irq, pnp_test_handler, SA_INTERRUPT, "pnp", NULL))
++		if (request_irq(*irq, pnp_test_handler,
++				SA_INTERRUPT|SA_PROBEIRQ, "pnp", NULL))
+ 			return 0;
+ 		free_irq(*irq, NULL);
+ 	}
+diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
+index bbf78aa..3863eba 100644
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -2241,10 +2241,14 @@ serial8250_console_write(struct console 
+ 
+ 	touch_nmi_watchdog();
+ 
+-	if (oops_in_progress) {
+-		locked = spin_trylock_irqsave(&up->port.lock, flags);
++	local_irq_save(flags);
++	if (up->port.sysrq) {
++		/* serial8250_handle_port() already took the lock */
++		locked = 0;
++	} else if (oops_in_progress) {
++		locked = spin_trylock(&up->port.lock);
+ 	} else
+-		spin_lock_irqsave(&up->port.lock, flags);
++		spin_lock(&up->port.lock);
+ 
+ 	/*
+ 	 *	First save the IER then disable the interrupts
+@@ -2266,7 +2270,8 @@ serial8250_console_write(struct console 
+ 	serial_out(up, UART_IER, ier);
+ 
+ 	if (locked)
+-		spin_unlock_irqrestore(&up->port.lock, flags);
++		spin_unlock(&up->port.lock);
++	local_irq_restore(flags);
+ }
+ 
+ static int serial8250_console_setup(struct console *co, char *options)
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 986d762..ad9ddec 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -553,6 +553,10 @@ struct ftdi_private {
+ 
+ 	int force_baud;		/* if non-zero, force the baud rate to this value */
+ 	int force_rtscts;	/* if non-zero, force RTS-CTS to always be enabled */
++
++	spinlock_t tx_lock;	/* spinlock for transmit state */
++	unsigned long tx_outstanding_bytes;
++	unsigned long tx_outstanding_urbs;
+ };
+ 
+ /* Used for TIOCMIWAIT */
+@@ -626,6 +630,9 @@ #define WDR_SHORT_TIMEOUT 1000	/* shorte
+ #define HIGH 1
+ #define LOW 0
+ 
++/* number of outstanding urbs to prevent userspace DoS from happening */
++#define URB_UPPER_LIMIT	42
++
+ /*
+  * ***************************************************************************
+  * Utlity functions
+@@ -1156,6 +1163,7 @@ static int ftdi_sio_attach (struct usb_s
+ 	}
+ 
+ 	spin_lock_init(&priv->rx_lock);
++	spin_lock_init(&priv->tx_lock);
+         init_waitqueue_head(&priv->delta_msr_wait);
+ 	/* This will push the characters through immediately rather
+ 	   than queue a task to deliver them */
+@@ -1372,6 +1380,7 @@ static int ftdi_write (struct usb_serial
+ 	int data_offset ;       /* will be 1 for the SIO and 0 otherwise */
+ 	int status;
+ 	int transfer_size;
++	unsigned long flags;
+ 
+ 	dbg("%s port %d, %d bytes", __FUNCTION__, port->number, count);
+ 
+@@ -1379,6 +1388,13 @@ static int ftdi_write (struct usb_serial
+ 		dbg("write request of 0 bytes");
+ 		return 0;
+ 	}
++	spin_lock_irqsave(&priv->tx_lock, flags);
++	if (priv->tx_outstanding_urbs > URB_UPPER_LIMIT) {
++		spin_unlock_irqrestore(&priv->tx_lock, flags);
++		dbg("%s - write limit hit\n", __FUNCTION__);
++		return 0;
++	}
++	spin_unlock_irqrestore(&priv->tx_lock, flags);
+ 	
+ 	data_offset = priv->write_offset;
+         dbg("data_offset set to %d",data_offset);
+@@ -1445,6 +1461,11 @@ static int ftdi_write (struct usb_serial
+ 		err("%s - failed submitting write urb, error %d", __FUNCTION__, status);
+ 		count = status;
+ 		kfree (buffer);
++	} else {
++		spin_lock_irqsave(&priv->tx_lock, flags);
++		++priv->tx_outstanding_urbs;
++		priv->tx_outstanding_bytes += count;
++		spin_unlock_irqrestore(&priv->tx_lock, flags);
+ 	}
+ 
+ 	/* we are done with this urb, so let the host driver
+@@ -1460,7 +1481,11 @@ static int ftdi_write (struct usb_serial
+ 
+ static void ftdi_write_bulk_callback (struct urb *urb, struct pt_regs *regs)
+ {
++	unsigned long flags;
+ 	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
++	struct ftdi_private *priv;
++	int data_offset;       /* will be 1 for the SIO and 0 otherwise */
++	unsigned long countback;
+ 
+ 	/* free up the transfer buffer, as usb_free_urb() does not do this */
+ 	kfree (urb->transfer_buffer);
+@@ -1472,34 +1497,67 @@ static void ftdi_write_bulk_callback (st
+ 		return;
+ 	}
+ 
++	priv = usb_get_serial_port_data(port);
++	if (!priv) {
++		dbg("%s - bad port private data pointer - exiting", __FUNCTION__);
++		return;
++	}
++	/* account for transferred data */
++	countback = urb->actual_length;
++	data_offset = priv->write_offset;
++	if (data_offset > 0) {
++		/* Subtract the control bytes */
++		countback -= (data_offset * ((countback + (PKTSZ - 1)) / PKTSZ));
++	}
++	spin_lock_irqsave(&priv->tx_lock, flags);
++	--priv->tx_outstanding_urbs;
++	priv->tx_outstanding_bytes -= countback;
++	spin_unlock_irqrestore(&priv->tx_lock, flags);
++
+ 	schedule_work(&port->work);
+ } /* ftdi_write_bulk_callback */
+ 
+ 
+ static int ftdi_write_room( struct usb_serial_port *port )
+ {
++	struct ftdi_private *priv = usb_get_serial_port_data(port);
++	int room;
++	unsigned long flags;
++
+ 	dbg("%s - port %d", __FUNCTION__, port->number);
+ 
+-	/*
+-	 * We really can take anything the user throws at us
+-	 * but let's pick a nice big number to tell the tty
+-	 * layer that we have lots of free space
+-	 */
+-	return 2048;
++	spin_lock_irqsave(&priv->tx_lock, flags);
++	if (priv->tx_outstanding_urbs < URB_UPPER_LIMIT) {
++		/*
++		 * We really can take anything the user throws at us
++		 * but let's pick a nice big number to tell the tty
++		 * layer that we have lots of free space
++		 */
++		room = 2048;
++	} else {
++		room = 0;
++	}
++	spin_unlock_irqrestore(&priv->tx_lock, flags);
++	return room;
+ } /* ftdi_write_room */
+ 
+ 
+ static int ftdi_chars_in_buffer (struct usb_serial_port *port)
+ { /* ftdi_chars_in_buffer */
++	struct ftdi_private *priv = usb_get_serial_port_data(port);
++	int buffered;
++	unsigned long flags;
++
+ 	dbg("%s - port %d", __FUNCTION__, port->number);
+ 
+-	/* 
+-	 * We can't really account for how much data we
+-	 * have sent out, but hasn't made it through to the
+-	 * device, so just tell the tty layer that everything
+-	 * is flushed.
+-	 */
+-	return 0;
++	spin_lock_irqsave(&priv->tx_lock, flags);
++	buffered = (int)priv->tx_outstanding_bytes;
++	spin_unlock_irqrestore(&priv->tx_lock, flags);
++	if (buffered < 0) {
++		err("%s outstanding tx bytes is negative!", __FUNCTION__);
++		buffered = 0;
++	}
++	return buffered;
+ } /* ftdi_chars_in_buffer */
+ 
+ 
+diff --git a/fs/file.c b/fs/file.c
+index 55f4e70..4c2cacc 100644
+--- a/fs/file.c
++++ b/fs/file.c
+@@ -277,11 +277,13 @@ #endif
+ 	} while (nfds <= nr);
+ 	new_fds = alloc_fd_array(nfds);
+ 	if (!new_fds)
+-		goto out;
++		goto out2;
+ 	fdt->fd = new_fds;
+ 	fdt->max_fds = nfds;
+ 	fdt->free_files = NULL;
+ 	return fdt;
++out2:
++	nfds = fdt->max_fdset;
+ out:
+   	if (new_openset)
+   		free_fdset(new_openset, nfds);
+diff --git a/fs/namei.c b/fs/namei.c
+index d6e2ee2..21be124 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1712,8 +1712,14 @@ do_link:
+ 	if (error)
+ 		goto exit_dput;
+ 	error = __do_follow_link(&path, nd);
+-	if (error)
++	if (error) {
++		/* Does someone understand code flow here? Or it is only
++		 * me so stupid? Anathema to whoever designed this non-sense
++		 * with "intent.open".
++		 */
++		release_open_intent(nd);
+ 		return error;
++	}
+ 	nd->flags &= ~LOOKUP_PARENT;
+ 	if (nd->last_type == LAST_BIND)
+ 		goto ok;
+diff --git a/fs/splice.c b/fs/splice.c
+index a285fd7..8fef667 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -1295,6 +1295,85 @@ asmlinkage long sys_splice(int fd_in, lo
+ }
+ 
+ /*
++ * Make sure there's data to read. Wait for input if we can, otherwise
++ * return an appropriate error.
++ */
++static int link_ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
++{
++	int ret;
++
++	/*
++	 * Check ->nrbufs without the inode lock first. This function
++	 * is speculative anyways, so missing one is ok.
++	 */
++	if (pipe->nrbufs)
++		return 0;
++
++	ret = 0;
++	mutex_lock(&pipe->inode->i_mutex);
++
++	while (!pipe->nrbufs) {
++		if (signal_pending(current)) {
++			ret = -ERESTARTSYS;
++			break;
++		}
++		if (!pipe->writers)
++			break;
++		if (!pipe->waiting_writers) {
++			if (flags & SPLICE_F_NONBLOCK) {
++				ret = -EAGAIN;
++				break;
++			}
++		}
++		pipe_wait(pipe);
++	}
++
++	mutex_unlock(&pipe->inode->i_mutex);
++	return ret;
++}
++
++/*
++ * Make sure there's writeable room. Wait for room if we can, otherwise
++ * return an appropriate error.
++ */
++static int link_opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
++{
++	int ret;
++
++	/*
++	 * Check ->nrbufs without the inode lock first. This function
++	 * is speculative anyways, so missing one is ok.
++	 */
++	if (pipe->nrbufs < PIPE_BUFFERS)
++		return 0;
++
++	ret = 0;
++	mutex_lock(&pipe->inode->i_mutex);
++
++	while (pipe->nrbufs >= PIPE_BUFFERS) {
++		if (!pipe->readers) {
++			send_sig(SIGPIPE, current, 0);
++			ret = -EPIPE;
++			break;
++		}
++		if (flags & SPLICE_F_NONBLOCK) {
++			ret = -EAGAIN;
++			break;
++		}
++		if (signal_pending(current)) {
++			ret = -ERESTARTSYS;
++			break;
++		}
++		pipe->waiting_writers++;
++		pipe_wait(pipe);
++		pipe->waiting_writers--;
++	}
++
++	mutex_unlock(&pipe->inode->i_mutex);
++	return ret;
++}
++
++/*
+  * Link contents of ipipe to opipe.
+  */
+ static int link_pipe(struct pipe_inode_info *ipipe,
+@@ -1302,9 +1381,7 @@ static int link_pipe(struct pipe_inode_i
+ 		     size_t len, unsigned int flags)
+ {
+ 	struct pipe_buffer *ibuf, *obuf;
+-	int ret, do_wakeup, i, ipipe_first;
+-
+-	ret = do_wakeup = ipipe_first = 0;
++	int ret = 0, i = 0, nbuf;
+ 
+ 	/*
+ 	 * Potential ABBA deadlock, work around it by ordering lock
+@@ -1312,7 +1389,6 @@ static int link_pipe(struct pipe_inode_i
+ 	 * could deadlock (one doing tee from A -> B, the other from B -> A).
+ 	 */
+ 	if (ipipe->inode < opipe->inode) {
+-		ipipe_first = 1;
+ 		mutex_lock(&ipipe->inode->i_mutex);
+ 		mutex_lock(&opipe->inode->i_mutex);
+ 	} else {
+@@ -1320,118 +1396,55 @@ static int link_pipe(struct pipe_inode_i
+ 		mutex_lock(&ipipe->inode->i_mutex);
+ 	}
+ 
+-	for (i = 0;; i++) {
++	do {
+ 		if (!opipe->readers) {
+ 			send_sig(SIGPIPE, current, 0);
+ 			if (!ret)
+ 				ret = -EPIPE;
+ 			break;
+ 		}
+-		if (ipipe->nrbufs - i) {
+-			ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
+ 
+-			/*
+-			 * If we have room, fill this buffer
+-			 */
+-			if (opipe->nrbufs < PIPE_BUFFERS) {
+-				int nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
+-
+-				/*
+-				 * Get a reference to this pipe buffer,
+-				 * so we can copy the contents over.
+-				 */
+-				ibuf->ops->get(ipipe, ibuf);
+-
+-				obuf = opipe->bufs + nbuf;
+-				*obuf = *ibuf;
+-
+-				/*
+-				 * Don't inherit the gift flag, we need to
+-				 * prevent multiple steals of this page.
+-				 */
+-				obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
+-
+-				if (obuf->len > len)
+-					obuf->len = len;
+-
+-				opipe->nrbufs++;
+-				do_wakeup = 1;
+-				ret += obuf->len;
+-				len -= obuf->len;
+-
+-				if (!len)
+-					break;
+-				if (opipe->nrbufs < PIPE_BUFFERS)
+-					continue;
+-			}
+-
+-			/*
+-			 * We have input available, but no output room.
+-			 * If we already copied data, return that. If we
+-			 * need to drop the opipe lock, it must be ordered
+-			 * last to avoid deadlocks.
+-			 */
+-			if ((flags & SPLICE_F_NONBLOCK) || !ipipe_first) {
+-				if (!ret)
+-					ret = -EAGAIN;
+-				break;
+-			}
+-			if (signal_pending(current)) {
+-				if (!ret)
+-					ret = -ERESTARTSYS;
+-				break;
+-			}
+-			if (do_wakeup) {
+-				smp_mb();
+-				if (waitqueue_active(&opipe->wait))
+-					wake_up_interruptible(&opipe->wait);
+-				kill_fasync(&opipe->fasync_readers, SIGIO, POLL_IN);
+-				do_wakeup = 0;
+-			}
++		/*
++		 * If we have iterated all input buffers or ran out of
++		 * output room, break.
++		 */
++		if (i >= ipipe->nrbufs || opipe->nrbufs >= PIPE_BUFFERS)
++			break;
+ 
+-			opipe->waiting_writers++;
+-			pipe_wait(opipe);
+-			opipe->waiting_writers--;
+-			continue;
+-		}
++		ibuf = ipipe->bufs + ((ipipe->curbuf + i) & (PIPE_BUFFERS - 1));
++		nbuf = (opipe->curbuf + opipe->nrbufs) & (PIPE_BUFFERS - 1);
+ 
+ 		/*
+-		 * No input buffers, do the usual checks for available
+-		 * writers and blocking and wait if necessary
++		 * Get a reference to this pipe buffer,
++		 * so we can copy the contents over.
+ 		 */
+-		if (!ipipe->writers)
+-			break;
+-		if (!ipipe->waiting_writers) {
+-			if (ret)
+-				break;
+-		}
++		ibuf->ops->get(ipipe, ibuf);
++
++		obuf = opipe->bufs + nbuf;
++		*obuf = *ibuf;
++
+ 		/*
+-		 * pipe_wait() drops the ipipe mutex. To avoid deadlocks
+-		 * with another process, we can only safely do that if
+-		 * the ipipe lock is ordered last.
++		 * Don't inherit the gift flag, we need to
++		 * prevent multiple steals of this page.
+ 		 */
+-		if ((flags & SPLICE_F_NONBLOCK) || ipipe_first) {
+-			if (!ret)
+-				ret = -EAGAIN;
+-			break;
+-		}
+-		if (signal_pending(current)) {
+-			if (!ret)
+-				ret = -ERESTARTSYS;
+-			break;
+-		}
++		obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
+ 
+-		if (waitqueue_active(&ipipe->wait))
+-			wake_up_interruptible_sync(&ipipe->wait);
+-		kill_fasync(&ipipe->fasync_writers, SIGIO, POLL_OUT);
++		if (obuf->len > len)
++			obuf->len = len;
+ 
+-		pipe_wait(ipipe);
+-	}
++		opipe->nrbufs++;
++		ret += obuf->len;
++		len -= obuf->len;
++		i++;
++	} while (len);
+ 
+ 	mutex_unlock(&ipipe->inode->i_mutex);
+ 	mutex_unlock(&opipe->inode->i_mutex);
+ 
+-	if (do_wakeup) {
++	/*
++	 * If we put data in the output pipe, wakeup any potential readers.
++	 */
++	if (ret > 0) {
+ 		smp_mb();
+ 		if (waitqueue_active(&opipe->wait))
+ 			wake_up_interruptible(&opipe->wait);
+@@ -1452,14 +1465,29 @@ static long do_tee(struct file *in, stru
+ {
+ 	struct pipe_inode_info *ipipe = in->f_dentry->d_inode->i_pipe;
+ 	struct pipe_inode_info *opipe = out->f_dentry->d_inode->i_pipe;
++	int ret = -EINVAL;
+ 
+ 	/*
+-	 * Link ipipe to the two output pipes, consuming as we go along.
++	 * Duplicate the contents of ipipe to opipe without actually
++	 * copying the data.
+ 	 */
+-	if (ipipe && opipe)
+-		return link_pipe(ipipe, opipe, len, flags);
++	if (ipipe && opipe && ipipe != opipe) {
++		/*
++		 * Keep going, unless we encounter an error. The ipipe/opipe
++		 * ordering doesn't really matter.
++		 */
++		ret = link_ipipe_prep(ipipe, flags);
++		if (!ret) {
++			ret = link_opipe_prep(opipe, flags);
++			if (!ret) {
++				ret = link_pipe(ipipe, opipe, len, flags);
++				if (!ret && (flags & SPLICE_F_NONBLOCK))
++					ret = -EAGAIN;
++			}
++		}
++	}
+ 
+-	return -EINVAL;
++	return ret;
+ }
+ 
+ asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags)
+diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c
+index ac511ab..0655cc3 100644
+--- a/fs/xfs/xfs_dir2_node.c
++++ b/fs/xfs/xfs_dir2_node.c
+@@ -970,7 +970,7 @@ xfs_dir2_leafn_remove(
+ 			/*
+ 			 * One less used entry in the free table.
+ 			 */
+-			free->hdr.nused = cpu_to_be32(-1);
++			be32_add(&free->hdr.nused, -1);
+ 			xfs_dir2_free_log_header(tp, fbp);
+ 			/*
+ 			 * If this was the last entry in the table, we can
+diff --git a/include/sound/initval.h b/include/sound/initval.h
+index d29e3d3..d45170b 100644
+--- a/include/sound/initval.h
++++ b/include/sound/initval.h
+@@ -62,7 +62,8 @@ static int snd_legacy_find_free_irq(int 
+ {
+ 	while (*irq_table != -1) {
+ 		if (!request_irq(*irq_table, snd_legacy_empty_irq_handler,
+-				 SA_INTERRUPT, "ALSA Test IRQ", (void *) irq_table)) {
++				 SA_INTERRUPT | SA_PROBEIRQ, "ALSA Test IRQ",
++				 (void *) irq_table)) {
+ 			free_irq(*irq_table, (void *) irq_table);
+ 			return *irq_table;
+ 		}
+diff --git a/mm/Kconfig b/mm/Kconfig
+index 332f5c2..8b13ca3 100644
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -115,7 +115,7 @@ config SPARSEMEM_EXTREME
+ # eventually, we can have this option just 'select SPARSEMEM'
+ config MEMORY_HOTPLUG
+ 	bool "Allow for memory hot-add"
+-	depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND
++	depends on SPARSEMEM && HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG
+ 
+ comment "Memory hotplug is currently incompatible with Software Suspend"
+ 	depends on SPARSEMEM && HOTPLUG && SOFTWARE_SUSPEND
+diff --git a/mm/filemap.c b/mm/filemap.c
+index fd57442..4655fa0 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -2004,14 +2004,21 @@ generic_file_buffered_write(struct kiocb
+ 	do {
+ 		unsigned long index;
+ 		unsigned long offset;
+-		unsigned long maxlen;
+ 		size_t copied;
+ 
+ 		offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */
+ 		index = pos >> PAGE_CACHE_SHIFT;
+ 		bytes = PAGE_CACHE_SIZE - offset;
+-		if (bytes > count)
+-			bytes = count;
++
++		/* Limit the size of the copy to the caller's write size */
++		bytes = min(bytes, count);
++
++		/*
++		 * Limit the size of the copy to that of the current segment,
++		 * because fault_in_pages_readable() doesn't know how to walk
++		 * segments.
++		 */
++		bytes = min(bytes, cur_iov->iov_len - iov_base);
+ 
+ 		/*
+ 		 * Bring in the user page that we will copy from _first_.
+@@ -2019,10 +2026,7 @@ generic_file_buffered_write(struct kiocb
+ 		 * same page as we're writing to, without it being marked
+ 		 * up-to-date.
+ 		 */
+-		maxlen = cur_iov->iov_len - iov_base;
+-		if (maxlen > bytes)
+-			maxlen = bytes;
+-		fault_in_pages_readable(buf, maxlen);
++		fault_in_pages_readable(buf, bytes);
+ 
+ 		page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
+ 		if (!page) {
+@@ -2030,6 +2034,12 @@ generic_file_buffered_write(struct kiocb
+ 			break;
+ 		}
+ 
++		if (unlikely(bytes == 0)) {
++			status = 0;
++			copied = 0;
++			goto zero_length_segment;
++		}
++
+ 		status = a_ops->prepare_write(file, page, offset, offset+bytes);
+ 		if (unlikely(status)) {
+ 			loff_t isize = i_size_read(inode);
+@@ -2059,7 +2069,8 @@ generic_file_buffered_write(struct kiocb
+ 			page_cache_release(page);
+ 			continue;
+ 		}
+-		if (likely(copied > 0)) {
++zero_length_segment:
++		if (likely(copied >= 0)) {
+ 			if (!status)
+ 				status = copied;
+ 
+diff --git a/mm/filemap.h b/mm/filemap.h
+index 13793ba..efd0142 100644
+--- a/mm/filemap.h
++++ b/mm/filemap.h
+@@ -78,7 +78,7 @@ filemap_set_next_iovec(const struct iove
+ 	const struct iovec *iov = *iovp;
+ 	size_t base = *basep;
+ 
+-	while (bytes) {
++	do {
+ 		int copy = min(bytes, iov->iov_len - base);
+ 
+ 		bytes -= copy;
+@@ -87,7 +87,7 @@ filemap_set_next_iovec(const struct iove
+ 			iov++;
+ 			base = 0;
+ 		}
+-	}
++	} while (bytes);
+ 	*iovp = iov;
+ 	*basep = base;
+ }
+diff --git a/mm/pdflush.c b/mm/pdflush.c
+index c4b6d0a..4842716 100644
+--- a/mm/pdflush.c
++++ b/mm/pdflush.c
+@@ -104,21 +104,20 @@ static int __pdflush(struct pdflush_work
+ 		list_move(&my_work->list, &pdflush_list);
+ 		my_work->when_i_went_to_sleep = jiffies;
+ 		spin_unlock_irq(&pdflush_lock);
+-
+ 		schedule();
+-		if (try_to_freeze()) {
+-			spin_lock_irq(&pdflush_lock);
+-			continue;
+-		}
+-
++		try_to_freeze();
+ 		spin_lock_irq(&pdflush_lock);
+ 		if (!list_empty(&my_work->list)) {
+-			printk("pdflush: bogus wakeup!\n");
++			/*
++			 * Someone woke us up, but without removing our control
++			 * structure from the global list.  swsusp will do this
++			 * in try_to_freeze()->refrigerator().  Handle it.
++			 */
+ 			my_work->fn = NULL;
+ 			continue;
+ 		}
+ 		if (my_work->fn == NULL) {
+-			printk("pdflush: NULL work function\n");
++			printk("pdflush: bogus wakeup\n");
+ 			continue;
+ 		}
+ 		spin_unlock_irq(&pdflush_lock);
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 4fba549..7d472ed 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -1246,6 +1246,7 @@ int __skb_linearize(struct sk_buff *skb,
+ 	atomic_set(&ninfo->dataref, 1);
+ 	ninfo->tso_size = skb_shinfo(skb)->tso_size;
+ 	ninfo->tso_segs = skb_shinfo(skb)->tso_segs;
++	ninfo->ufo_size = skb_shinfo(skb)->ufo_size;
+ 	ninfo->nr_frags = 0;
+ 	ninfo->frag_list = NULL;
+ 
+diff --git a/net/core/ethtool.c b/net/core/ethtool.c
+index c680b7e..4fe39cf 100644
+--- a/net/core/ethtool.c
++++ b/net/core/ethtool.c
+@@ -437,7 +437,7 @@ static int ethtool_set_pauseparam(struct
+ {
+ 	struct ethtool_pauseparam pauseparam;
+ 
+-	if (!dev->ethtool_ops->get_pauseparam)
++	if (!dev->ethtool_ops->set_pauseparam)
+ 		return -EOPNOTSUPP;
+ 
+ 	if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index fb3770f..0280535 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -240,6 +240,7 @@ struct sk_buff *alloc_skb_from_cache(kme
+ 	skb_shinfo(skb)->nr_frags  = 0;
+ 	skb_shinfo(skb)->tso_size = 0;
+ 	skb_shinfo(skb)->tso_segs = 0;
++	skb_shinfo(skb)->ufo_size = 0;
+ 	skb_shinfo(skb)->frag_list = NULL;
+ out:
+ 	return skb;
+@@ -529,6 +530,7 @@ #endif
+ 	atomic_set(&new->users, 1);
+ 	skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size;
+ 	skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs;
++	skb_shinfo(new)->ufo_size = skb_shinfo(old)->ufo_size;
+ }
+ 
+ /**
+diff --git a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c
+index 446faaf..2440d05 100644
+--- a/net/decnet/dn_rules.c
++++ b/net/decnet/dn_rules.c
+@@ -400,9 +400,10 @@ int dn_fib_dump_rules(struct sk_buff *sk
+ 	rcu_read_lock();
+ 	hlist_for_each_entry(r, node, &dn_fib_rules, r_hlist) {
+ 		if (idx < s_idx)
+-			continue;
++			goto next;
+ 		if (dn_fib_fill_rule(skb, r, cb, NLM_F_MULTI) < 0)
+ 			break;
++next:
+ 		idx++;
+ 	}
+ 	rcu_read_unlock();
+diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig
+index dbb0852..f7e84e9 100644
+--- a/net/ieee80211/Kconfig
++++ b/net/ieee80211/Kconfig
+@@ -58,6 +58,7 @@ config IEEE80211_CRYPT_TKIP
+ 	depends on IEEE80211 && NET_RADIO
+ 	select CRYPTO
+ 	select CRYPTO_MICHAEL_MIC
++	select CRC32
+ 	---help---
+ 	Include software based cipher suites in support of IEEE 802.11i
+ 	(aka TGi, WPA, WPA2, WPA-PSK, etc.) for use with TKIP enabled
+diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c
+index ec566f3..a66c96a 100644
+--- a/net/ipv4/fib_rules.c
++++ b/net/ipv4/fib_rules.c
+@@ -458,13 +458,13 @@ int inet_dump_rules(struct sk_buff *skb,
+ 
+ 	rcu_read_lock();
+ 	hlist_for_each_entry(r, node, &fib_rules, hlist) {
+-
+ 		if (idx < s_idx)
+-			continue;
++			goto next;
+ 		if (inet_fill_rule(skb, r, NETLINK_CB(cb->skb).pid,
+ 				   cb->nlh->nlmsg_seq,
+ 				   RTM_NEWRULE, NLM_F_MULTI) < 0)
+ 			break;
++next:
+ 		idx++;
+ 	}
+ 	rcu_read_unlock();
+diff --git a/net/sched/act_api.c b/net/sched/act_api.c
+index 2ffa11c..eb7dc29 100644
+--- a/net/sched/act_api.c
++++ b/net/sched/act_api.c
+@@ -251,15 +251,17 @@ tcf_action_dump(struct sk_buff *skb, str
+ 		RTA_PUT(skb, a->order, 0, NULL);
+ 		err = tcf_action_dump_1(skb, a, bind, ref);
+ 		if (err < 0)
+-			goto rtattr_failure;
++			goto errout;
+ 		r->rta_len = skb->tail - (u8*)r;
+ 	}
+ 
+ 	return 0;
+ 
+ rtattr_failure:
++	err = -EINVAL;
++errout:
+ 	skb_trim(skb, b - skb->data);
+-	return -err;
++	return err;
+ }
+ 
+ struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est,
+@@ -306,6 +308,7 @@ #ifdef CONFIG_KMOD
+ 			goto err_mod;
+ 		}
+ #endif
++		*err = -ENOENT;
+ 		goto err_out;
+ 	}
+ 
+@@ -777,7 +780,7 @@ replay:
+ 	return ret;
+ }
+ 
+-static char *
++static struct rtattr *
+ find_dump_kind(struct nlmsghdr *n)
+ {
+ 	struct rtattr *tb1, *tb2[TCA_ACT_MAX+1];
+@@ -805,7 +808,7 @@ find_dump_kind(struct nlmsghdr *n)
+ 		return NULL;
+ 	kind = tb2[TCA_ACT_KIND-1];
+ 
+-	return (char *) RTA_DATA(kind);
++	return kind;
+ }
+ 
+ static int
+@@ -818,16 +821,15 @@ tc_dump_action(struct sk_buff *skb, stru
+ 	struct tc_action a;
+ 	int ret = 0;
+ 	struct tcamsg *t = (struct tcamsg *) NLMSG_DATA(cb->nlh);
+-	char *kind = find_dump_kind(cb->nlh);
++	struct rtattr *kind = find_dump_kind(cb->nlh);
+ 
+ 	if (kind == NULL) {
+ 		printk("tc_dump_action: action bad kind\n");
+ 		return 0;
+ 	}
+ 
+-	a_o = tc_lookup_action_n(kind);
++	a_o = tc_lookup_action(kind);
+ 	if (a_o == NULL) {
+-		printk("failed to find %s\n", kind);
+ 		return 0;
+ 	}
+ 
+@@ -835,7 +837,7 @@ tc_dump_action(struct sk_buff *skb, stru
+ 	a.ops = a_o;
+ 
+ 	if (a_o->walk == NULL) {
+-		printk("tc_dump_action: %s !capable of dumping table\n", kind);
++		printk("tc_dump_action: %s !capable of dumping table\n", a_o->kind);
+ 		goto rtattr_failure;
+ 	}
+ 
+diff --git a/sound/core/timer.c b/sound/core/timer.c
+index cdeeb63..4585600 100644
+--- a/sound/core/timer.c
++++ b/sound/core/timer.c
+@@ -628,8 +628,9 @@ static void snd_timer_tasklet(unsigned l
+ 	struct snd_timer_instance *ti;
+ 	struct list_head *p;
+ 	unsigned long resolution, ticks;
++	unsigned long flags;
+ 
+-	spin_lock(&timer->lock);
++	spin_lock_irqsave(&timer->lock, flags);
+ 	/* now process all callbacks */
+ 	while (!list_empty(&timer->sack_list_head)) {
+ 		p = timer->sack_list_head.next;		/* get first item */
+@@ -649,7 +650,7 @@ static void snd_timer_tasklet(unsigned l
+ 		spin_lock(&timer->lock);
+ 		ti->flags &= ~SNDRV_TIMER_IFLG_CALLBACK;
+ 	}
+-	spin_unlock(&timer->lock);
++	spin_unlock_irqrestore(&timer->lock, flags);
+ }
+ 
+ /*
+diff --git a/sound/isa/cs423x/Makefile b/sound/isa/cs423x/Makefile
+index d2afaea..2fb4f74 100644
+--- a/sound/isa/cs423x/Makefile
++++ b/sound/isa/cs423x/Makefile
+@@ -11,6 +11,7 @@ snd-cs4236-objs := cs4236.o
+ 
+ # Toplevel Module Dependency
+ obj-$(CONFIG_SND_AZT2320) += snd-cs4231-lib.o
++obj-$(CONFIG_SND_MIRO) += snd-cs4231-lib.o
+ obj-$(CONFIG_SND_OPL3SA2) += snd-cs4231-lib.o
+ obj-$(CONFIG_SND_CS4231) += snd-cs4231.o snd-cs4231-lib.o
+ obj-$(CONFIG_SND_CS4232) += snd-cs4232.o snd-cs4231-lib.o
+diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig
+index a208180..8f34986 100644
+--- a/sound/pci/Kconfig
++++ b/sound/pci/Kconfig
+@@ -318,17 +318,19 @@ config SND_FM801
+ 	  To compile this driver as a module, choose M here: the module
+ 	  will be called snd-fm801.
+ 
+-config SND_FM801_TEA575X
+-	tristate "ForteMedia FM801 + TEA5757 tuner"
++config SND_FM801_TEA575X_BOOL
++	bool "ForteMedia FM801 + TEA5757 tuner"
+ 	depends on SND_FM801
+-        select VIDEO_DEV
+ 	help
+ 	  Say Y here to include support for soundcards based on the ForteMedia
+ 	  FM801 chip with a TEA5757 tuner connected to GPIO1-3 pins (Media
+-	  Forte SF256-PCS-02).
++	  Forte SF256-PCS-02) into the snd-fm801 driver.
+ 
+-	  To compile this driver as a module, choose M here: the module
+-	  will be called snd-fm801-tea575x.
++config SND_FM801_TEA575X
++       tristate
++       depends on SND_FM801_TEA575X_BOOL
++       default SND_FM801
++       select VIDEO_DEV
+ 
+ config SND_HDA_INTEL
+ 	tristate "Intel HD Audio"
+diff --git a/sound/pci/au88x0/au88x0_mpu401.c b/sound/pci/au88x0/au88x0_mpu401.c
+index 873f486..118dcc7 100644
+--- a/sound/pci/au88x0/au88x0_mpu401.c
++++ b/sound/pci/au88x0/au88x0_mpu401.c
+@@ -47,7 +47,7 @@ static int __devinit snd_vortex_midi(vor
+ 	struct snd_rawmidi *rmidi;
+ 	int temp, mode;
+ 	struct snd_mpu401 *mpu;
+-	int port;
++	unsigned long port;
+ 
+ #ifdef VORTEX_MPU401_LEGACY
+ 	/* EnableHardCodedMPU401Port() */
+diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
+index d72fc28..09a2885 100644
+--- a/sound/pci/fm801.c
++++ b/sound/pci/fm801.c
+@@ -35,7 +35,7 @@ #include <sound/initval.h>
+ 
+ #include <asm/io.h>
+ 
+-#if (defined(CONFIG_SND_FM801_TEA575X) || defined(CONFIG_SND_FM801_TEA575X_MODULE)) && (defined(CONFIG_VIDEO_DEV) || defined(CONFIG_VIDEO_DEV_MODULE))
++#ifdef CONFIG_SND_FM801_TEA575X_BOOL
+ #include <sound/tea575x-tuner.h>
+ #define TEA575X_RADIO 1
+ #endif
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index e821d65..9dd541d 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -1393,10 +1393,10 @@ static int azx_free(struct azx *chip)
+ 		msleep(1);
+ 	}
+ 
+-	if (chip->remap_addr)
+-		iounmap(chip->remap_addr);
+ 	if (chip->irq >= 0)
+ 		free_irq(chip->irq, (void*)chip);
++	if (chip->remap_addr)
++		iounmap(chip->remap_addr);
+ 
+ 	if (chip->bdl.area)
+ 		snd_dma_free_pages(&chip->bdl);
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index 40f000b..d7343dc 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -1488,6 +1488,9 @@ enum {
+ /* reivision id to check workarounds */
+ #define AD1988A_REV2		0x100200
+ 
++#define is_rev2(codec) \
++	((codec)->vendor_id == 0x11d41988 && \
++	 (codec)->revision_id == AD1988A_REV2)
+ 
+ /*
+  * mixers
+@@ -1579,6 +1582,7 @@ static struct snd_kcontrol_new ad1988_6s
+ 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME("Side Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
++	{ } /* end */
+ };
+ 
+ static struct snd_kcontrol_new ad1988_6stack_mixers1_rev2[] = {
+@@ -1587,6 +1591,7 @@ static struct snd_kcontrol_new ad1988_6s
+ 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0a, 2, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME("Side Playback Volume", 0x06, 0x0, HDA_OUTPUT),
++	{ } /* end */
+ };
+ 
+ static struct snd_kcontrol_new ad1988_6stack_mixers2[] = {
+@@ -1625,6 +1630,7 @@ static struct snd_kcontrol_new ad1988_3s
+ 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x05, 1, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x05, 2, 0x0, HDA_OUTPUT),
++	{ } /* end */
+ };
+ 
+ static struct snd_kcontrol_new ad1988_3stack_mixers1_rev2[] = {
+@@ -1632,6 +1638,7 @@ static struct snd_kcontrol_new ad1988_3s
+ 	HDA_CODEC_VOLUME("Surround Playback Volume", 0x0a, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x06, 1, 0x0, HDA_OUTPUT),
+ 	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x06, 2, 0x0, HDA_OUTPUT),
++	{ } /* end */
+ };
+ 
+ static struct snd_kcontrol_new ad1988_3stack_mixers2[] = {
+@@ -2138,7 +2145,7 @@ static inline hda_nid_t ad1988_idx_to_da
+ 		/* A     B     C     D     E     F     G     H */
+ 		0x04, 0x05, 0x0a, 0x04, 0x06, 0x05, 0x0a, 0x06
+ 	};
+-	if (codec->revision_id == AD1988A_REV2)
++	if (is_rev2(codec))
+ 		return idx_to_dac_rev2[idx];
+ 	else
+ 		return idx_to_dac[idx];
+@@ -2507,7 +2514,7 @@ static int patch_ad1988(struct hda_codec
+ 	mutex_init(&spec->amp_mutex);
+ 	codec->spec = spec;
+ 
+-	if (codec->revision_id == AD1988A_REV2)
++	if (is_rev2(codec))
+ 		snd_printk(KERN_INFO "patch_analog: AD1988A rev.2 is detected, enable workarounds\n");
+ 
+ 	board_config = snd_hda_check_board_config(codec, ad1988_cfg_tbl);
+@@ -2533,13 +2540,13 @@ static int patch_ad1988(struct hda_codec
+ 	case AD1988_6STACK_DIG:
+ 		spec->multiout.max_channels = 8;
+ 		spec->multiout.num_dacs = 4;
+-		if (codec->revision_id == AD1988A_REV2)
++		if (is_rev2(codec))
+ 			spec->multiout.dac_nids = ad1988_6stack_dac_nids_rev2;
+ 		else
+ 			spec->multiout.dac_nids = ad1988_6stack_dac_nids;
+ 		spec->input_mux = &ad1988_6stack_capture_source;
+ 		spec->num_mixers = 2;
+-		if (codec->revision_id == AD1988A_REV2)
++		if (is_rev2(codec))
+ 			spec->mixers[0] = ad1988_6stack_mixers1_rev2;
+ 		else
+ 			spec->mixers[0] = ad1988_6stack_mixers1;
+@@ -2555,7 +2562,7 @@ static int patch_ad1988(struct hda_codec
+ 	case AD1988_3STACK_DIG:
+ 		spec->multiout.max_channels = 6;
+ 		spec->multiout.num_dacs = 3;
+-		if (codec->revision_id == AD1988A_REV2)
++		if (is_rev2(codec))
+ 			spec->multiout.dac_nids = ad1988_3stack_dac_nids_rev2;
+ 		else
+ 			spec->multiout.dac_nids = ad1988_3stack_dac_nids;
+@@ -2563,7 +2570,7 @@ static int patch_ad1988(struct hda_codec
+ 		spec->channel_mode = ad1988_3stack_modes;
+ 		spec->num_channel_mode = ARRAY_SIZE(ad1988_3stack_modes);
+ 		spec->num_mixers = 2;
+-		if (codec->revision_id == AD1988A_REV2)
++		if (is_rev2(codec))
+ 			spec->mixers[0] = ad1988_3stack_mixers1_rev2;
+ 		else
+ 			spec->mixers[0] = ad1988_3stack_mixers1;
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index f0e9a9c..94cf292 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -3827,7 +3827,7 @@ static struct hda_board_config alc260_cf
+ 	{ .modelname = "hp", .config = ALC260_HP },
+ 	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP },
+ 	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP },
+-	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3012, .config = ALC260_HP },
++	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3012, .config = ALC260_HP_3013 },
+ 	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3013, .config = ALC260_HP_3013 },
+ 	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3014, .config = ALC260_HP },
+ 	{ .pci_subvendor = 0x103c, .pci_subdevice = 0x3015, .config = ALC260_HP },
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index 8c440fb..d862295 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -1262,13 +1262,13 @@ static int vaio_master_sw_put(struct snd
+ 	int change;
+ 
+ 	change = snd_hda_codec_amp_update(codec, 0x02, 0, HDA_OUTPUT, 0,
+-					  0x80, valp[0] & 0x80);
++					  0x80, (valp[0] ? 0 : 0x80));
+ 	change |= snd_hda_codec_amp_update(codec, 0x02, 1, HDA_OUTPUT, 0,
+-					   0x80, valp[1] & 0x80);
++					   0x80, (valp[1] ? 0 : 0x80));
+ 	snd_hda_codec_amp_update(codec, 0x05, 0, HDA_OUTPUT, 0,
+-				 0x80, valp[0] & 0x80);
++				 0x80, (valp[0] ? 0 : 0x80));
+ 	snd_hda_codec_amp_update(codec, 0x05, 1, HDA_OUTPUT, 0,
+-				 0x80, valp[1] & 0x80);
++				 0x80, (valp[1] ? 0 : 0x80));
+ 	return change;
+ }
+ 
+diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
+index 61f82f0..10586e4 100644
+--- a/sound/pci/rme9652/hdsp.c
++++ b/sound/pci/rme9652/hdsp.c
+@@ -389,7 +389,7 @@ #define HDSP_DMA_AREA_KILOBYTES (HDSP_DM
+ 
+ /* use hotplug firmeare loader? */
+ #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE)
+-#ifndef HDSP_USE_HWDEP_LOADER
++#if !defined(HDSP_USE_HWDEP_LOADER) && !defined(CONFIG_SND_HDSP)
+ #define HDSP_FW_LOADER
+ #endif
+ #endif
+@@ -3169,9 +3169,10 @@ snd_hdsp_proc_read(struct snd_info_entry
+ 	char *clock_source;
+ 	int x;
+ 
+-	if (hdsp_check_for_iobox (hdsp))
++	if (hdsp_check_for_iobox (hdsp)) {
+ 		snd_iprintf(buffer, "No I/O box connected.\nPlease connect one and upload firmware.\n");
+ 		return;
++        }
+ 
+ 	if (hdsp_check_for_firmware(hdsp, 0)) {
+ 		if (hdsp->state & HDSP_FirmwareCached) {

Added: dists/trunk/linux-2.6/debian/patches/budget-av-compile-fix.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/budget-av-compile-fix.patch	Tue Jul 25 20:39:42 2006
@@ -0,0 +1,54 @@
+[PATCH 2.6.17.7] Fix budget-av compile failure
+
+From: Andrew de Quincey <adq_dvb at lidskialf.net>
+
+Currently I am doing lots of refactoring work in the dvb tree. This bugfix
+became necessary to fix 2.6.17 whilst I was in the middle of this work. 
+Unfortunately after I tested the original code for the patch, I generated 
+the diff against the wrong tree (I accidentally used a tree with part of 
+the refactoring code in it). This resulted in the reported compile errors 
+because that tree (a) was incomplete, and (b) used features which are 
+simply not in the mainline kernel yet.
+
+Many apologies for the error and problems this has caused. :(
+
+Signed-off-by: Andrew de Quincey <adq_dvb at lidskialf.net>
+Signed-off-by: Michael Krufky <mkrufky at linuxtv.org>
+
+diff -Naur linux-2.6.17.7.orig/drivers/media/dvb/ttpci/budget-av.c linux-2.6.17.7/drivers/media/dvb/ttpci/budget-av.c
+--- linux-2.6.17.7.orig/drivers/media/dvb/ttpci/budget-av.c	2006-07-25 14:53:19.000000000 +0100
++++ linux-2.6.17.7/drivers/media/dvb/ttpci/budget-av.c	2006-07-25 15:25:32.000000000 +0100
+@@ -58,6 +58,7 @@
+ 	struct tasklet_struct ciintf_irq_tasklet;
+ 	int slot_status;
+ 	struct dvb_ca_en50221 ca;
++	u8 reinitialise_demod:1;
+ };
+ 
+ /* GPIO Connections:
+@@ -214,8 +215,9 @@
+ 	while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d)
+ 		msleep(100);
+ 
+-	/* reinitialise the frontend */
+-	dvb_frontend_reinitialise(budget_av->budget.dvb_frontend);
++	/* reinitialise the frontend if necessary */
++	if (budget_av->reinitialise_demod)
++		dvb_frontend_reinitialise(budget_av->budget.dvb_frontend);
+ 
+ 	if (timeout <= 0)
+ 	{
+@@ -1064,12 +1066,10 @@
+ 		fe = tda10021_attach(&philips_cu1216_config,
+ 				     &budget_av->budget.i2c_adap,
+ 				     read_pwm(budget_av));
+-		if (fe) {
+-			fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params;
+-		}
+ 		break;
+ 
+ 	case SUBID_DVBC_KNC1_PLUS:
++		budget_av->reinitialise_demod = 1;
+ 		fe = tda10021_attach(&philips_cu1216_config,
+ 				     &budget_av->budget.i2c_adap,
+ 				     read_pwm(budget_av));

Modified: dists/trunk/linux-2.6/debian/patches/series/5
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/5	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/5	Tue Jul 25 20:39:42 2006
@@ -1 +1,3 @@
 + x86_64-smp-alternatives.patch
++ 2.6.17.7
++ budget-av-compile-fix.patch



More information about the Kernel-svn-changes mailing list