From 1442d6faa2505b91d7e81832f707745f0bcdeb37 Mon Sep 17 00:00:00 2001 From: maximilian attems Date: Tue, 25 Jul 2006 20:39:42 +0000 Subject: [PATCH] add 2.6.17.7 add buildfix set CONFIG_SND_FM801_TEA575X_BOOL=y, where CONFIG_SND_FM801_TEA575X=m svn path=/dists/trunk/linux-2.6/; revision=7068 --- debian/arch/alpha/config | 1 + debian/arch/amd64/config | 1 + debian/arch/i386/config | 1 + debian/arch/ia64/config | 1 + debian/arch/mips/config.r5k-ip32 | 1 + debian/arch/mips/config.sb1-bcm91250a | 1 + debian/arch/mips/config.sb1a-bcm91480b | 1 + debian/arch/mipsel/config.r5k-cobalt | 1 + debian/arch/mipsel/config.sb1-bcm91250a | 1 + debian/arch/mipsel/config.sb1a-bcm91480b | 1 + debian/arch/powerpc/config | 1 + debian/changelog | 53 +- debian/patches/2.6.17.7 | 1599 ++++++++++++++++++++ debian/patches/budget-av-compile-fix.patch | 54 + debian/patches/series/5 | 2 + 15 files changed, 1718 insertions(+), 1 deletion(-) create mode 100644 debian/patches/2.6.17.7 create mode 100644 debian/patches/budget-av-compile-fix.patch diff --git a/debian/arch/alpha/config b/debian/arch/alpha/config index a841563e8..035392951 100644 --- a/debian/arch/alpha/config +++ b/debian/arch/alpha/config @@ -1267,6 +1267,7 @@ CONFIG_SND_ES1938=m 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 diff --git a/debian/arch/amd64/config b/debian/arch/amd64/config index 5e03ed4ac..24e4f4af1 100644 --- a/debian/arch/amd64/config +++ b/debian/arch/amd64/config @@ -1175,6 +1175,7 @@ CONFIG_SND_ES1938=m 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 diff --git a/debian/arch/i386/config b/debian/arch/i386/config index 7daf9f62a..9c31a4803 100644 --- a/debian/arch/i386/config +++ b/debian/arch/i386/config @@ -1426,6 +1426,7 @@ CONFIG_SND_ES1938=m 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 diff --git a/debian/arch/ia64/config b/debian/arch/ia64/config index b31f95ee7..b717a805d 100644 --- a/debian/arch/ia64/config +++ b/debian/arch/ia64/config @@ -993,6 +993,7 @@ CONFIG_SND_ES1938=m 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 diff --git a/debian/arch/mips/config.r5k-ip32 b/debian/arch/mips/config.r5k-ip32 index 9adedb4fe..ac2530fa5 100644 --- a/debian/arch/mips/config.r5k-ip32 +++ b/debian/arch/mips/config.r5k-ip32 @@ -1518,6 +1518,7 @@ CONFIG_MSNDPIN_PERM_FILE="/etc/sound/pndsperm.bin" 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 diff --git a/debian/arch/mips/config.sb1-bcm91250a b/debian/arch/mips/config.sb1-bcm91250a index 5a10ef6d3..280cbf58d 100644 --- a/debian/arch/mips/config.sb1-bcm91250a +++ b/debian/arch/mips/config.sb1-bcm91250a @@ -1331,6 +1331,7 @@ CONFIG_SND_ENS1371=m 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 diff --git a/debian/arch/mips/config.sb1a-bcm91480b b/debian/arch/mips/config.sb1a-bcm91480b index 30f07874b..4a72527e0 100644 --- a/debian/arch/mips/config.sb1a-bcm91480b +++ b/debian/arch/mips/config.sb1a-bcm91480b @@ -1326,6 +1326,7 @@ CONFIG_SND_ENS1371=m 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 diff --git a/debian/arch/mipsel/config.r5k-cobalt b/debian/arch/mipsel/config.r5k-cobalt index ad7c3ce12..558d82ed7 100644 --- a/debian/arch/mipsel/config.r5k-cobalt +++ b/debian/arch/mipsel/config.r5k-cobalt @@ -1128,6 +1128,7 @@ CONFIG_SND_ENS1371=m 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 diff --git a/debian/arch/mipsel/config.sb1-bcm91250a b/debian/arch/mipsel/config.sb1-bcm91250a index edf1823fd..03e76698e 100644 --- a/debian/arch/mipsel/config.sb1-bcm91250a +++ b/debian/arch/mipsel/config.sb1-bcm91250a @@ -1331,6 +1331,7 @@ CONFIG_SND_ENS1371=m 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 diff --git a/debian/arch/mipsel/config.sb1a-bcm91480b b/debian/arch/mipsel/config.sb1a-bcm91480b index f12dad50e..fcf1248b0 100644 --- a/debian/arch/mipsel/config.sb1a-bcm91480b +++ b/debian/arch/mipsel/config.sb1a-bcm91480b @@ -1326,6 +1326,7 @@ CONFIG_SND_ENS1371=m 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 diff --git a/debian/arch/powerpc/config b/debian/arch/powerpc/config index 0b9c60d6c..1605b9bd0 100644 --- a/debian/arch/powerpc/config +++ b/debian/arch/powerpc/config @@ -972,6 +972,7 @@ CONFIG_SND_ES1938=m 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 diff --git a/debian/changelog b/debian/changelog index 2c12767b6..fd69d85ea 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,7 +6,58 @@ linux-2.6 (2.6.17-5) UNRELEASED; urgency=low [ Frederik Schüler ] * [amd64] Apply rediffed smp-alternatives patch from 2.6.18-rc1. - -- Frederik Schüler 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 Tue, 25 Jul 2006 22:26:52 +0200 linux-2.6 (2.6.17-4) unstable; urgency=low diff --git a/debian/patches/2.6.17.7 b/debian/patches/2.6.17.7 new file mode 100644 index 000000000..329e748be --- /dev/null +++ b/debian/patches/2.6.17.7 @@ -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 + 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 + + #include + +-#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 + #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) { diff --git a/debian/patches/budget-av-compile-fix.patch b/debian/patches/budget-av-compile-fix.patch new file mode 100644 index 000000000..00d4d6343 --- /dev/null +++ b/debian/patches/budget-av-compile-fix.patch @@ -0,0 +1,54 @@ +[PATCH 2.6.17.7] Fix budget-av compile failure + +From: Andrew de Quincey + +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 +Signed-off-by: Michael Krufky + +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)); diff --git a/debian/patches/series/5 b/debian/patches/series/5 index d89a2aba9..7e07a5a51 100644 --- a/debian/patches/series/5 +++ b/debian/patches/series/5 @@ -1 +1,3 @@ + x86_64-smp-alternatives.patch ++ 2.6.17.7 ++ budget-av-compile-fix.patch