Linux 2.6.26.6
Subsystems (45)
We (the -stable team) are announcing the release of the 2.6.26.6 kernel.
It contains lots of bugfixes, all over the map. Any users of the 2.6.26 kernel series should upgrade to this version. For details on the fixes, see the changelog entries and the diffstat below.
I'll also be replying to this message with a copy of the patch between 2.6.26.5 and 2.6.26.6
The updated 2.6.26.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.26.y.git
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.26.y.git;a=summarythanks,
greg k-h
------------
Makefile | 2 arch/s390/kernel/compat_ptrace.h | 1 arch/s390/kernel/ptrace.c | 28 +++++ arch/sparc64/kernel/of_device.c | 9 - arch/sparc64/kernel/pci.c | 2 arch/sparc64/kernel/pci_psycho.c | 14 +- arch/sparc64/kernel/prom.c | 104 +-------------------- arch/x86/kernel/alternative.c | 18 +-- arch/x86/kernel/apic_32.c | 30 +++++- arch/x86/kernel/apic_64.c | 3 arch/x86/kernel/cpu/bugs.c | 6 + arch/x86/kernel/e820_32.c | 2 arch/x86/kernel/e820_64.c | 2 arch/x86/kernel/genapic_64.c | 2 arch/x86/kernel/head64.c | 1 arch/x86/kernel/hpet.c | 19 ++- arch/x86/kernel/io_delay.c | 8 + arch/x86/kernel/mpparse.c | 5 + arch/x86/kernel/setup.c | 1 arch/x86/kernel/setup_32.c | 11 +- arch/x86/kernel/signal_64.c | 62 ++++++++++++ arch/x86/kernel/traps_64.c | 9 + arch/x86/kernel/vmi_32.c | 2 arch/x86/kernel/vsmp_64.c | 2 arch/x86/kvm/svm.c | 14 ++ arch/x86/mach-generic/bigsmp.c | 2 arch/x86/mm/pageattr.c | 6 - arch/x86/oprofile/nmi_int.c | 39 +++++++- crypto/async_tx/async_tx.c | 3 drivers/accessibility/braille/braille_console.c | 13 -- drivers/acpi/ec.c | 2 drivers/acpi/processor_perflib.c | 2 drivers/i2c/i2c-dev.c | 4 drivers/mmc/card/block.c | 4 drivers/net/ixgbe/ixgbe_main.c | 6 + drivers/net/niu.c | 56 +++++++++++ drivers/net/wireless/rt2x00/rt2x00.h | 4 drivers/net/wireless/rt2x00/rt2x00dev.c | 17 --- drivers/net/wireless/rt2x00/rt2x00mac.c | 4 drivers/pcmcia/ds.c | 23 ++-- drivers/rtc/rtc-dev.c | 15 +-- drivers/scsi/qla2xxx/qla_isr.c | 1 drivers/scsi/qla2xxx/qla_os.c | 2 drivers/spi/pxa2xx_spi.c | 116 ++++++++++++++++++------ drivers/usb/core/hcd.c | 3 drivers/video/console/fbcon.h | 2 fs/buffer.c | 13 +- fs/exec.c | 2 fs/ocfs2/stackglue.c | 7 - fs/proc/array.c | 59 ------------ include/asm-generic/rtc.h | 12 -- include/asm-x86/i387.h | 56 ----------- include/asm-x86/mpspec.h | 1 include/asm-x86/pgtable_64.h | 2 include/linux/clockchips.h | 2 include/linux/mmzone.h | 12 +- include/linux/rmap.h | 2 include/linux/sched.h | 4 include/linux/smb.h | 2 include/net/netlink.h | 2 kernel/cgroup.c | 5 - kernel/exit.c | 18 ++- kernel/sched.c | 59 ++++++++++++ kernel/time/clockevents.c | 3 kernel/time/ntp.c | 2 kernel/time/tick-broadcast.c | 78 ++++++++++++---- kernel/time/tick-common.c | 1 kernel/time/tick-internal.h | 2 kernel/time/tick-oneshot.c | 44 +++++++-- lib/scatterlist.c | 5 - mm/filemap_xip.c | 2 mm/memcontrol.c | 13 ++ mm/mmzone.c | 2 mm/rmap.c | 14 +- net/ipv4/udp.c | 59 ++++++------ net/ipv6/ip6_output.c | 64 ++++++------- net/ipv6/route.c | 2 net/key/af_key.c | 30 +++--- net/sctp/associola.c | 9 + net/sctp/sm_make_chunk.c | 15 +-- net/xfrm/xfrm_output.c | 12 +- sound/core/pcm.c | 4 sound/core/pcm_native.c | 13 -- sound/core/rawmidi.c | 4 sound/pci/hda/patch_sigmatel.c | 2 sound/pci/oxygen/hifier.c | 4 sound/pci/oxygen/oxygen.c | 4 sound/ppc/awacs.c | 50 +++++++--- 88 files changed, 862 insertions(+), 515 deletions(-)
Alan Cox (1):
pcmcia: Fix broken abuse of dev->driver_data
Andi Kleen (1):
x86: fix oprofile + hibernation badness
Andrew Morton (1):
drivers/mmc/card/block.c: fix refcount leak in mmc_block_open()
Andrew Vasquez (1):
SCSI: qla2xxx: Defer enablement of RISC interrupts until ISP initialization completes.
Andy Gospodarek (1):
ixgbe: initialize interrupt throttle rate
Arnaud Ebalard (1):
XFRM,IPv6: initialize ip6_dst_blackhole_ops.kmem_cachep
Balbir Singh (2):
sched: fix process time monotonicity
mm owner: fix race between swapoff and exit
Chuck Ebbert (2):
x86-32: AMD c1e force timer broadcast late
x86: add io delay quirk for Presario F700
Clemens Ladisch (1):
ALSA: oxygen: fix distorted output on AK4396-based cards
David S. Miller (5):
sparc64: Fix PCI error interrupt registry on PSYCHO.
sparc64: Fix interrupt register calculations on Psycho and Sabre.
sparc64: Fix OOPS in psycho_pcierr_intr_other().
sparc64: Fix disappearing PCI devices on e3500.
sparc64: Fix missing devices due to PCI bridge test in of_create_pci_dev().
David Winn (1):
fbcon: fix monochrome color value calculation
FUJITA Tomonori (1):
sg: disable interrupts inside sg_copy_buffer
Geoff Levand (1):
USB: fix hcd interrupt disabling
Greg Kroah-Hartman (1):
Linux 2.6.26.6
Herbert Xu (2):
ipsec: Fix pskb_expand_head corruption in xfrm_state_check_space
udp: Fix rcv socket locking
Ingo Molnar (1):
rtc: fix deadlock
Ivo van Doorn (1):
rt2x00: Use ieee80211_hw->workqueue again
Jan Beulich (1):
x86-64: fix overlap of modules and fixmap areas
Jarod Wilson (1):
S390: CVE-2008-1514: prevent ptrace padding area read/write in 31-bit mode
Jens Axboe (1):
block: submit_bh() inadvertently discards barrier flag on a sync write
Joel Becker (1):
ocfs2: Increment the reference count of an already-active stack.
Joerg Roedel (2):
KVM: SVM: fix random segfaults with NPT enabled
KVM: SVM: fix guest global tlb flushes with NPT
Kirill A. Shutemov (1):
smb.h: do not include linux/time.h in userspace
Krzysztof Helt (1):
x86: fdiv bug detection fix
Linus Torvalds (1):
x86-64: Clean up save/restore_i387() usage
Maciej W. Rozycki (1):
ntp: fix calculation of the next jiffie to trigger RTC sync
Marcin Slusarz (1):
rtc: fix kernel panic on second use of SIGIO nofitication
Mel Gorman (1):
mm: mark the correct zone as full when scanning zonelists
Mike Rapoport (1):
pxa2xx_spi: fix build breakage
Milan Broz (1):
ACPI: Fix thermal shutdowns
Ned Forrester (2):
pxa2xx_spi: dma bugfixes
pxa2xx_spi: chipselect bugfixes
Neil Horman (1):
ipv6: Fix OOPS in ip6_dst_lookup_tail().
Nick Piggin (1):
mm: dirty page tracking race fix
Pascal Terjan (1):
braille_console: only register notifiers when the braille console is used
Pekka Paalanen (1):
x86: fix SMP alternatives: use mutex instead of spinlock, text_poke is sleepable
Prarit Bhargava (1):
x86: fix memmap=exactmap boot argument
Ravikiran Thirumalai (1):
x86: Fix 27-rc crash on vsmp due to paravirt during module load
Risto Suominen (2):
ALSA: snd-powermac: mixers for PowerMac G4 AGP
ALSA: snd-powermac: HP detection for 1st iMac G3 SL
Santwona Behera (1):
niu: panic on reset
Suresh Siddha (1):
x64, fpu: fix possible FPU leakage in error conditions
Sven Wegener (1):
i2c-dev: Return correct error code on class_create() failure
Takashi Iwai (3):
ALSA: hda - Fix model for Dell Inspiron 1525
ALSA: fix locking in snd_pcm_open*() and snd_rawmidi_open*()
ALSA: remove unneeded power_mutex lock in snd_pcm_drop
Thomas Gleixner (9):
clockevents: prevent endless loop in periodic broadcast handler
clockevents: enforce reprogram in oneshot setup
clockevents: prevent multiple init/shutdown
clockevents: prevent endless loop lockup
HPET: make minimum reprogramming delta useful
clockevents: broadcast fixup possible waiters
x86: HPET fix moronic 32/64bit thinko
x86: HPET: read back compare register before reading counter
clockevents: remove WARN_ON which was used to gather information
Timo Teras (1):
af_key: Free dumping state on socket close
Vegard Nossum (1):
netlink: fix overrun in attribute iteration
Venkatesh Pallipadi (2):
x86: PAT proper tracking of set_memory_uc and friends
clockevents: prevent clockevent event_handler ending up handler_noop
Vlad Yasevich (2):
sctp: do not enable peer features if we can't do them.
sctp: Fix oops when INIT-ACK indicates that peer doesn't support AUTH
Yinghai Lu (1):
APIC routing fix
Yuri Tikhonov (1):
async_tx: fix the bug in async_tx_run_dependencies
Zachary Amsden (1):
x86: Fix broken LDT access in VMI
Zhao Yakui (1):
ACPI: Avoid bogus EC timeout when EC is in Polling mode
Makefile +1 -1
@@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 26 -EXTRAVERSION = .5 +EXTRAVERSION = .6 NAME = Rotary Wombat # *DOCUMENTATION*
arch/s390/kernel/compat_ptrace.h +1 -0
@@ -42,6 +42,7 @@ struct user_regs_struct32u32 gprs[NUM_GPRS ];u32 acrs[NUM_ACRS ];u32 orig_gpr2; +/* nb: there's a 4-byte hole here */ s390_fp_regs fp_regs;/* * These per registers are in here so that gdb can modify them
arch/s390/kernel/ptrace.c +28 -0
@@ -177,6 +177,13 @@ peek_user(struct task_struct *child, addr_t addr, addr_t data)*/ tmp = (addr_t )task_pt_regs (child)->orig_gpr2; + }else if (addr < (addr_t) &dummy->regs.fp_regs) { +/* +* prevent reads of padding hole between +* orig_gpr2 and fp_regs on s390. +*/ + tmp =0 ; + }else if (addr < (addr_t) (&dummy->regs.fp_regs +1 )) {/* * floating point regs. are stored in the thread structure
@@ -268,6 +275,13 @@ poke_user(struct task_struct *child, addr_t addr, addr_t data)*/ task_pt_regs (child)->orig_gpr2 = data; + }else if (addr < (addr_t) &dummy->regs.fp_regs) { +/* +* prevent writes of padding hole between +* orig_gpr2 and fp_regs on s390. +*/ +return 0 ; + }else if (addr < (addr_t) (&dummy->regs.fp_regs +1 )) {/* * floating point regs. are stored in the thread structure
@@ -409,6 +423,13 @@ peek_user_emu31(struct task_struct *child, addr_t addr, addr_t data)*/ tmp = *(__u32 *)((addr_t ) &task_pt_regs (child)->orig_gpr2 +4 ); + }else if (addr < (addr_t) &dummy32->regs.fp_regs) { +/* +* prevent reads of padding hole between +* orig_gpr2 and fp_regs on s390. +*/ + tmp =0 ; + }else if (addr < (addr_t) (&dummy32->regs.fp_regs +1 )) {/* * floating point regs. are stored in the thread structure
@@ -488,6 +509,13 @@ poke_user_emu31(struct task_struct *child, addr_t addr, addr_t data)*/ *(__u32 *)((addr_t ) &task_pt_regs (child)->orig_gpr2 +4 ) = tmp; + }else if (addr < (addr_t) &dummy32->regs.fp_regs) { +/* +* prevent writess of padding hole between +* orig_gpr2 and fp_regs on s390. +*/ +return 0 ; + }else if (addr < (addr_t) (&dummy32->regs.fp_regs +1 )) {/* * floating point regs. are stored in the thread structure
arch/sparc64/kernel/of_device.c +4 -5
@@ -170,7 +170,7 @@ static unsigned int of_bus_default_get_flags(const u32 *addr)static int of_bus_pci_match (struct device_node *np) { -if (!strcmp (np->type,"pci" ) || !strcmp (np->type,"pciex" )) { +if (!strcmp (np->name,"pci" )) {const char *model =of_get_property (np,"model" ,NULL );if (model && !strcmp (model,"SUNW,simba" ))
@@ -201,7 +201,7 @@ static int of_bus_simba_match(struct device_node *np)/* Treat PCI busses lacking ranges property just like * simba. */ -if (!strcmp (np->type,"pci" ) || !strcmp (np->type,"pciex" )) { +if (!strcmp (np->name,"pci" )) {if (!of_find_property (np,"ranges" ,NULL ))return 1 ; }
@@ -426,7 +426,7 @@ static int __init use_1to1_mapping(struct device_node *pp)* it lacks a ranges property, and this will include * cases like Simba. */ -if (!strcmp (pp->type,"pci" ) || !strcmp (pp->type,"pciex" )) +if (!strcmp (pp->name,"pci" ))return 0 ;return 1 ;
@@ -709,8 +709,7 @@ static unsigned int __init build_one_device_irq(struct of_device *op,break ; } }else { -if (!strcmp (pp->type,"pci" ) || - !strcmp (pp->type,"pciex" )) { +if (!strcmp (pp->name,"pci" )) {unsigned int this_orig_irq = irq; irq =pci_irq_swizzle (dp, pp, irq);
arch/sparc64/kernel/pci.c +1 -1
@@ -425,7 +425,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, dev->current_state =4 ;/* unknown power state */ dev->error_state = pci_channel_io_normal; -if (!strcmp (type,"pci" ) || !strcmp (type,"pciex" )) { +if (!strcmp (node->name,"pci" )) {/* a PCI-PCI bridge */ dev->hdr_type =PCI_HEADER_TYPE_BRIDGE ; dev->rom_base_reg =PCI_ROM_ADDRESS1 ;
arch/sparc64/kernel/pci_psycho.c +8 -6
@@ -575,7 +575,7 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm {unsigned long csr_reg, csr, csr_error_bits;irqreturn_t ret =IRQ_NONE ; -u16 stat; +u16 stat, *addr;if (is_pbm_a) { csr_reg = pbm->controller_regs +PSYCHO_PCIA_CTRL ;
@@ -597,7 +597,9 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbmprintk ("%s: PCI SERR signal asserted.\n" , pbm->name); ret =IRQ_HANDLED ; } -pci_read_config_word (pbm->pci_bus->self,PCI_STATUS , &stat); + addr =psycho_pci_config_mkaddr (pbm, pbm->pci_first_busno, +0 ,PCI_STATUS ); +pci_config_read16 (addr, &stat); if (stat & (PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT | PCI_STATUS_REC_TARGET_ABORT |
@@ -605,7 +607,7 @@ static irqreturn_t psycho_pcierr_intr_other(struct pci_pbm_info *pbm, int is_pbm PCI_STATUS_SIG_SYSTEM_ERROR)) {printk ("%s: PCI bus error, PCI_STATUS[%04x]\n" , pbm->name, stat); -pci_write_config_word (pbm->pci_bus->self,PCI_STATUS ,0xffff ); +pci_config_write16 (addr,0xffff ); ret =IRQ_HANDLED ; }return ret;
@@ -744,16 +746,16 @@ static void psycho_register_error_handlers(struct pci_pbm_info *pbm)* the second will just error out since we do not pass in * IRQF_SHARED. */ - err =request_irq (op->irqs[1 ], psycho_ue_intr,0 , + err =request_irq (op->irqs[1 ], psycho_ue_intr,IRQF_SHARED ,"PSYCHO_UE" , pbm); - err =request_irq (op->irqs[2 ], psycho_ce_intr,0 , + err =request_irq (op->irqs[2 ], psycho_ce_intr,IRQF_SHARED ,"PSYCHO_CE" , pbm);/* This one, however, ought not to fail. We can just warn * about it since the system can still operate properly even * if this fails. */ - err =request_irq (op->irqs[0 ], psycho_pcierr_intr,0 , + err =request_irq (op->irqs[0 ], psycho_pcierr_intr,IRQF_SHARED ,"PSYCHO_PCIERR" , pbm);if (err) printk(KERN_WARNING "%s: Could not register PCIERR, "
arch/sparc64/kernel/prom.c +6 -98
137 lines not on this page · raw message
arch/x86/kernel/alternative.c +9 -9
@@ -1,6 +1,6 @@#include <linux/module.h> #include <linux/sched.h> -#include <linux/spinlock.h> +#include <linux/mutex.h> #include <linux/list.h> #include <linux/kprobes.h> #include <linux/mm.h>
@@ -279,7 +279,7 @@ struct smp_alt_module {struct list_head next; };static LIST_HEAD (smp_alt_modules); -static DEFINE_SPINLOCK (smp_alt); +static DEFINE_MUTEX (smp_alt);static int smp_mode =1 ;/* protected by smp_alt */ void alternatives_smp_module_add(struct module *mod, char *name,
@@ -312,12 +312,12 @@ void alternatives_smp_module_add(struct module *mod, char *name, __func__, smp->locks, smp->locks_end, smp->text, smp->text_end, smp->name); -spin_lock (&smp_alt); +mutex_lock (&smp_alt);list_add_tail (&smp->next, &smp_alt_modules);if (boot_cpu_has (X86_FEATURE_UP ))alternatives_smp_unlock (smp->locks, smp->locks_end, smp->text, smp->text_end); -spin_unlock (&smp_alt); +mutex_unlock (&smp_alt); }void alternatives_smp_module_del (struct module *mod)
@@ -327,17 +327,17 @@ void alternatives_smp_module_del(struct module *mod)if (smp_alt_once || noreplace_smp)return ; -spin_lock (&smp_alt); +mutex_lock (&smp_alt);list_for_each_entry (item, &smp_alt_modules, next) {if (mod != item->mod)continue ;list_del (&item->next); -spin_unlock (&smp_alt); +mutex_unlock (&smp_alt);DPRINTK ("%s: %s\n" , __func__, item->name);kfree (item);return ; } -spin_unlock (&smp_alt); +mutex_unlock (&smp_alt); }void alternatives_smp_switch (int smp)
@@ -359,7 +359,7 @@ void alternatives_smp_switch(int smp)return ;BUG_ON (!smp && (num_online_cpus () >1 )); -spin_lock (&smp_alt); +mutex_lock (&smp_alt);/* * Avoid unnecessary switches because it forces JIT based VMs to
@@ -383,7 +383,7 @@ void alternatives_smp_switch(int smp) mod->text, mod->text_end); } smp_mode = smp; -spin_unlock (&smp_alt); +mutex_unlock (&smp_alt); }#endif
arch/x86/kernel/apic_32.c +28 -2
@@ -552,8 +552,31 @@ void __init setup_boot_APIC_clock(void)setup_APIC_timer (); } -void __devinit setup_secondary_APIC_clock (void ) +/* +* AMD C1E enabled CPUs have a real nasty problem: Some BIOSes set the +* C1E flag only in the secondary CPU, so when we detect the wreckage +* we already have enabled the boot CPU local apic timer. Check, if +* disable_apic_timer is set and the DUMMY flag is cleared. If yes, +* set the DUMMY flag again and force the broadcast mode in the +* clockevents layer. +*/ +static void __cpuinit check_boot_apic_timer_broadcast (void ) { +if (!local_apic_timer_disabled || + (lapic_clockevent.features &CLOCK_EVT_FEAT_DUMMY )) +return ; + + lapic_clockevent.features |=CLOCK_EVT_FEAT_DUMMY ; + +local_irq_enable (); +clockevents_notify (CLOCK_EVT_NOTIFY_BROADCAST_FORCE , + &boot_cpu_physical_apicid); +local_irq_disable (); +} + +void __cpuinit setup_secondary_APIC_clock (void ) +{ +check_boot_apic_timer_broadcast ();setup_APIC_timer (); }
@@ -1513,6 +1536,9 @@ void __cpuinit generic_processor_info(int apicid, int version)*/ cpu =0 ; +if (apicid > max_physical_apicid) + max_physical_apicid = apicid; +/* * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y * but we need to work other dependencies like SMP_SUSPEND etc
@@ -1520,7 +1546,7 @@ void __cpuinit generic_processor_info(int apicid, int version)* if (CPU_HOTPLUG_ENABLED || num_processors > 8) * - Ashok Raj <[email protected]> */ -if (num_processors >8 ) { +if (max_physical_apicid >=8 ) {switch (boot_cpu_data.x86_vendor) {case X86_VENDOR_INTEL :if (!APIC_XAPIC (version)) {
arch/x86/kernel/apic_64.c +3 -0
@@ -1090,6 +1090,9 @@ void __cpuinit generic_processor_info(int apicid, int version)*/ cpu =0 ; } +if (apicid > max_physical_apicid) + max_physical_apicid = apicid; +/* are we being called early in kernel startup? */ if (x86_cpu_to_apicid_early_ptr) {u16 *cpu_to_apicid = x86_cpu_to_apicid_early_ptr;
arch/x86/kernel/cpu/bugs.c +5 -1
@@ -50,6 +50,8 @@ static double __initdata y = 3145727.0;*/ static void __init check_fpu (void ) { +s32 fdiv_bug; +if (!boot_cpu_data.hard_math) {#ifndef CONFIG_MATH_EMULATION printk (KERN_EMERG "No coprocessor found and no math emulation present.\n" );
@@ -70,8 +72,10 @@ static void __init check_fpu(void) "fistpl %0\n\t" "fwait\n\t" "fninit" - : "=m" (*&boot_cpu_data.fdiv_bug) + : "=m" (*&fdiv_bug) : "m" (*&x), "m" (*&y)); + + boot_cpu_data.fdiv_bug = fdiv_bug;if (boot_cpu_data.fdiv_bug)printk ("Hmm, FPU with FDIV bug.\n" ); }
arch/x86/kernel/e820_32.c +1 -1
@@ -697,7 +697,7 @@ static int __init parse_memmap(char *arg)if (!arg)return -EINVAL ; -if (strcmp (arg,"exactmap" ) ==0 ) { +if (strncmp (arg,"exactmap" ,8 ) ==0 ) {#ifdef CONFIG_CRASH_DUMP /* If we are doing a crash dump, we * still need to know the real mem
arch/x86/kernel/e820_64.c +1 -1
@@ -776,7 +776,7 @@ static int __init parse_memmap_opt(char *p)char *oldp;unsigned long long start_at, mem_size; -if (!strcmp (p,"exactmap" )) { +if (!strncmp (p,"exactmap" ,8 )) {#ifdef CONFIG_CRASH_DUMP /* * If we are doing a crash dump, we still need to know
arch/x86/kernel/genapic_64.c +1 -1
@@ -51,7 +51,7 @@ void __init setup_apic_routing(void) else#endif -if (num_possible_cpus () <=8 ) +if (max_physical_apicid <8 ) genapic = &apic_flat;else genapic = &apic_physflat;
arch/x86/kernel/head64.c +1 -0
@@ -135,6 +135,7 @@ void __init x86_64_start_kernel(char * real_mode_data)BUILD_BUG_ON (!(MODULES_VADDR > __START_KERNEL));BUILD_BUG_ON (!(((MODULES_END -1 ) &PGDIR_MASK ) == (__START_KERNEL &PGDIR_MASK ))); +BUILD_BUG_ON (__fix_to_virt (__end_of_fixed_addresses) <=MODULES_END );/* clear bss before set_intr_gate with early_idt_handler */ clear_bss ();
arch/x86/kernel/hpet.c +13 -6
@@ -223,8 +223,8 @@ static void hpet_legacy_clockevent_register(void)/* Calculate the min / max delta */ hpet_clockevent.max_delta_ns =clockevent_delta2ns (0x7FFFFFFF , &hpet_clockevent); - hpet_clockevent.min_delta_ns =clockevent_delta2ns (0x30 , - &hpet_clockevent); +/* 5 usec minimum reprogramming delta. */ + hpet_clockevent.min_delta_ns =5000 ;/* * Start hpet with the boot cpu mask and make it
@@ -283,15 +283,22 @@ static void hpet_legacy_set_mode(enum clock_event_mode mode, }static int hpet_legacy_next_event (unsigned long delta, -struct clock_event_device *evt) +struct clock_event_device *evt) { -unsigned long cnt; +u32 cnt; cnt =hpet_readl (HPET_COUNTER ); - cnt += delta; + cnt += (u32 ) delta;hpet_writel (cnt,HPET_T0_CMP ); -return ((long )(hpet_readl (HPET_COUNTER ) - cnt ) >0 ) ? -ETIME :0 ; +/* +* We need to read back the CMP register to make sure that +* what we wrote hit the chip before we compare it to the +* counter. +*/ +WARN_ON ((u32 )hpet_readl (HPET_T0_CMP ) != cnt); + +return (s32)((u32 )hpet_readl (HPET_COUNTER ) - cnt) >=0 ? -ETIME :0 ; }/*
arch/x86/kernel/io_delay.c +8 -0
@@ -92,6 +92,14 @@ static struct dmi_system_id __initdata io_delay_0xed_port_dmi_table[] = { DMI_MATCH(DMI_BOARD_NAME, "30BF") } }, + { + .callback = dmi_io_delay_0xed_port, + .ident = "Presario F700", + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"Quanta" ), + DMI_MATCH(DMI_BOARD_NAME, "30D3") + } + }, { } };
arch/x86/kernel/mpparse.c +5 -0
@@ -402,6 +402,11 @@ static int __init smp_read_mpc(struct mp_config_table *mpc, unsigned early) ++mpc_record;#endif } + +#ifdef CONFIG_X86_GENERICARCH +generic_bigsmp_probe (); +#endif +setup_apic_routing ();if (!num_processors)printk (KERN_ERR "MPTABLE: no processors registered!\n" );
arch/x86/kernel/setup.c +1 -0
@@ -17,6 +17,7 @@ unsigned int num_processors;unsigned disabled_cpus__cpuinitdata ;/* Processor that is doing the boot up */ unsigned int boot_cpu_physical_apicid =-1U ; +unsigned int max_physical_apicid;EXPORT_SYMBOL (boot_cpu_physical_apicid);DEFINE_PER_CPU (u16, x86_cpu_to_apicid) =BAD_APICID ;
arch/x86/kernel/setup_32.c +6 -5
@@ -914,6 +914,12 @@ void __init setup_arch(char **cmdline_p)#ifdef CONFIG_ACPI acpi_boot_init (); +#endif + +#ifdef CONFIG_X86_LOCAL_APIC +if (smp_found_config) +get_smp_config (); +#endif #if defined(CONFIG_SMP ) && defined(CONFIG_X86_PC )if (def_to_bigsmp)
@@ -921,11 +927,6 @@ void __init setup_arch(char **cmdline_p)"CONFIG_X86_PC cannot handle it.\nUse " "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");#endif -#endif -#ifdef CONFIG_X86_LOCAL_APIC -if (smp_found_config) -get_smp_config (); -#endif e820_register_memory ();e820_mark_nosave_regions ();
arch/x86/kernel/signal_64.c +62 -0
68 lines not on this page · raw message
arch/x86/kernel/traps_64.c +8 -1
@@ -1141,7 +1141,14 @@ asmlinkage void math_state_restore(void) }clts ();/* Allow maths ops (or we recurse) */ -restore_fpu_checking (&me->thread.xstate->fxsave); +/* +* Paranoid restore. send a SIGSEGV if we fail to restore the state. +*/ +if (unlikely (restore_fpu_checking (&me->thread.xstate->fxsave))) { +stts (); +force_sig (SIGSEGV , me); +return ; + }task_thread_info (me)->status |=TS_USEDFPU ; me->fpu_counter++; }
arch/x86/kernel/vmi_32.c +1 -1
@@ -234,7 +234,7 @@ static void vmi_write_ldt_entry(struct desc_struct *dt, int entry, const void *desc) {u32 *ldt_entry = (u32 *)desc; - vmi_ops.write_idt_entry (dt, entry, ldt_entry[0 ], ldt_entry[1 ]); + vmi_ops.write_ldt_entry (dt, entry, ldt_entry[0 ], ldt_entry[1 ]); } static void vmi_load_sp0(struct tss_struct *tss,
arch/x86/kernel/vsmp_64.c +1 -1
@@ -58,7 +58,7 @@ static void vsmp_irq_enable(void)native_restore_fl ((flags |X86_EFLAGS_IF ) & (~X86_EFLAGS_AC )); } -static unsigned __init vsmp_patch (u8 type,u16 clobbers,void *ibuf, +static unsigned __init_or_module vsmp_patch (u8 type,u16 clobbers,void *ibuf,unsigned long addr,unsigned len) {switch (type) {
arch/x86/kvm/svm.c +14 -0
@@ -60,6 +60,7 @@ static int npt = 1;module_param (npt, int,S_IRUGO );static void kvm_reput_irq (struct vcpu_svm *svm); +static void svm_flush_tlb (struct kvm_vcpu *vcpu);static inline struct vcpu_svm *to_svm (struct kvm_vcpu *vcpu) {
@@ -879,6 +880,10 @@ set:static void svm_set_cr4 (struct kvm_vcpu *vcpu,unsigned long cr4) {unsigned long host_cr4_mce =read_cr4 () &X86_CR4_MCE ; +unsigned long old_cr4 =to_svm (vcpu)->vmcb->save.cr4; + +if (npt_enabled && ((old_cr4 ^ cr4) &X86_CR4_PGE )) +force_new_asid (vcpu); vcpu->arch.cr4 = cr4;if (!npt_enabled)
@@ -1017,6 +1022,15 @@ static int pf_interception(struct vcpu_svm *svm, struct kvm_run *kvm_run) fault_address = svm->vmcb->control.exit_info_2; error_code = svm->vmcb->control.exit_info_1; + +/* +* FIXME: Tis shouldn't be necessary here, but there is a flush +* missing in the MMU code. Until we find this bug, flush the +* complete TLB here on an NPF +*/ +if (npt_enabled) +svm_flush_tlb (&svm->vcpu); +if (event_injection)kvm_mmu_unprotect_page_virt (&svm->vcpu, fault_address);return kvm_mmu_page_fault (&svm->vcpu, fault_address, error_code);
arch/x86/mach-generic/bigsmp.c +1 -1
@@ -48,7 +48,7 @@ static const struct dmi_system_id bigsmp_dmi_table[] = {static int probe_bigsmp (void ) {if (def_to_bigsmp) - dmi_bigsmp =1 ; + dmi_bigsmp =1 ;else dmi_check_system (bigsmp_dmi_table);return dmi_bigsmp;
arch/x86/mm/pageattr.c +3 -3
@@ -789,7 +789,7 @@ int set_memory_uc(unsigned long addr, int numpages)/* * for now UC MINUS. see comments in ioremap_nocache() */ -if (reserve_memtype (addr, addr + numpages *PAGE_SIZE , +if (reserve_memtype (__pa (addr),__pa (addr) + numpages *PAGE_SIZE , _PAGE_CACHE_UC_MINUS,NULL ))return -EINVAL ;
@@ -808,7 +808,7 @@ int set_memory_wc(unsigned long addr, int numpages)if (!pat_wc_enabled)return set_memory_uc (addr, numpages); -if (reserve_memtype (addr, addr + numpages *PAGE_SIZE , +if (reserve_memtype (__pa (addr),__pa (addr) + numpages *PAGE_SIZE , _PAGE_CACHE_WC,NULL ))return -EINVAL ;
@@ -824,7 +824,7 @@ int _set_memory_wb(unsigned long addr, int numpages)int set_memory_wb (unsigned long addr,int numpages) { -free_memtype (addr, addr + numpages *PAGE_SIZE ); +free_memtype (__pa (addr),__pa (addr) + numpages *PAGE_SIZE );return _set_memory_wb (addr, numpages); }
arch/x86/oprofile/nmi_int.c +36 -3
@@ -15,6 +15,7 @@#include <linux/slab.h> #include <linux/moduleparam.h> #include <linux/kdebug.h> +#include <linux/cpu.h> #include <asm/nmi.h> #include <asm/msr.h> #include <asm/apic.h>
@@ -28,23 +29,48 @@ static DEFINE_PER_CPU(unsigned long, saved_lvtpc);static int nmi_start (void );static void nmi_stop (void ); +static void nmi_cpu_start (void *dummy); +static void nmi_cpu_stop (void *dummy);/* 0 == registered but off, 1 == registered and on */ static int nmi_enabled =0 ; +#ifdef CONFIG_SMP +static int oprofile_cpu_notifier (struct notifier_block *b,unsigned long action, +void *data) +{ +int cpu = (unsigned long )data; +switch (action) { +case CPU_DOWN_FAILED : +case CPU_ONLINE : +smp_call_function_single (cpu, nmi_cpu_start,NULL ,0 ,0 ); +break ; +case CPU_DOWN_PREPARE : +smp_call_function_single (cpu, nmi_cpu_stop,NULL ,0 ,1 ); +break ; + } +return NOTIFY_DONE ; +} + +static struct notifier_block oprofile_cpu_nb = { + .notifier_call = oprofile_cpu_notifier +}; +#endif +#ifdef CONFIG_PM static int nmi_suspend (struct sys_device *dev,pm_message_t state) { +/* Only one CPU left, just stop that one */ if (nmi_enabled ==1 ) -nmi_stop (); +nmi_cpu_stop (NULL );return 0 ; }static int nmi_resume (struct sys_device *dev) {if (nmi_enabled ==1 ) -nmi_start (); +nmi_cpu_start (NULL );return 0 ; }
@@ -448,6 +474,9 @@ int __init op_nmi_init(struct oprofile_operations *ops) }init_sysfs (); +#ifdef CONFIG_SMP +register_cpu_notifier (&oprofile_cpu_nb); +#endif using_nmi =1 ; ops->create_files = nmi_create_files; ops->setup = nmi_setup;
@@ -461,6 +490,10 @@ int __init op_nmi_init(struct oprofile_operations *ops)void op_nmi_exit (void ) { -if (using_nmi) +if (using_nmi) {exit_sysfs (); +#ifdef CONFIG_SMP +unregister_cpu_notifier (&oprofile_cpu_nb); +#endif + } }
crypto/async_tx/async_tx.c +2 -1
@@ -136,7 +136,8 @@ async_tx_run_dependencies(struct dma_async_tx_descriptor *tx)spin_lock_bh (&next->lock); next->parent =NULL ; _next = next->next; - next->next =NULL ; +if (_next && _next->chan == chan) + next->next =NULL ;spin_unlock_bh (&next->lock); next->tx_submit (next);
drivers/accessibility/braille/braille_console.c +4 -9
@@ -376,6 +376,8 @@ int braille_register_console(struct console *console, int index, console->flags |=CON_ENABLED ; console->index = index; braille_co = console; +register_keyboard_notifier (&keyboard_notifier_block); +register_vt_notifier (&vt_notifier_block);return 0 ; }
@@ -383,15 +385,8 @@ int braille_unregister_console(struct console *console) {if (braille_co != console)return -EINVAL ; +unregister_keyboard_notifier (&keyboard_notifier_block); +unregister_vt_notifier (&vt_notifier_block); braille_co =NULL ;return 0 ; } - -static int __init braille_init (void ) -{ -register_keyboard_notifier (&keyboard_notifier_block); -register_vt_notifier (&vt_notifier_block); -return 0 ; -} - -console_initcall (braille_init);
drivers/acpi/ec.c +2 -0
@@ -196,6 +196,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)return 0 ;msleep (1 ); } +if (acpi_ec_check_status (ec,event)) +return 0 ; } pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", acpi_ec_read_status(ec),
drivers/acpi/processor_perflib.c +1 -1
@@ -70,7 +70,7 @@ static DEFINE_MUTEX(performance_mutex);* 0 -> cpufreq low level drivers initialized -> consider _PPC values * 1 -> ignore _PPC totally -> forced by user through boot param */ -static unsigned int ignore_ppc =-1 ; +static int ignore_ppc =-1 ;module_param (ignore_ppc, uint,0644 );MODULE_PARM_DESC (ignore_ppc,"If the frequency of your machine gets wrongly" \"limited by BIOS, this should help" );
drivers/i2c/i2c-dev.c +3 -1
@@ -581,8 +581,10 @@ static int __init i2c_dev_init(void) goto out; i2c_dev_class =class_create (THIS_MODULE ,"i2c-dev" ); -if (IS_ERR (i2c_dev_class)) +if (IS_ERR (i2c_dev_class)) { + res =PTR_ERR (i2c_dev_class); goto out_unreg_chrdev; + } res =i2c_add_driver (&i2cdev_driver);if (res)
drivers/mmc/card/block.c +3 -1
@@ -103,8 +103,10 @@ static int mmc_blk_open(struct inode *inode, struct file *filp)check_disk_change (inode->i_bdev); ret =0 ; -if ((filp->f_mode &FMODE_WRITE ) && md->read_only) +if ((filp->f_mode &FMODE_WRITE ) && md->read_only) { +mmc_blk_put (md); ret = -EROFS ; + } }return ret;
drivers/net/ixgbe/ixgbe_main.c +6 -0
@@ -2258,6 +2258,12 @@ static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapterint vector, v_budget;/* +* Set the default interrupt throttle rate. +*/ + adapter->rx_eitr = (1000000 /IXGBE_DEFAULT_ITR_RX_USECS ); + adapter->tx_eitr = (1000000 /IXGBE_DEFAULT_ITR_TX_USECS ); + +/* * It's easy to be greedy for MSI-X vectors, but it really * doesn't do us much good if we have a lot more vectors * than CPU's. So let's be conservative and only ask for
drivers/net/niu.c +56 -0
68 lines not on this page · raw message
drivers/net/wireless/rt2x00/rt2x00.h +3 -1
@@ -820,8 +820,10 @@ struct rt2x00_dev {/* * Scheduled work. +* NOTE: intf_work will use ieee80211_iterate_active_interfaces() +* which means it cannot be placed on the hw->workqueue +* due to RTNL locking requirements. */ -struct workqueue_struct *workqueue;struct work_struct intf_work;struct work_struct filter_work;
drivers/net/wireless/rt2x00/rt2x00dev.c +3 -14
@@ -75,7 +75,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev)rt2x00lib_reset_link_tuner (rt2x00dev); -queue_delayed_work (rt2x00dev->workqueue, +queue_delayed_work (rt2x00dev->hw->workqueue, &rt2x00dev->link.work,LINK_TUNE_INTERVAL ); }
@@ -390,7 +390,7 @@ static void rt2x00lib_link_tuner(struct work_struct *work)* Increase tuner counter, and reschedule the next link tuner run. */ rt2x00dev->link.count++; -queue_delayed_work (rt2x00dev->workqueue, +queue_delayed_work (rt2x00dev->hw->workqueue, &rt2x00dev->link.work,LINK_TUNE_INTERVAL ); }
@@ -488,7 +488,7 @@ void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev) rt2x00lib_beacondone_iter, rt2x00dev); -queue_work (rt2x00dev->workqueue, &rt2x00dev->intf_work); +schedule_work (&rt2x00dev->intf_work); }EXPORT_SYMBOL_GPL (rt2x00lib_beacondone);
@@ -1131,10 +1131,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)/* * Initialize configuration work. */ - rt2x00dev->workqueue =create_singlethread_workqueue ("rt2x00lib" ); -if (!rt2x00dev->workqueue) - goto exit; -INIT_WORK (&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);INIT_WORK (&rt2x00dev->filter_work, rt2x00lib_packetfilter_scheduled);INIT_DELAYED_WORK (&rt2x00dev->link.work, rt2x00lib_link_tuner);
@@ -1195,13 +1191,6 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)rt2x00leds_unregister (rt2x00dev);/* -* Stop all queued work. Note that most tasks will already be halted -* during rt2x00lib_disable_radio() and rt2x00lib_uninitialize(). -*/ -flush_workqueue (rt2x00dev->workqueue); -destroy_workqueue (rt2x00dev->workqueue); - -/* * Free ieee80211_hw memory. */ rt2x00lib_remove_hw (rt2x00dev);
drivers/net/wireless/rt2x00/rt2x00mac.c +2 -2
@@ -428,7 +428,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,if (!test_bit (DRIVER_REQUIRE_SCHEDULED , &rt2x00dev->flags)) rt2x00dev->ops->lib->config_filter (rt2x00dev, *total_flags);else -queue_work (rt2x00dev->workqueue, &rt2x00dev->filter_work); +queue_work (rt2x00dev->hw->workqueue, &rt2x00dev->filter_work); }EXPORT_SYMBOL_GPL (rt2x00mac_configure_filter);
@@ -509,7 +509,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,memcpy (&intf->conf, bss_conf,sizeof (*bss_conf));if (delayed) { intf->delayed_flags |= delayed; -queue_work (rt2x00dev->workqueue, &rt2x00dev->intf_work); +schedule_work (&rt2x00dev->intf_work); }spin_unlock (&intf->lock); }
drivers/pcmcia/ds.c +14 -9
@@ -428,6 +428,18 @@ static int pcmcia_device_probe(struct device * dev) p_drv =to_pcmcia_drv (dev->driver); s = p_dev->socket; +/* The PCMCIA code passes the match data in via dev->driver_data +* which is an ugly hack. Once the driver probe is called it may +* and often will overwrite the match data so we must save it first +* +* handle pseudo multifunction devices: +* there are at most two pseudo multifunction devices. +* if we're matching against the first, schedule a +* call which will then check whether there are two +* pseudo devices, and if not, add the second one. +*/ + did = p_dev->dev.driver_data; +ds_dbg (1 ,"trying to bind %s to %s\n" , p_dev->dev.bus_id, p_drv->drv.name);
@@ -456,21 +468,14 @@ static int pcmcia_device_probe(struct device * dev) goto put_module; } -/* handle pseudo multifunction devices: -* there are at most two pseudo multifunction devices. -* if we're matching against the first, schedule a -* call which will then check whether there are two -* pseudo devices, and if not, add the second one. -*/ - did = p_dev->dev.driver_data;if (did && (did->match_flags &PCMCIA_DEV_ID_MATCH_DEVICE_NO ) && (p_dev->socket->device_count ==1 ) && (p_dev->device_no ==0 ))pcmcia_add_device_later (p_dev->socket,0 ); - put_module: +put_module:if (ret)module_put (p_drv->owner); - put_dev: +put_dev:if (ret)put_device (dev);return (ret);
drivers/rtc/rtc-dev.c +9 -6
@@ -401,6 +401,12 @@ static int rtc_dev_ioctl(struct inode *inode, struct file *file,return err; } +static int rtc_dev_fasync (int fd,struct file *file,int on) +{ +struct rtc_device *rtc = file->private_data; +return fasync_helper (fd, file, on, &rtc->async_queue); +} +static int rtc_dev_release (struct inode *inode,struct file *file) {struct rtc_device *rtc = file->private_data;
@@ -411,16 +417,13 @@ static int rtc_dev_release(struct inode *inode, struct file *file)if (rtc->ops->release) rtc->ops->release (rtc->dev.parent); +if (file->f_flags &FASYNC ) +rtc_dev_fasync (-1 , file,0 ); +clear_bit_unlock (RTC_DEV_BUSY , &rtc->flags);return 0 ; } -static int rtc_dev_fasync (int fd,struct file *file,int on) -{ -struct rtc_device *rtc = file->private_data; -return fasync_helper (fd, file, on, &rtc->async_queue); -} -static const struct file_operations rtc_dev_fops = { .owner =THIS_MODULE , .llseek = no_llseek,
drivers/scsi/qla2xxx/qla_isr.c +0 -1
@@ -1838,7 +1838,6 @@ clear_risc_ints:WRT_REG_WORD (®->isp.hccr,HCCR_CLR_HOST_INT ); }spin_unlock_irq (&ha->hardware_lock); - ha->isp_ops->enable_intrs (ha); fail:return ret;
drivers/scsi/qla2xxx/qla_os.c +2 -0
@@ -1740,6 +1740,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)if (ret) goto probe_failed; + ha->isp_ops->enable_intrs (ha); +scsi_scan_host (host);qla2x00_alloc_sysfs_attr (ha);
drivers/spi/pxa2xx_spi.c +91 -25
180 lines not on this page · raw message
drivers/usb/core/hcd.c +2 -1
@@ -1885,7 +1885,8 @@ int usb_add_hcd(struct usb_hcd *hcd,* with IRQF_SHARED. As usb_hcd_irq() will always disable * interrupts we can remove it here. */ - irqflags &= ~IRQF_DISABLED ; +if (irqflags &IRQF_SHARED ) + irqflags &= ~IRQF_DISABLED ;snprintf (hcd->irq_descr,sizeof (hcd->irq_descr),"%s:usb%d" , hcd->driver->description, hcd->self.busnum);
drivers/video/console/fbcon.h +1 -1
@@ -110,7 +110,7 @@ static inline int mono_col(const struct fb_info *info)__u32 max_len; max_len =max (info->var.green.length, info->var.red.length); max_len =max (info->var.blue.length, max_len); -return ~(0xfff << (max_len &0xff )); +return (~(0xfff << max_len)) &0xff ; } static inline int attr_col_ec(int shift, struct vc_data *vc,
fs/buffer.c +8 -5
@@ -2868,14 +2868,17 @@ int submit_bh(int rw, struct buffer_head * bh)BUG_ON (!buffer_mapped (bh));BUG_ON (!bh->b_end_io); -if (buffer_ordered (bh) && (rw ==WRITE )) - rw =WRITE_BARRIER ; +/* +* Mask in barrier bit for a write (could be either a WRITE or a +* WRITE_SYNC +*/ +if (buffer_ordered (bh) && (rw &WRITE )) + rw |=WRITE_BARRIER ;/* -* Only clear out a write error when rewriting, should this -* include WRITE_SYNC as well? +* Only clear out a write error when rewriting */ -if (test_set_buffer_req (bh) && (rw ==WRITE || rw ==WRITE_BARRIER )) +if (test_set_buffer_req (bh) && (rw &WRITE ))clear_buffer_write_io_error (bh);/*
fs/exec.c +1 -1
@@ -740,11 +740,11 @@ static int exec_mmap(struct mm_struct *mm) tsk->active_mm = mm;activate_mm (active_mm, mm);task_unlock (tsk); -mm_update_next_owner (old_mm);arch_pick_mmap_layout (mm);if (old_mm) {up_read (&old_mm->mmap_sem);BUG_ON (active_mm != old_mm); +mm_update_next_owner (old_mm);mmput (old_mm);return 0 ; }
fs/ocfs2/stackglue.c +4 -3
@@ -97,13 +97,14 @@ static int ocfs2_stack_driver_request(const char *stack_name, goto out; } -/* Ok, the stack is pinned */ - p->sp_count++; active_stack = p; - rc =0 ; out: +/* If we found it, pin it */ +if (!rc) + active_stack->sp_count++; +spin_unlock (&ocfs2_stack_lock);return rc; }
fs/proc/array.c +0 -59
65 lines not on this page · raw message
include/asm-generic/rtc.h +4 -8
@@ -15,6 +15,7 @@#include <linux/mc146818rtc.h> #include <linux/rtc.h> #include <linux/bcd.h> +#include <linux/delay.h> #define RTC_PIE 0x40/* periodic interrupt enable */ #define RTC_AIE 0x20/* alarm interrupt enable */
@@ -43,7 +44,6 @@ static inline unsigned char rtc_is_updating(void)static inline unsigned int get_rtc_time (struct rtc_time *time) { -unsigned long uip_watchdog = jiffies;unsigned char ctrl;unsigned long flags;
@@ -53,19 +53,15 @@ static inline unsigned int get_rtc_time(struct rtc_time *time)/* * read RTC once any update in progress is done. The update -* can take just over 2ms. We wait 10 to 20ms. There is no need to +* can take just over 2ms. We wait 20ms. There is no need to * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP. * If you need to know *exactly* when a second has started, enable * periodic update complete interrupts, (via ioctl) and then * immediately read /dev/rtc which will block until you get the IRQ. * Once the read clears, read the RTC time (again via ioctl). Easy. */ - -if (rtc_is_updating () !=0 ) -while (jiffies - uip_watchdog <2 *HZ /100 ) { -barrier (); -cpu_relax (); - } +if (rtc_is_updating ()) +mdelay (20 );/* * Only the values that we read from the RTC are set. We leave
include/asm-x86/i387.h +0 -56
68 lines not on this page · raw message
include/asm-x86/mpspec.h +1 -0
@@ -35,6 +35,7 @@ extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);extern int mp_bus_id_to_pci_bus[MAX_MP_BUSSES ];extern unsigned int boot_cpu_physical_apicid; +extern unsigned int max_physical_apicid;extern int smp_found_config;extern int mpc_default_type;extern unsigned long mp_lapic_addr;
include/asm-x86/pgtable_64.h +1 -1
@@ -146,7 +146,7 @@ static inline void native_pgd_clear(pgd_t *pgd)#define VMALLOC_END _AC(0xffffe1ffffffffff, UL)#define VMEMMAP_START _AC(0xffffe20000000000, UL)#define MODULES_VADDR _AC(0xffffffffa0000000, UL) -#define MODULES_END _AC(0xfffffffffff00000, UL) +#define MODULES_END _AC(0xffffffffff000000, UL)#define MODULES_LEN (MODULES_END - MODULES_VADDR)#ifndef __ASSEMBLY__
include/linux/clockchips.h +2 -0
@@ -127,6 +127,8 @@ extern int clockevents_register_notifier(struct notifier_block *nb);extern int clockevents_program_event (struct clock_event_device *dev,ktime_t expires,ktime_t now); +extern void clockevents_handle_noop (struct clock_event_device *dev); +#ifdef CONFIG_GENERIC_CLOCKEVENTS extern void clockevents_notify (unsigned long reason,void *arg);#else
include/linux/mmzone.h +6 -6
@@ -751,8 +751,9 @@ static inline int zonelist_node_idx(struct zoneref *zoneref)* * This function returns the next zone at or below a given zone index that is * within the allowed nodemask using a cursor as the starting point for the -* search. The zoneref returned is a cursor that is used as the next starting -* point for future calls to next_zones_zonelist(). +* search. The zoneref returned is a cursor that represents the current zone +* being examined. It should be advanced by one before calling +* next_zones_zonelist again. */ struct zoneref *next_zones_zonelist(struct zoneref *z, enum zone_type highest_zoneidx,
@@ -768,9 +769,8 @@ struct zoneref *next_zones_zonelist(struct zoneref *z,* * This function returns the first zone at or below a given zone index that is * within the allowed nodemask. The zoneref returned is a cursor that can be -* used to iterate the zonelist with next_zones_zonelist. The cursor should -* not be used by the caller as it does not match the value of the zone -* returned. +* used to iterate the zonelist with next_zones_zonelist by advancing it by +* one before calling. */ static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist, enum zone_type highest_zoneidx,
@@ -795,7 +795,7 @@ static inline struct zoneref *first_zones_zonelist(struct zonelist *zonelist,#define for_each_zone_zonelist_nodemask (zone, z, zlist, highidx, nodemask) \ for (z = first_zones_zonelist(zlist, highidx, nodemask, &zone); \ zone; \ - z = next_zones_zonelist(z, highidx, nodemask, &zone)) \ + z = next_zones_zonelist(++z, highidx, nodemask, &zone)) \/** * for_each_zone_zonelist - helper macro to iterate over valid zones in a zonelist at or below a given zone index
include/linux/rmap.h +1 -1
@@ -94,7 +94,7 @@ int try_to_unmap(struct page *, int ignore_refs);* Called from mm/filemap_xip.c to unmap empty zero page */ pte_t *page_check_address (struct page *,struct mm_struct *, -unsigned long ,spinlock_t **); +unsigned long ,spinlock_t **,int );/* * Used by swapoff to help locate where page is expected in vma.
include/linux/sched.h +4 -0
@@ -1477,6 +1477,10 @@ static inline void put_task_struct(struct task_struct *t)__put_task_struct (t); } +extern cputime_t task_utime (struct task_struct *p); +extern cputime_t task_stime (struct task_struct *p); +extern cputime_t task_gtime (struct task_struct *p); +/* * Per process flags */
include/linux/smb.h +2 -0
@@ -11,7 +11,9 @@#include <linux/types.h> #include <linux/magic.h> +#ifdef __KERNEL__#include <linux/time.h> +#endif enum smb_protocol {SMB_PROTOCOL_NONE ,
include/net/netlink.h +1 -1
@@ -702,7 +702,7 @@ static inline int nla_len(const struct nlattr *nla)*/ static inline int nla_ok (const struct nlattr *nla,int remaining) { -return remaining >=sizeof (*nla) && +return remaining >= (int )sizeof (*nla) && nla->nla_len >=sizeof (*nla) && nla->nla_len <= remaining; }
kernel/cgroup.c +3 -2
@@ -2761,14 +2761,15 @@ void cgroup_fork_callbacks(struct task_struct *child)*/ void cgroup_mm_owner_callbacks (struct task_struct *old,struct task_struct *new) { -struct cgroup *oldcgrp, *newcgrp; +struct cgroup *oldcgrp, *newcgrp =NULL ;if (need_mm_owner_callback) {int i;for (i =0 ; i <CGROUP_SUBSYS_COUNT ; i++) {struct cgroup_subsys *ss = subsys[i]; oldcgrp =task_cgroup (old, ss->subsys_id); - newcgrp =task_cgroup (new, ss->subsys_id); +if (new) + newcgrp =task_cgroup (new, ss->subsys_id);if (oldcgrp == newcgrp)continue ;if (ss->mm_owner_changed)
kernel/exit.c +13 -5
@@ -111,9 +111,9 @@ static void __exit_signal(struct task_struct *tsk)* We won't ever get here for the group leader, since it * will have been the last reference on the signal_struct. */ - sig->utime =cputime_add (sig->utime, tsk->utime); - sig->stime =cputime_add (sig->stime, tsk->stime); - sig->gtime =cputime_add (sig->gtime, tsk->gtime); + sig->utime =cputime_add (sig->utime,task_utime (tsk)); + sig->stime =cputime_add (sig->stime,task_stime (tsk)); + sig->gtime =cputime_add (sig->gtime,task_gtime (tsk)); sig->min_flt += tsk->min_flt; sig->maj_flt += tsk->maj_flt; sig->nvcsw += tsk->nvcsw;
@@ -577,8 +577,6 @@ mm_need_new_owner(struct mm_struct *mm, struct task_struct *p)* If there are other users of the mm and the owner (us) is exiting * we need to find a new owner to take on the responsibility. */ -if (!mm) -return 0 ;if (atomic_read (&mm->mm_users) <=1 )return 0 ;if (mm->owner != p)
@@ -621,6 +619,16 @@ retry: }while_each_thread (g, c);read_unlock (&tasklist_lock); +/* +* We found no owner yet mm_users > 1: this implies that we are +* most likely racing with swapoff (try_to_unuse()) or /proc or +* ptrace or page migration (get_task_mm()). Mark owner as NULL, +* so that subsystems can understand the callback and take action. +*/ +down_write (&mm->mmap_sem); +cgroup_mm_owner_callbacks (mm->owner,NULL ); + mm->owner =NULL ; +up_write (&mm->mmap_sem);return ; assign_new_owner:
kernel/sched.c +59 -0
65 lines not on this page · raw message
kernel/time/clockevents.c +1 -2
@@ -177,7 +177,7 @@ void clockevents_register_device(struct clock_event_device *dev)/* * Noop handler when we shut down an event device */ -static void clockevents_handle_noop (struct clock_event_device *dev) +void clockevents_handle_noop (struct clock_event_device *dev) { }
@@ -199,7 +199,6 @@ void clockevents_exchange_device(struct clock_event_device *old,* released list and do a notify add later. */ if (old) { - old->event_handler = clockevents_handle_noop;clockevents_set_mode (old,CLOCK_EVT_MODE_UNUSED );list_del (&old->list);list_add (&old->list, &clockevents_released);
kernel/time/ntp.c +1 -1
@@ -245,7 +245,7 @@ static void sync_cmos_clock(unsigned long dummy)if (abs (now.tv_nsec - (NSEC_PER_SEC /2 )) <= tick_nsec /2 ) fail =update_persistent_clock (now); - next.tv_nsec = (NSEC_PER_SEC /2 ) - now.tv_nsec; + next.tv_nsec = (NSEC_PER_SEC /2 ) - now.tv_nsec - (TICK_NSEC /2 );if (next.tv_nsec <=0 ) next.tv_nsec +=NSEC_PER_SEC ;
kernel/time/tick-broadcast.c +58 -20
126 lines not on this page · raw message
kernel/time/tick-common.c +1 -0
@@ -161,6 +161,7 @@ static void tick_setup_device(struct tick_device *td, }else { handler = td->evtdev->event_handler; next_event = td->evtdev->next_event; + td->evtdev->event_handler = clockevents_handle_noop; } td->evtdev = newdev;
kernel/time/tick-internal.h +2 -0
@@ -17,6 +17,8 @@ extern void tick_handle_periodic(struct clock_event_device *dev);extern void tick_setup_oneshot (struct clock_event_device *newdev,void (*handler)(struct clock_event_device *),ktime_t nextevt); +extern int tick_dev_program_event (struct clock_event_device *dev, +ktime_t expires,int force);extern int tick_program_event (ktime_t expires,int force);extern void tick_oneshot_notify (void );extern int tick_switch_to_oneshot (void (*handler)(struct clock_event_device *));
kernel/time/tick-oneshot.c +38 -6
69 lines not on this page · raw message
lib/scatterlist.c +4 -1
@@ -312,8 +312,9 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,struct scatterlist *sg;size_t buf_off =0 ;int i; +unsigned long flags; -WARN_ON (!irqs_disabled ()); +local_irq_save (flags);for_each_sg (sgl, sg, nents, i) {struct page *page;
@@ -358,6 +359,8 @@ static size_t sg_copy_buffer(struct scatterlist *sgl, unsigned int nents,break ; } +local_irq_restore (flags); +return buf_off; }
mm/filemap_xip.c +1 -1
@@ -184,7 +184,7 @@ __xip_unmap (struct address_space * mapping, address = vma->vm_start + ((pgoff - vma->vm_pgoff) <<PAGE_SHIFT );BUG_ON (address < vma->vm_start || address >= vma->vm_end); - pte =page_check_address (page, mm, address, &ptl); + pte =page_check_address (page, mm, address, &ptl,1 );if (pte) {/* Nuke the page table entry. */ flush_cache_page (vma, address,pte_pfn (*pte));
mm/memcontrol.c +13 -0
@@ -250,6 +250,14 @@ static struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont)struct mem_cgroup *mem_cgroup_from_task (struct task_struct *p) { +/* +* mm_update_next_owner() may clear mm->owner to NULL +* if it races with swapoff, page migration, etc. +* So this can be called with p == NULL. +*/ +if (unlikely (!p)) +return NULL ; +return container_of (task_subsys_state (p, mem_cgroup_subsys_id), struct mem_cgroup, css); }
@@ -574,6 +582,11 @@ retry:rcu_read_lock (); mem =mem_cgroup_from_task (rcu_dereference (mm->owner)); +if (unlikely (!mem)) { +rcu_read_unlock (); +kmem_cache_free (page_cgroup_cache, pc); +return 0 ; + }/* * For every charge from the cgroup, increment reference count */
mm/mmzone.c +1 -1
@@ -69,6 +69,6 @@ struct zoneref *next_zones_zonelist(struct zoneref *z, (z->zone && !zref_in_nodemask(z, nodes))) z++; - *zone =zonelist_zone (z++); + *zone =zonelist_zone (z);return z; }
mm/rmap.c +9 -5
@@ -223,10 +223,14 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma)/* * Check that @page is mapped at @address into @mm. * +* If @sync is false, page_check_address may perform a racy check to avoid +* the page table lock when the pte is not present (helpful when reclaiming +* highly shared pages). +* * On success returns with pte mapped and locked. */ pte_t *page_check_address (struct page *page,struct mm_struct *mm, -unsigned long address,spinlock_t **ptlp) +unsigned long address,spinlock_t **ptlp,int sync) {pgd_t *pgd;pud_t *pud;
@@ -248,7 +252,7 @@ pte_t *page_check_address(struct page *page, struct mm_struct *mm, pte =pte_offset_map (pmd, address);/* Make a quick check before getting the lock */ -if (!pte_present (*pte)) { +if (!sync && !pte_present (*pte)) {pte_unmap (pte);return NULL ; }
@@ -280,7 +284,7 @@ static int page_referenced_one(struct page *page,if (address == -EFAULT ) goto out; - pte =page_check_address (page, mm, address, &ptl); + pte =page_check_address (page, mm, address, &ptl,0 );if (!pte) goto out;
@@ -449,7 +453,7 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma)if (address == -EFAULT ) goto out; - pte =page_check_address (page, mm, address, &ptl); + pte =page_check_address (page, mm, address, &ptl,1 );if (!pte) goto out;
@@ -707,7 +711,7 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma,if (address == -EFAULT ) goto out; - pte =page_check_address (page, mm, address, &ptl); + pte =page_check_address (page, mm, address, &ptl,0 );if (!pte) goto out;
net/ipv4/udp.c +33 -26
97 lines not on this page · raw message
net/ipv6/ip6_output.c +32 -32
71 lines not on this page · raw message
net/ipv6/route.c +2 -0
@@ -2718,6 +2718,8 @@ int __init ip6_route_init(void)if (ret) goto out_kmem_cache; + ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep; +/* Registering of the loopback is done before this portion of code, * the loopback reference in rt6_info will not be taken, do it * manually for init_net */
net/key/af_key.c +19 -11
@@ -73,22 +73,18 @@ static int pfkey_can_dump(struct sock *sk)return 0 ; } -static int pfkey_do_dump (struct pfkey_sock *pfk) +static void pfkey_terminate_dump (struct pfkey_sock *pfk) { -int rc; - - rc = pfk->dump.dump (pfk); -if (rc == -ENOBUFS ) -return 0 ; - - pfk->dump.done (pfk); - pfk->dump.dump =NULL ; - pfk->dump.done =NULL ; -return rc; +if (pfk->dump.dump) { + pfk->dump.done (pfk); + pfk->dump.dump =NULL ; + pfk->dump.done =NULL ; + } }static void pfkey_sock_destruct (struct sock *sk) { +pfkey_terminate_dump (pfkey_sk (sk));skb_queue_purge (&sk->sk_receive_queue);if (!sock_flag (sk,SOCK_DEAD )) {
@@ -310,6 +306,18 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation,return err; } +static int pfkey_do_dump (struct pfkey_sock *pfk) +{ +int rc; + + rc = pfk->dump.dump (pfk); +if (rc == -ENOBUFS ) +return 0 ; + +pfkey_terminate_dump (pfk); +return rc; +} +static inline void pfkey_hdr_dup (struct sadb_msg *new,struct sadb_msg *orig) { *new = *orig;
net/sctp/associola.c +5 -4
@@ -597,11 +597,12 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,/* Check to see if this is a duplicate. */ peer =sctp_assoc_lookup_paddr (asoc, addr);if (peer) { +/* An UNKNOWN state is only set on transports added by +* user in sctp_connectx() call. Such transports should be +* considered CONFIRMED per RFC 4960, Section 5.4. +*/ if (peer->state ==SCTP_UNKNOWN ) { -if (peer_state ==SCTP_ACTIVE ) - peer->state =SCTP_ACTIVE ; -if (peer_state ==SCTP_UNCONFIRMED ) - peer->state =SCTP_UNCONFIRMED ; + peer->state =SCTP_ACTIVE ; }return peer; }
net/sctp/sm_make_chunk.c +9 -6
@@ -1886,11 +1886,13 @@ static void sctp_process_ext_param(struct sctp_association *asoc,/* if the peer reports AUTH, assume that he * supports AUTH. */ - asoc->peer.auth_capable =1 ; +if (sctp_auth_enable) + asoc->peer.auth_capable =1 ;break ;case SCTP_CID_ASCONF :case SCTP_CID_ASCONF_ACK : - asoc->peer.asconf_capable =1 ; +if (sctp_addip_enable) + asoc->peer.asconf_capable =1 ;break ;default :break ;
@@ -2319,12 +2321,10 @@ clean_up:/* Release the transport structures. */ list_for_each_safe (pos, temp, &asoc->peer.transport_addr_list) { transport = list_entry(pos, struct sctp_transport, transports); -list_del_init (pos); -sctp_transport_free (transport); +if (transport->state !=SCTP_ACTIVE ) +sctp_assoc_rm_peer (asoc, transport); } - asoc->peer.transport_count =0 ; - nomem:return 0 ; }
@@ -2455,6 +2455,9 @@ static int sctp_process_param(struct sctp_association *asoc,break ;case SCTP_PARAM_SET_PRIMARY : +if (!sctp_addip_enable) + goto fall_through; + addr_param = param.v +sizeof (sctp_addip_param_t); af =sctp_get_af_specific (param_type2af (param.p->type));
net/xfrm/xfrm_output.c +8 -4
@@ -27,10 +27,14 @@ static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) -skb_headroom (skb);int ntail = dst->dev->needed_tailroom -skb_tailroom (skb); -if (nhead >0 || ntail >0 ) -return pskb_expand_head (skb, nhead, ntail,GFP_ATOMIC ); - -return 0 ; +if (nhead <=0 ) { +if (ntail <=0 ) +return 0 ; + nhead =0 ; + }else if (ntail <0 ) + ntail =0 ; + +return pskb_expand_head (skb, nhead, ntail,GFP_ATOMIC ); }static int xfrm_output_one (struct sk_buff *skb,int err)
sound/core/pcm.c +2 -2
@@ -781,7 +781,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,return -ENODEV ; card = pcm->card; -down_read (&card->controls_rwsem); +read_lock (&card->ctl_files_rwlock);list_for_each_entry (kctl, &card->ctl_files, list) {if (kctl->pid == current->pid) { prefer_subdevice = kctl->prefer_pcm_subdevice;
@@ -789,7 +789,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,break ; } } -up_read (&card->controls_rwsem); +read_unlock (&card->ctl_files_rwlock);switch (stream) {case SNDRV_PCM_STREAM_PLAYBACK :
sound/core/pcm_native.c +3 -10
@@ -1545,16 +1545,10 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream) card = substream->pcm->card;if (runtime->status->state ==SNDRV_PCM_STATE_OPEN || - runtime->status->state ==SNDRV_PCM_STATE_DISCONNECTED ) + runtime->status->state ==SNDRV_PCM_STATE_DISCONNECTED || + runtime->status->state ==SNDRV_PCM_STATE_SUSPENDED )return -EBADFD ; -snd_power_lock (card); -if (runtime->status->state ==SNDRV_PCM_STATE_SUSPENDED ) { - result =snd_power_wait (card,SNDRV_CTL_POWER_D0 ); -if (result <0 ) - goto _unlock; - } -snd_pcm_stream_lock_irq (substream);/* resume pause */ if (runtime->status->state ==SNDRV_PCM_STATE_PAUSED )
@@ -1563,8 +1557,7 @@ static int snd_pcm_drop(struct snd_pcm_substream *substream)snd_pcm_stop (substream,SNDRV_PCM_STATE_SETUP );/* runtime->control->appl_ptr = runtime->status->hw_ptr; */ snd_pcm_stream_unlock_irq (substream); - _unlock: -snd_power_unlock (card); +return result; }
sound/core/rawmidi.c +2 -2
@@ -418,7 +418,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)mutex_lock (&rmidi->open_mutex);while (1 ) { subdevice =-1 ; -down_read (&card->controls_rwsem); +read_lock (&card->ctl_files_rwlock);list_for_each_entry (kctl, &card->ctl_files, list) {if (kctl->pid == current->pid) { subdevice = kctl->prefer_rawmidi_subdevice;
@@ -426,7 +426,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)break ; } } -up_read (&card->controls_rwsem); +read_unlock (&card->ctl_files_rwlock); err =snd_rawmidi_kernel_open (rmidi->card, rmidi->device, subdevice, fflags, rawmidi_file);if (err >=0 )
sound/pci/hda/patch_sigmatel.c +1 -1
@@ -1667,8 +1667,8 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = {/* Dell 3 stack systems with verb table in BIOS */ SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x01f3 ,"Dell Inspiron 1420" ,STAC_DELL_BIOS ),SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x0227 ,"Dell Vostro 1400 " ,STAC_DELL_BIOS ), -SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x022f ,"Dell " ,STAC_DELL_BIOS ),SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x022e ,"Dell " ,STAC_DELL_BIOS ), +SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x022f ,"Dell Inspiron 1525" ,STAC_DELL_3ST ),SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x0242 ,"Dell " ,STAC_DELL_BIOS ),SND_PCI_QUIRK (PCI_VENDOR_ID_DELL ,0x0243 ,"Dell " ,STAC_DELL_BIOS ), SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS),
sound/pci/oxygen/hifier.c +4 -0
@@ -17,6 +17,7 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <linux/delay.h> #include <linux/pci.h> #include <sound/control.h> #include <sound/core.h>
@@ -95,6 +96,9 @@ static void set_ak4396_params(struct oxygen *chip,else value |=AK4396_DFS_QUAD ; data->ak4396_ctl2 = value; + +msleep (1 );/* wait for the new MCLK to become stable */ +ak4396_write (chip,AK4396_CONTROL_1 ,AK4396_DIF_24_MSB );ak4396_write (chip,AK4396_CONTROL_2 , value);ak4396_write (chip,AK4396_CONTROL_1 ,AK4396_DIF_24_MSB |AK4396_RSTN );
sound/pci/oxygen/oxygen.c +4 -0
@@ -28,6 +28,7 @@* GPIO 1 -> DFS1 of AK5385 */ +#include <linux/delay.h> #include <linux/mutex.h> #include <linux/pci.h> #include <sound/ac97_codec.h>
@@ -173,6 +174,9 @@ static void set_ak4396_params(struct oxygen *chip,else value |=AK4396_DFS_QUAD ; data->ak4396_ctl2 = value; + +msleep (1 );/* wait for the new MCLK to become stable */ +for (i =0 ; i <4 ; ++i) {ak4396_write (chip, i,AK4396_CONTROL_1 ,AK4396_DIF_24_MSB );
sound/ppc/awacs.c +38 -12
119 lines not on this page · raw message