4775 lines
149 KiB
Groff
4775 lines
149 KiB
Groff
diff --git a/Makefile b/Makefile
|
|
index d26f3f5..d165e80 100644
|
|
diff --git a/arch/i386/kernel/cpu/mtrr/if.c b/arch/i386/kernel/cpu/mtrr/if.c
|
|
index 5ae1705..590d99e 100644
|
|
--- a/arch/i386/kernel/cpu/mtrr/if.c
|
|
+++ b/arch/i386/kernel/cpu/mtrr/if.c
|
|
@@ -158,8 +158,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
|
|
struct mtrr_sentry sentry;
|
|
struct mtrr_gentry gentry;
|
|
void __user *arg = (void __user *) __arg;
|
|
+ unsigned int compat_cmd = cmd;
|
|
|
|
- switch (cmd) {
|
|
+ switch (compat_cmd) {
|
|
case MTRRIOC_ADD_ENTRY:
|
|
case MTRRIOC_SET_ENTRY:
|
|
case MTRRIOC_DEL_ENTRY:
|
|
@@ -177,14 +178,20 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
|
|
return -EFAULT;
|
|
break;
|
|
#ifdef CONFIG_COMPAT
|
|
- case MTRRIOC32_ADD_ENTRY:
|
|
- case MTRRIOC32_SET_ENTRY:
|
|
- case MTRRIOC32_DEL_ENTRY:
|
|
- case MTRRIOC32_KILL_ENTRY:
|
|
- case MTRRIOC32_ADD_PAGE_ENTRY:
|
|
- case MTRRIOC32_SET_PAGE_ENTRY:
|
|
- case MTRRIOC32_DEL_PAGE_ENTRY:
|
|
- case MTRRIOC32_KILL_PAGE_ENTRY: {
|
|
+#define MTRR_COMPAT_OP(op, type)\
|
|
+ case MTRRIOC32_##op: \
|
|
+ cmd = MTRRIOC_##op; \
|
|
+ goto compat_get_##type
|
|
+
|
|
+ MTRR_COMPAT_OP(ADD_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(SET_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(DEL_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(KILL_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(ADD_PAGE_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(SET_PAGE_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(DEL_PAGE_ENTRY, sentry);
|
|
+ MTRR_COMPAT_OP(KILL_PAGE_ENTRY, sentry);
|
|
+compat_get_sentry: {
|
|
struct mtrr_sentry32 __user *s32 = (struct mtrr_sentry32 __user *)__arg;
|
|
err = get_user(sentry.base, &s32->base);
|
|
err |= get_user(sentry.size, &s32->size);
|
|
@@ -193,8 +200,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
|
|
return err;
|
|
break;
|
|
}
|
|
- case MTRRIOC32_GET_ENTRY:
|
|
- case MTRRIOC32_GET_PAGE_ENTRY: {
|
|
+ MTRR_COMPAT_OP(GET_ENTRY, gentry);
|
|
+ MTRR_COMPAT_OP(GET_PAGE_ENTRY, gentry);
|
|
+compat_get_gentry: {
|
|
struct mtrr_gentry32 __user *g32 = (struct mtrr_gentry32 __user *)__arg;
|
|
err = get_user(gentry.regnum, &g32->regnum);
|
|
err |= get_user(gentry.base, &g32->base);
|
|
@@ -204,6 +212,7 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
|
|
return err;
|
|
break;
|
|
}
|
|
+#undef MTRR_COMPAT_OP
|
|
#endif
|
|
}
|
|
|
|
@@ -287,7 +296,7 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
|
|
if (err)
|
|
return err;
|
|
|
|
- switch(cmd) {
|
|
+ switch(compat_cmd) {
|
|
case MTRRIOC_GET_ENTRY:
|
|
case MTRRIOC_GET_PAGE_ENTRY:
|
|
if (copy_to_user(arg, &gentry, sizeof gentry))
|
|
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
|
|
index 65d7620..f654505 100644
|
|
--- a/arch/i386/kernel/signal.c
|
|
+++ b/arch/i386/kernel/signal.c
|
|
@@ -21,6 +21,7 @@
|
|
#include <linux/suspend.h>
|
|
#include <linux/ptrace.h>
|
|
#include <linux/elf.h>
|
|
+#include <linux/binfmts.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/ucontext.h>
|
|
#include <asm/uaccess.h>
|
|
@@ -349,7 +350,10 @@ static int setup_frame(int sig, struct k_sigaction *ka,
|
|
goto give_sigsegv;
|
|
}
|
|
|
|
- restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
|
|
+ if (current->binfmt->hasvdso)
|
|
+ restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
|
|
+ else
|
|
+ restorer = (void *)&frame->retcode;
|
|
if (ka->sa.sa_flags & SA_RESTORER)
|
|
restorer = ka->sa.sa_restorer;
|
|
|
|
diff --git a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c
|
|
index 5da7442..666f70d 100644
|
|
--- a/arch/i386/kernel/sysenter.c
|
|
+++ b/arch/i386/kernel/sysenter.c
|
|
@@ -77,7 +77,7 @@ int __init sysenter_setup(void)
|
|
syscall_page = (void *)get_zeroed_page(GFP_ATOMIC);
|
|
|
|
#ifdef CONFIG_COMPAT_VDSO
|
|
- __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
|
|
+ __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY_EXEC);
|
|
printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
|
|
#endif
|
|
|
|
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
|
|
index fcacfe2..c085199 100644
|
|
--- a/arch/ia64/Kconfig
|
|
+++ b/arch/ia64/Kconfig
|
|
@@ -11,6 +11,7 @@ menu "Processor type and features"
|
|
|
|
config IA64
|
|
bool
|
|
+ select ATA_NONSTANDARD if ATA
|
|
default y
|
|
help
|
|
The Itanium Processor Family is Intel's 64-bit successor to
|
|
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c
|
|
index bc2f64d..2018e62 100644
|
|
--- a/arch/ia64/kernel/crash.c
|
|
+++ b/arch/ia64/kernel/crash.c
|
|
@@ -79,6 +79,7 @@ crash_save_this_cpu()
|
|
final_note(buf);
|
|
}
|
|
|
|
+#ifdef CONFIG_SMP
|
|
static int
|
|
kdump_wait_cpu_freeze(void)
|
|
{
|
|
@@ -91,6 +92,7 @@ kdump_wait_cpu_freeze(void)
|
|
}
|
|
return 1;
|
|
}
|
|
+#endif
|
|
|
|
void
|
|
machine_crash_shutdown(struct pt_regs *pt)
|
|
@@ -132,11 +134,12 @@ kdump_cpu_freeze(struct unw_frame_info *info, void *arg)
|
|
atomic_inc(&kdump_cpu_freezed);
|
|
kdump_status[cpuid] = 1;
|
|
mb();
|
|
- if (cpuid == 0) {
|
|
- for (;;)
|
|
- cpu_relax();
|
|
- } else
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
+ if (cpuid != 0)
|
|
ia64_jump_to_sal(&sal_boot_rendez_state[cpuid]);
|
|
+#endif
|
|
+ for (;;)
|
|
+ cpu_relax();
|
|
}
|
|
|
|
static int
|
|
diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c
|
|
index e2ccc9f..7141795 100644
|
|
--- a/arch/ia64/kernel/machine_kexec.c
|
|
+++ b/arch/ia64/kernel/machine_kexec.c
|
|
@@ -70,12 +70,14 @@ void machine_kexec_cleanup(struct kimage *image)
|
|
|
|
void machine_shutdown(void)
|
|
{
|
|
+#ifdef CONFIG_HOTPLUG_CPU
|
|
int cpu;
|
|
|
|
for_each_online_cpu(cpu) {
|
|
if (cpu != smp_processor_id())
|
|
cpu_down(cpu);
|
|
}
|
|
+#endif
|
|
kexec_disable_iosapic();
|
|
}
|
|
|
|
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c
|
|
index 44cbe0c..a689e29 100644
|
|
--- a/arch/m32r/kernel/process.c
|
|
+++ b/arch/m32r/kernel/process.c
|
|
@@ -174,7 +174,7 @@ void show_regs(struct pt_regs * regs)
|
|
regs->acc1h, regs->acc1l);
|
|
#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
|
|
printk("ACCH[%08lx]:ACCL[%08lx]\n", \
|
|
- regs->acch, regs->accl);
|
|
+ regs->acc0h, regs->acc0l);
|
|
#else
|
|
#error unknown isa configuration
|
|
#endif
|
|
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c
|
|
index 092ea86..4b15605 100644
|
|
--- a/arch/m32r/kernel/signal.c
|
|
+++ b/arch/m32r/kernel/signal.c
|
|
@@ -109,19 +109,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
|
|
COPY(r10);
|
|
COPY(r11);
|
|
COPY(r12);
|
|
-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
|
|
COPY(acc0h);
|
|
COPY(acc0l);
|
|
- COPY(acc1h);
|
|
- COPY(acc1l);
|
|
-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
|
|
- COPY(acch);
|
|
- COPY(accl);
|
|
- COPY(dummy_acc1h);
|
|
- COPY(dummy_acc1l);
|
|
-#else
|
|
-#error unknown isa configuration
|
|
-#endif
|
|
+ COPY(acc1h); /* ISA_DSP_LEVEL2 only */
|
|
+ COPY(acc1l); /* ISA_DSP_LEVEL2 only */
|
|
COPY(psw);
|
|
COPY(bpc);
|
|
COPY(bbpsw);
|
|
@@ -196,19 +187,10 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
|
COPY(r10);
|
|
COPY(r11);
|
|
COPY(r12);
|
|
-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
|
|
COPY(acc0h);
|
|
COPY(acc0l);
|
|
- COPY(acc1h);
|
|
- COPY(acc1l);
|
|
-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
|
|
- COPY(acch);
|
|
- COPY(accl);
|
|
- COPY(dummy_acc1h);
|
|
- COPY(dummy_acc1l);
|
|
-#else
|
|
-#error unknown isa configuration
|
|
-#endif
|
|
+ COPY(acc1h); /* ISA_DSP_LEVEL2 only */
|
|
+ COPY(acc1l); /* ISA_DSP_LEVEL2 only */
|
|
COPY(psw);
|
|
COPY(bpc);
|
|
COPY(bbpsw);
|
|
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
|
|
index 71b1fe5..97cedcd 100644
|
|
--- a/arch/powerpc/kernel/head_64.S
|
|
+++ b/arch/powerpc/kernel/head_64.S
|
|
@@ -613,7 +613,7 @@ system_call_pSeries:
|
|
/*** pSeries interrupt support ***/
|
|
|
|
/* moved from 0xf00 */
|
|
- MASKABLE_EXCEPTION_PSERIES(., performance_monitor)
|
|
+ STD_EXCEPTION_PSERIES(., performance_monitor)
|
|
|
|
/*
|
|
* An interrupt came in while soft-disabled; clear EE in SRR1,
|
|
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c
|
|
index c8b65ca..6d9857c 100644
|
|
--- a/arch/ppc/kernel/ppc_ksyms.c
|
|
+++ b/arch/ppc/kernel/ppc_ksyms.c
|
|
@@ -270,7 +270,7 @@ EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */
|
|
extern long *intercept_table;
|
|
EXPORT_SYMBOL(intercept_table);
|
|
#endif /* CONFIG_PPC_STD_MMU */
|
|
-#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
|
|
+#ifdef CONFIG_PPC_DCR_NATIVE
|
|
EXPORT_SYMBOL(__mtdcr);
|
|
EXPORT_SYMBOL(__mfdcr);
|
|
#endif
|
|
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c
|
|
index b0f3e00..ad74e5e 100644
|
|
--- a/arch/sparc64/kernel/of_device.c
|
|
+++ b/arch/sparc64/kernel/of_device.c
|
|
@@ -708,7 +708,7 @@ static unsigned int __init pci_irq_swizzle(struct device_node *dp,
|
|
unsigned int irq)
|
|
{
|
|
struct linux_prom_pci_registers *regs;
|
|
- unsigned int devfn, slot, ret;
|
|
+ unsigned int bus, devfn, slot, ret;
|
|
|
|
if (irq < 1 || irq > 4)
|
|
return irq;
|
|
@@ -717,10 +717,46 @@ static unsigned int __init pci_irq_swizzle(struct device_node *dp,
|
|
if (!regs)
|
|
return irq;
|
|
|
|
+ bus = (regs->phys_hi >> 16) & 0xff;
|
|
devfn = (regs->phys_hi >> 8) & 0xff;
|
|
slot = (devfn >> 3) & 0x1f;
|
|
|
|
- ret = ((irq - 1 + (slot & 3)) & 3) + 1;
|
|
+ if (pp->irq_trans) {
|
|
+ /* Derived from Table 8-3, U2P User's Manual. This branch
|
|
+ * is handling a PCI controller that lacks a proper set of
|
|
+ * interrupt-map and interrupt-map-mask properties. The
|
|
+ * Ultra-E450 is one example.
|
|
+ *
|
|
+ * The bit layout is BSSLL, where:
|
|
+ * B: 0 on bus A, 1 on bus B
|
|
+ * D: 2-bit slot number, derived from PCI device number as
|
|
+ * (dev - 1) for bus A, or (dev - 2) for bus B
|
|
+ * L: 2-bit line number
|
|
+ *
|
|
+ * Actually, more "portable" way to calculate the funky
|
|
+ * slot number is to subtract pbm->pci_first_slot from the
|
|
+ * device number, and that's exactly what the pre-OF
|
|
+ * sparc64 code did, but we're building this stuff generically
|
|
+ * using the OBP tree, not in the PCI controller layer.
|
|
+ */
|
|
+ if (bus & 0x80) {
|
|
+ /* PBM-A */
|
|
+ bus = 0x00;
|
|
+ slot = (slot - 1) << 2;
|
|
+ } else {
|
|
+ /* PBM-B */
|
|
+ bus = 0x10;
|
|
+ slot = (slot - 2) << 2;
|
|
+ }
|
|
+ irq -= 1;
|
|
+
|
|
+ ret = (bus | slot | irq);
|
|
+ } else {
|
|
+ /* Going through a PCI-PCI bridge that lacks a set of
|
|
+ * interrupt-map and interrupt-map-mask properties.
|
|
+ */
|
|
+ ret = ((irq - 1 + (slot & 3)) & 3) + 1;
|
|
+ }
|
|
|
|
return ret;
|
|
}
|
|
diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c
|
|
index 925a652..b2e1fd8 100644
|
|
--- a/arch/um/os-Linux/sigio.c
|
|
+++ b/arch/um/os-Linux/sigio.c
|
|
@@ -97,20 +97,22 @@ static int write_sigio_thread(void *unused)
|
|
|
|
static int need_poll(struct pollfds *polls, int n)
|
|
{
|
|
- if(n <= polls->size){
|
|
- polls->used = n;
|
|
+ struct pollfd *new;
|
|
+
|
|
+ if(n <= polls->size)
|
|
return 0;
|
|
- }
|
|
- kfree(polls->poll);
|
|
- polls->poll = um_kmalloc_atomic(n * sizeof(struct pollfd));
|
|
- if(polls->poll == NULL){
|
|
+
|
|
+ new = um_kmalloc_atomic(n * sizeof(struct pollfd));
|
|
+ if(new == NULL){
|
|
printk("need_poll : failed to allocate new pollfds\n");
|
|
- polls->size = 0;
|
|
- polls->used = 0;
|
|
return -ENOMEM;
|
|
}
|
|
+
|
|
+ memcpy(new, polls->poll, polls->used * sizeof(struct pollfd));
|
|
+ kfree(polls->poll);
|
|
+
|
|
+ polls->poll = new;
|
|
polls->size = n;
|
|
- polls->used = n;
|
|
return 0;
|
|
}
|
|
|
|
@@ -171,15 +173,15 @@ int add_sigio_fd(int fd)
|
|
goto out;
|
|
}
|
|
|
|
- n = current_poll.used + 1;
|
|
- err = need_poll(&next_poll, n);
|
|
+ n = current_poll.used;
|
|
+ err = need_poll(&next_poll, n + 1);
|
|
if(err)
|
|
goto out;
|
|
|
|
- for(i = 0; i < current_poll.used; i++)
|
|
- next_poll.poll[i] = current_poll.poll[i];
|
|
-
|
|
- next_poll.poll[n - 1] = *p;
|
|
+ memcpy(next_poll.poll, current_poll.poll,
|
|
+ current_poll.used * sizeof(struct pollfd));
|
|
+ next_poll.poll[n] = *p;
|
|
+ next_poll.used = n + 1;
|
|
update_thread();
|
|
out:
|
|
sigio_unlock();
|
|
@@ -214,6 +216,7 @@ int ignore_sigio_fd(int fd)
|
|
if(p->fd != fd)
|
|
next_poll.poll[n++] = *p;
|
|
}
|
|
+ next_poll.used = current_poll.used - 1;
|
|
|
|
update_thread();
|
|
out:
|
|
@@ -331,10 +334,9 @@ void maybe_sigio_broken(int fd, int read)
|
|
|
|
sigio_lock();
|
|
err = need_poll(&all_sigio_fds, all_sigio_fds.used + 1);
|
|
- if(err){
|
|
- printk("maybe_sigio_broken - failed to add pollfd\n");
|
|
+ if(err)
|
|
goto out;
|
|
- }
|
|
+
|
|
all_sigio_fds.poll[all_sigio_fds.used++] =
|
|
((struct pollfd) { .fd = fd,
|
|
.events = read ? POLLIN : POLLOUT,
|
|
diff --git a/arch/x86_64/ia32/ia32_signal.c b/arch/x86_64/ia32/ia32_signal.c
|
|
index ff499ef..c7beadf 100644
|
|
--- a/arch/x86_64/ia32/ia32_signal.c
|
|
+++ b/arch/x86_64/ia32/ia32_signal.c
|
|
@@ -21,6 +21,7 @@
|
|
#include <linux/stddef.h>
|
|
#include <linux/personality.h>
|
|
#include <linux/compat.h>
|
|
+#include <linux/binfmts.h>
|
|
#include <asm/ucontext.h>
|
|
#include <asm/uaccess.h>
|
|
#include <asm/i387.h>
|
|
@@ -449,7 +450,11 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
|
|
|
|
/* Return stub is in 32bit vsyscall page */
|
|
{
|
|
- void __user *restorer = VSYSCALL32_SIGRETURN;
|
|
+ void __user *restorer;
|
|
+ if (current->binfmt->hasvdso)
|
|
+ restorer = VSYSCALL32_SIGRETURN;
|
|
+ else
|
|
+ restorer = (void *)&frame->retcode;
|
|
if (ka->sa.sa_flags & SA_RESTORER)
|
|
restorer = ka->sa.sa_restorer;
|
|
err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
|
|
diff --git a/arch/x86_64/ia32/ptrace32.c b/arch/x86_64/ia32/ptrace32.c
|
|
index 04566fe..4de3a54 100644
|
|
--- a/arch/x86_64/ia32/ptrace32.c
|
|
+++ b/arch/x86_64/ia32/ptrace32.c
|
|
@@ -243,6 +243,7 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data)
|
|
case PTRACE_SINGLESTEP:
|
|
case PTRACE_DETACH:
|
|
case PTRACE_SYSCALL:
|
|
+ case PTRACE_OLDSETOPTIONS:
|
|
case PTRACE_SETOPTIONS:
|
|
case PTRACE_SET_THREAD_AREA:
|
|
case PTRACE_GET_THREAD_AREA:
|
|
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c
|
|
index 0c06af6..3bc30d2 100644
|
|
--- a/arch/x86_64/kernel/irq.c
|
|
+++ b/arch/x86_64/kernel/irq.c
|
|
@@ -18,6 +18,7 @@
|
|
#include <asm/uaccess.h>
|
|
#include <asm/io_apic.h>
|
|
#include <asm/idle.h>
|
|
+#include <asm/smp.h>
|
|
|
|
atomic_t irq_err_count;
|
|
|
|
@@ -120,9 +121,14 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
|
|
|
|
if (likely(irq < NR_IRQS))
|
|
generic_handle_irq(irq);
|
|
- else if (printk_ratelimit())
|
|
- printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n",
|
|
- __func__, smp_processor_id(), vector);
|
|
+ else {
|
|
+ if (!disable_apic)
|
|
+ ack_APIC_irq();
|
|
+
|
|
+ if (printk_ratelimit())
|
|
+ printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n",
|
|
+ __func__, smp_processor_id(), vector);
|
|
+ }
|
|
|
|
irq_exit();
|
|
|
|
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
|
|
index fb67897..38c293b 100644
|
|
--- a/block/ll_rw_blk.c
|
|
+++ b/block/ll_rw_blk.c
|
|
@@ -1264,7 +1264,7 @@ new_hw_segment:
|
|
bio->bi_hw_segments = nr_hw_segs;
|
|
bio->bi_flags |= (1 << BIO_SEG_VALID);
|
|
}
|
|
-
|
|
+EXPORT_SYMBOL(blk_recount_segments);
|
|
|
|
static int blk_phys_contig_segment(request_queue_t *q, struct bio *bio,
|
|
struct bio *nxt)
|
|
diff --git a/drivers/Makefile b/drivers/Makefile
|
|
index 0dd96d1..f28dcb4 100644
|
|
--- a/drivers/Makefile
|
|
+++ b/drivers/Makefile
|
|
@@ -30,7 +30,7 @@ obj-$(CONFIG_PARPORT) += parport/
|
|
obj-y += base/ block/ misc/ mfd/ net/ media/
|
|
obj-$(CONFIG_NUBUS) += nubus/
|
|
obj-$(CONFIG_ATM) += atm/
|
|
-obj-$(CONFIG_PPC_PMAC) += macintosh/
|
|
+obj-y += macintosh/
|
|
obj-$(CONFIG_IDE) += ide/
|
|
obj-$(CONFIG_FC4) += fc4/
|
|
obj-$(CONFIG_SCSI) += scsi/
|
|
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
|
index 48616c6..dc2c082 100644
|
|
--- a/drivers/ata/ahci.c
|
|
+++ b/drivers/ata/ahci.c
|
|
@@ -225,10 +225,12 @@ static void ahci_thaw(struct ata_port *ap);
|
|
static void ahci_error_handler(struct ata_port *ap);
|
|
static void ahci_vt8251_error_handler(struct ata_port *ap);
|
|
static void ahci_post_internal_cmd(struct ata_queued_cmd *qc);
|
|
+#ifdef CONFIG_PM
|
|
static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
|
|
static int ahci_port_resume(struct ata_port *ap);
|
|
static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
|
|
static int ahci_pci_device_resume(struct pci_dev *pdev);
|
|
+#endif
|
|
static void ahci_remove_one (struct pci_dev *pdev);
|
|
|
|
static struct scsi_host_template ahci_sht = {
|
|
@@ -248,8 +250,10 @@ static struct scsi_host_template ahci_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_scsi_device_suspend,
|
|
.resume = ata_scsi_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations ahci_ops = {
|
|
@@ -276,8 +280,10 @@ static const struct ata_port_operations ahci_ops = {
|
|
.error_handler = ahci_error_handler,
|
|
.post_internal_cmd = ahci_post_internal_cmd,
|
|
|
|
+#ifdef CONFIG_PM
|
|
.port_suspend = ahci_port_suspend,
|
|
.port_resume = ahci_port_resume,
|
|
+#endif
|
|
|
|
.port_start = ahci_port_start,
|
|
.port_stop = ahci_port_stop,
|
|
@@ -307,8 +313,10 @@ static const struct ata_port_operations ahci_vt8251_ops = {
|
|
.error_handler = ahci_vt8251_error_handler,
|
|
.post_internal_cmd = ahci_post_internal_cmd,
|
|
|
|
+#ifdef CONFIG_PM
|
|
.port_suspend = ahci_port_suspend,
|
|
.port_resume = ahci_port_resume,
|
|
+#endif
|
|
|
|
.port_start = ahci_port_start,
|
|
.port_stop = ahci_port_stop,
|
|
@@ -441,8 +449,10 @@ static struct pci_driver ahci_pci_driver = {
|
|
.name = DRV_NAME,
|
|
.id_table = ahci_pci_tbl,
|
|
.probe = ahci_init_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ahci_pci_device_suspend,
|
|
.resume = ahci_pci_device_resume,
|
|
+#endif
|
|
.remove = ahci_remove_one,
|
|
};
|
|
|
|
@@ -587,6 +597,7 @@ static void ahci_power_up(void __iomem *port_mmio, u32 cap)
|
|
writel(cmd | PORT_CMD_ICC_ACTIVE, port_mmio + PORT_CMD);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static void ahci_power_down(void __iomem *port_mmio, u32 cap)
|
|
{
|
|
u32 cmd, scontrol;
|
|
@@ -604,6 +615,7 @@ static void ahci_power_down(void __iomem *port_mmio, u32 cap)
|
|
cmd &= ~PORT_CMD_SPIN_UP;
|
|
writel(cmd, port_mmio + PORT_CMD);
|
|
}
|
|
+#endif
|
|
|
|
static void ahci_init_port(void __iomem *port_mmio, u32 cap,
|
|
dma_addr_t cmd_slot_dma, dma_addr_t rx_fis_dma)
|
|
@@ -1336,6 +1348,7 @@ static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
|
|
}
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
|
|
{
|
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
|
@@ -1412,6 +1425,7 @@ static int ahci_pci_device_resume(struct pci_dev *pdev)
|
|
|
|
return 0;
|
|
}
|
|
+#endif
|
|
|
|
static int ahci_port_start(struct ata_port *ap)
|
|
{
|
|
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
|
|
index 24af560..91ccc20 100644
|
|
--- a/drivers/ata/ata_generic.c
|
|
+++ b/drivers/ata/ata_generic.c
|
|
@@ -119,8 +119,10 @@ static struct scsi_host_template generic_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations generic_port_ops = {
|
|
@@ -230,8 +232,10 @@ static struct pci_driver ata_generic_pci_driver = {
|
|
.id_table = ata_generic,
|
|
.probe = ata_generic_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init ata_generic_init(void)
|
|
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
|
|
index 47701b2..57c0db3 100644
|
|
--- a/drivers/ata/ata_piix.c
|
|
+++ b/drivers/ata/ata_piix.c
|
|
@@ -255,8 +255,10 @@ static struct pci_driver piix_pci_driver = {
|
|
.id_table = piix_pci_tbl,
|
|
.probe = piix_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static struct scsi_host_template piix_sht = {
|
|
@@ -275,8 +277,10 @@ static struct scsi_host_template piix_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations piix_pata_ops = {
|
|
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
|
|
index c5d61d1..765c932 100644
|
|
--- a/drivers/ata/pata_ali.c
|
|
+++ b/drivers/ata/pata_ali.c
|
|
@@ -345,8 +345,10 @@ static struct scsi_host_template ali_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
/*
|
|
@@ -667,11 +669,13 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int ali_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
ali_init_chipset(pdev);
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id ali[] = {
|
|
{ PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5228), },
|
|
@@ -685,8 +689,10 @@ static struct pci_driver ali_pci_driver = {
|
|
.id_table = ali,
|
|
.probe = ali_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ali_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init ali_init(void)
|
|
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
|
|
index a6b3300..f7c493b 100644
|
|
--- a/drivers/ata/pata_amd.c
|
|
+++ b/drivers/ata/pata_amd.c
|
|
@@ -128,7 +128,7 @@ static void timing_setup(struct ata_port *ap, struct ata_device *adev, int offse
|
|
|
|
static int amd_pre_reset(struct ata_port *ap)
|
|
{
|
|
- static const u32 bitmask[2] = {0x03, 0xC0};
|
|
+ static const u32 bitmask[2] = {0x03, 0x0C};
|
|
static const struct pci_bits amd_enable_bits[] = {
|
|
{ 0x40, 1, 0x02, 0x02 },
|
|
{ 0x40, 1, 0x01, 0x01 }
|
|
@@ -247,7 +247,7 @@ static void amd133_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
*/
|
|
|
|
static int nv_pre_reset(struct ata_port *ap) {
|
|
- static const u8 bitmask[2] = {0x03, 0xC0};
|
|
+ static const u8 bitmask[2] = {0x03, 0x0C};
|
|
static const struct pci_bits nv_enable_bits[] = {
|
|
{ 0x50, 1, 0x02, 0x02 },
|
|
{ 0x50, 1, 0x01, 0x01 }
|
|
@@ -334,8 +334,10 @@ static struct scsi_host_template amd_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations amd33_port_ops = {
|
|
@@ -663,6 +665,7 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int amd_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
if (pdev->vendor == PCI_VENDOR_ID_AMD) {
|
|
@@ -679,6 +682,7 @@ static int amd_reinit_one(struct pci_dev *pdev)
|
|
}
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id amd[] = {
|
|
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_COBRA_7401), 0 },
|
|
@@ -708,8 +712,10 @@ static struct pci_driver amd_pci_driver = {
|
|
.id_table = amd,
|
|
.probe = amd_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = amd_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init amd_init(void)
|
|
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c
|
|
index 504e1db..b50ebb6 100644
|
|
--- a/drivers/ata/pata_atiixp.c
|
|
+++ b/drivers/ata/pata_atiixp.c
|
|
@@ -224,8 +224,10 @@ static struct scsi_host_template atiixp_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations atiixp_port_ops = {
|
|
@@ -290,8 +292,10 @@ static struct pci_driver atiixp_pci_driver = {
|
|
.id_table = atiixp,
|
|
.probe = atiixp_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_pci_device_resume,
|
|
.suspend = ata_pci_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static int __init atiixp_init(void)
|
|
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c
|
|
index 449162c..90ff580 100644
|
|
--- a/drivers/ata/pata_cmd64x.c
|
|
+++ b/drivers/ata/pata_cmd64x.c
|
|
@@ -285,8 +285,10 @@ static struct scsi_host_template cmd64x_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations cmd64x_port_ops = {
|
|
@@ -479,6 +481,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int cmd64x_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
u8 mrdmode;
|
|
@@ -492,6 +495,7 @@ static int cmd64x_reinit_one(struct pci_dev *pdev)
|
|
#endif
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id cmd64x[] = {
|
|
{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), 0 },
|
|
@@ -507,8 +511,10 @@ static struct pci_driver cmd64x_pci_driver = {
|
|
.id_table = cmd64x,
|
|
.probe = cmd64x_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = cmd64x_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init cmd64x_init(void)
|
|
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c
|
|
index 9f165a8..383975c 100644
|
|
--- a/drivers/ata/pata_cs5520.c
|
|
+++ b/drivers/ata/pata_cs5520.c
|
|
@@ -167,8 +167,10 @@ static struct scsi_host_template cs5520_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations cs5520_port_ops = {
|
|
@@ -298,6 +300,7 @@ static void __devexit cs5520_remove_one(struct pci_dev *pdev)
|
|
dev_set_drvdata(dev, NULL);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
/**
|
|
* cs5520_reinit_one - device resume
|
|
* @pdev: PCI device
|
|
@@ -314,6 +317,8 @@ static int cs5520_reinit_one(struct pci_dev *pdev)
|
|
pci_write_config_byte(pdev, 0x60, pcicfg | 0x40);
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
+
|
|
/* For now keep DMA off. We can set it for all but A rev CS5510 once the
|
|
core ATA code can handle it */
|
|
|
|
@@ -329,8 +334,10 @@ static struct pci_driver cs5520_pci_driver = {
|
|
.id_table = pata_cs5520,
|
|
.probe = cs5520_init_one,
|
|
.remove = cs5520_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = cs5520_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init cs5520_init(void)
|
|
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c
|
|
index b1ca207..fddef81 100644
|
|
--- a/drivers/ata/pata_cs5530.c
|
|
+++ b/drivers/ata/pata_cs5530.c
|
|
@@ -181,8 +181,10 @@ static struct scsi_host_template cs5530_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations cs5530_port_ops = {
|
|
@@ -369,6 +371,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int cs5530_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
/* If we fail on resume we are doomed */
|
|
@@ -376,6 +379,7 @@ static int cs5530_reinit_one(struct pci_dev *pdev)
|
|
BUG();
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id cs5530[] = {
|
|
{ PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_IDE), },
|
|
@@ -388,8 +392,10 @@ static struct pci_driver cs5530_pci_driver = {
|
|
.id_table = cs5530,
|
|
.probe = cs5530_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = cs5530_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init cs5530_init(void)
|
|
diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c
|
|
index e3efec4..80d0ed1 100644
|
|
--- a/drivers/ata/pata_cs5535.c
|
|
+++ b/drivers/ata/pata_cs5535.c
|
|
@@ -185,8 +185,10 @@ static struct scsi_host_template cs5535_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations cs5535_port_ops = {
|
|
@@ -270,8 +272,10 @@ static struct pci_driver cs5535_pci_driver = {
|
|
.id_table = cs5535,
|
|
.probe = cs5535_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init cs5535_init(void)
|
|
diff --git a/drivers/ata/pata_cypress.c b/drivers/ata/pata_cypress.c
|
|
index e2a9569..0da1715 100644
|
|
--- a/drivers/ata/pata_cypress.c
|
|
+++ b/drivers/ata/pata_cypress.c
|
|
@@ -136,8 +136,10 @@ static struct scsi_host_template cy82c693_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations cy82c693_port_ops = {
|
|
@@ -206,8 +208,10 @@ static struct pci_driver cy82c693_pci_driver = {
|
|
.id_table = cy82c693,
|
|
.probe = cy82c693_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init cy82c693_init(void)
|
|
diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c
|
|
index edf8a63..4d4575e 100644
|
|
--- a/drivers/ata/pata_efar.c
|
|
+++ b/drivers/ata/pata_efar.c
|
|
@@ -234,8 +234,10 @@ static struct scsi_host_template efar_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations efar_ops = {
|
|
@@ -317,8 +319,10 @@ static struct pci_driver efar_pci_driver = {
|
|
.id_table = efar_pci_tbl,
|
|
.probe = efar_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init efar_init(void)
|
|
diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
|
|
index 2663599..878696a 100644
|
|
--- a/drivers/ata/pata_hpt366.c
|
|
+++ b/drivers/ata/pata_hpt366.c
|
|
@@ -338,8 +338,10 @@ static struct scsi_host_template hpt36x_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
/*
|
|
@@ -467,12 +469,13 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(dev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int hpt36x_reinit_one(struct pci_dev *dev)
|
|
{
|
|
hpt36x_init_chipset(dev);
|
|
return ata_pci_device_resume(dev);
|
|
}
|
|
-
|
|
+#endif
|
|
|
|
static const struct pci_device_id hpt36x[] = {
|
|
{ PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), },
|
|
@@ -484,8 +487,10 @@ static struct pci_driver hpt36x_pci_driver = {
|
|
.id_table = hpt36x,
|
|
.probe = hpt36x_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = hpt36x_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init hpt36x_init(void)
|
|
diff --git a/drivers/ata/pata_hpt3x3.c b/drivers/ata/pata_hpt3x3.c
|
|
index 5f1d385..f99c77c 100644
|
|
--- a/drivers/ata/pata_hpt3x3.c
|
|
+++ b/drivers/ata/pata_hpt3x3.c
|
|
@@ -119,8 +119,10 @@ static struct scsi_host_template hpt3x3_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations hpt3x3_port_ops = {
|
|
@@ -206,11 +208,13 @@ static int hpt3x3_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(dev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int hpt3x3_reinit_one(struct pci_dev *dev)
|
|
{
|
|
hpt3x3_init_chipset(dev);
|
|
return ata_pci_device_resume(dev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id hpt3x3[] = {
|
|
{ PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT343), },
|
|
@@ -223,8 +227,10 @@ static struct pci_driver hpt3x3_pci_driver = {
|
|
.id_table = hpt3x3,
|
|
.probe = hpt3x3_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = hpt3x3_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init hpt3x3_init(void)
|
|
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
|
|
index e8afd48..7958177 100644
|
|
--- a/drivers/ata/pata_it821x.c
|
|
+++ b/drivers/ata/pata_it821x.c
|
|
@@ -676,8 +676,10 @@ static struct scsi_host_template it821x_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations it821x_smart_port_ops = {
|
|
@@ -810,6 +812,7 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int it821x_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
/* Resume - turn raid back off if need be */
|
|
@@ -817,6 +820,7 @@ static int it821x_reinit_one(struct pci_dev *pdev)
|
|
it821x_disable_raid(pdev);
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id it821x[] = {
|
|
{ PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), },
|
|
@@ -830,8 +834,10 @@ static struct pci_driver it821x_pci_driver = {
|
|
.id_table = it821x,
|
|
.probe = it821x_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = it821x_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init it821x_init(void)
|
|
diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c
|
|
index d50264a..9e4558a 100644
|
|
--- a/drivers/ata/pata_jmicron.c
|
|
+++ b/drivers/ata/pata_jmicron.c
|
|
@@ -137,6 +137,10 @@ static struct scsi_host_template jmicron_sht = {
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
/* Use standard CHS mapping rules */
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
+ .suspend = ata_scsi_device_suspend,
|
|
+ .resume = ata_scsi_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations jmicron_ops = {
|
|
@@ -218,6 +222,7 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int jmicron_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
u32 reg;
|
|
@@ -238,6 +243,7 @@ static int jmicron_reinit_one(struct pci_dev *pdev)
|
|
}
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id jmicron_pci_tbl[] = {
|
|
{ PCI_VDEVICE(JMICRON, PCI_DEVICE_ID_JMICRON_JMB361), 361},
|
|
@@ -254,8 +260,10 @@ static struct pci_driver jmicron_pci_driver = {
|
|
.id_table = jmicron_pci_tbl,
|
|
.probe = jmicron_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = jmicron_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init jmicron_init(void)
|
|
diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c
|
|
index 1c810ea..3d76e06 100644
|
|
--- a/drivers/ata/pata_marvell.c
|
|
+++ b/drivers/ata/pata_marvell.c
|
|
@@ -103,8 +103,10 @@ static struct scsi_host_template marvell_sht = {
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
/* Use standard CHS mapping rules */
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations marvell_ops = {
|
|
@@ -199,8 +201,10 @@ static struct pci_driver marvell_pci_driver = {
|
|
.id_table = marvell_pci_tbl,
|
|
.probe = marvell_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init marvell_init(void)
|
|
diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c
|
|
index 4ccca93..c707320 100644
|
|
--- a/drivers/ata/pata_mpiix.c
|
|
+++ b/drivers/ata/pata_mpiix.c
|
|
@@ -167,8 +167,10 @@ static struct scsi_host_template mpiix_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations mpiix_port_ops = {
|
|
@@ -287,8 +289,10 @@ static struct pci_driver mpiix_pci_driver = {
|
|
.id_table = mpiix,
|
|
.probe = mpiix_init_one,
|
|
.remove = mpiix_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init mpiix_init(void)
|
|
diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c
|
|
index cf7fe03..d0e7ac3 100644
|
|
--- a/drivers/ata/pata_netcell.c
|
|
+++ b/drivers/ata/pata_netcell.c
|
|
@@ -63,8 +63,10 @@ static struct scsi_host_template netcell_sht = {
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
/* Use standard CHS mapping rules */
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations netcell_ops = {
|
|
@@ -153,8 +155,10 @@ static struct pci_driver netcell_pci_driver = {
|
|
.id_table = netcell_pci_tbl,
|
|
.probe = netcell_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init netcell_init(void)
|
|
diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
|
|
index c3032eb..a4d4eb6 100644
|
|
--- a/drivers/ata/pata_ns87410.c
|
|
+++ b/drivers/ata/pata_ns87410.c
|
|
@@ -157,8 +157,10 @@ static struct scsi_host_template ns87410_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations ns87410_port_ops = {
|
|
@@ -212,8 +214,10 @@ static struct pci_driver ns87410_pci_driver = {
|
|
.id_table = ns87410,
|
|
.probe = ns87410_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init ns87410_init(void)
|
|
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c
|
|
index 10ac3cc..ad84c51 100644
|
|
--- a/drivers/ata/pata_oldpiix.c
|
|
+++ b/drivers/ata/pata_oldpiix.c
|
|
@@ -232,8 +232,10 @@ static struct scsi_host_template oldpiix_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations oldpiix_pata_ops = {
|
|
@@ -315,8 +317,10 @@ static struct pci_driver oldpiix_pci_driver = {
|
|
.id_table = oldpiix_pci_tbl,
|
|
.probe = oldpiix_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init oldpiix_init(void)
|
|
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c
|
|
index c2988b0..0a023b8 100644
|
|
--- a/drivers/ata/pata_opti.c
|
|
+++ b/drivers/ata/pata_opti.c
|
|
@@ -179,8 +179,10 @@ static struct scsi_host_template opti_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations opti_port_ops = {
|
|
@@ -244,8 +246,10 @@ static struct pci_driver opti_pci_driver = {
|
|
.id_table = opti,
|
|
.probe = opti_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init opti_init(void)
|
|
diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c
|
|
index 80d111c..6797ffa 100644
|
|
--- a/drivers/ata/pata_optidma.c
|
|
+++ b/drivers/ata/pata_optidma.c
|
|
@@ -360,8 +360,10 @@ static struct scsi_host_template optidma_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations optidma_port_ops = {
|
|
@@ -524,8 +526,10 @@ static struct pci_driver optidma_pci_driver = {
|
|
.id_table = optidma,
|
|
.probe = optidma_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init optidma_init(void)
|
|
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
|
|
index ad691b9..f18b67e 100644
|
|
--- a/drivers/ata/pata_pdc202xx_old.c
|
|
+++ b/drivers/ata/pata_pdc202xx_old.c
|
|
@@ -270,8 +270,10 @@ static struct scsi_host_template pdc202xx_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations pdc2024x_port_ops = {
|
|
@@ -402,8 +404,10 @@ static struct pci_driver pdc202xx_pci_driver = {
|
|
.id_table = pdc202xx,
|
|
.probe = pdc202xx_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init pdc202xx_init(void)
|
|
diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c
|
|
index 065541d..45c5d50 100644
|
|
--- a/drivers/ata/pata_radisys.c
|
|
+++ b/drivers/ata/pata_radisys.c
|
|
@@ -228,8 +228,10 @@ static struct scsi_host_template radisys_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations radisys_pata_ops = {
|
|
@@ -312,8 +314,10 @@ static struct pci_driver radisys_pci_driver = {
|
|
.id_table = radisys_pci_tbl,
|
|
.probe = radisys_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init radisys_init(void)
|
|
diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c
|
|
index cec0729..8fcddfb 100644
|
|
--- a/drivers/ata/pata_rz1000.c
|
|
+++ b/drivers/ata/pata_rz1000.c
|
|
@@ -93,8 +93,10 @@ static struct scsi_host_template rz1000_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations rz1000_port_ops = {
|
|
@@ -177,6 +179,7 @@ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *en
|
|
return -ENODEV;
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int rz1000_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
/* If this fails on resume (which is a "cant happen" case), we
|
|
@@ -185,6 +188,7 @@ static int rz1000_reinit_one(struct pci_dev *pdev)
|
|
panic("rz1000 fifo");
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id pata_rz1000[] = {
|
|
{ PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000), },
|
|
@@ -198,8 +202,10 @@ static struct pci_driver rz1000_pci_driver = {
|
|
.id_table = pata_rz1000,
|
|
.probe = rz1000_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = rz1000_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init rz1000_init(void)
|
|
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c
|
|
index a3b35bc..19328a8 100644
|
|
--- a/drivers/ata/pata_sc1200.c
|
|
+++ b/drivers/ata/pata_sc1200.c
|
|
@@ -194,8 +194,10 @@ static struct scsi_host_template sc1200_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations sc1200_port_ops = {
|
|
@@ -266,8 +268,10 @@ static struct pci_driver sc1200_pci_driver = {
|
|
.id_table = sc1200,
|
|
.probe = sc1200_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init sc1200_init(void)
|
|
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c
|
|
index f02b6a3..95f5202 100644
|
|
--- a/drivers/ata/pata_serverworks.c
|
|
+++ b/drivers/ata/pata_serverworks.c
|
|
@@ -326,8 +326,10 @@ static struct scsi_host_template serverworks_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations serverworks_osb4_port_ops = {
|
|
@@ -555,6 +557,7 @@ static int serverworks_init_one(struct pci_dev *pdev, const struct pci_device_id
|
|
return ata_pci_init_one(pdev, port_info, ports);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int serverworks_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
/* Force master latency timer to 64 PCI clocks */
|
|
@@ -578,6 +581,7 @@ static int serverworks_reinit_one(struct pci_dev *pdev)
|
|
}
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id serverworks[] = {
|
|
{ PCI_VDEVICE(SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4IDE), 0},
|
|
@@ -594,8 +598,10 @@ static struct pci_driver serverworks_pci_driver = {
|
|
.id_table = serverworks,
|
|
.probe = serverworks_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = serverworks_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init serverworks_init(void)
|
|
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
|
|
index e8dfd8f..653fe34 100644
|
|
--- a/drivers/ata/pata_sil680.c
|
|
+++ b/drivers/ata/pata_sil680.c
|
|
@@ -226,6 +226,10 @@ static struct scsi_host_template sil680_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
+ .suspend = ata_scsi_device_suspend,
|
|
+ .resume = ata_scsi_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations sil680_port_ops = {
|
|
@@ -367,11 +371,13 @@ static int sil680_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
static int sil680_reinit_one(struct pci_dev *pdev)
|
|
{
|
|
sil680_init_chip(pdev);
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id sil680[] = {
|
|
{ PCI_VDEVICE(CMD, PCI_DEVICE_ID_SII_680), },
|
|
@@ -384,8 +390,10 @@ static struct pci_driver sil680_pci_driver = {
|
|
.id_table = sil680,
|
|
.probe = sil680_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = sil680_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init sil680_init(void)
|
|
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
|
|
index 916cedb..e1fdea6 100644
|
|
--- a/drivers/ata/pata_sis.c
|
|
+++ b/drivers/ata/pata_sis.c
|
|
@@ -546,8 +546,10 @@ static struct scsi_host_template sis_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations sis_133_ops = {
|
|
@@ -1001,8 +1003,10 @@ static struct pci_driver sis_pci_driver = {
|
|
.id_table = sis_pci_tbl,
|
|
.probe = sis_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init sis_init(void)
|
|
diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c
|
|
index a142971..02c84a1 100644
|
|
--- a/drivers/ata/pata_triflex.c
|
|
+++ b/drivers/ata/pata_triflex.c
|
|
@@ -193,8 +193,10 @@ static struct scsi_host_template triflex_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations triflex_port_ops = {
|
|
@@ -260,8 +262,10 @@ static struct pci_driver triflex_pci_driver = {
|
|
.id_table = triflex,
|
|
.probe = triflex_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = ata_pci_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static int __init triflex_init(void)
|
|
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
|
|
index f0b6c3b..ee3b36a 100644
|
|
--- a/drivers/ata/pata_via.c
|
|
+++ b/drivers/ata/pata_via.c
|
|
@@ -305,8 +305,10 @@ static struct scsi_host_template via_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.resume = ata_scsi_device_resume,
|
|
.suspend = ata_scsi_device_suspend,
|
|
+#endif
|
|
};
|
|
|
|
static struct ata_port_operations via_port_ops = {
|
|
@@ -560,6 +562,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
return ata_pci_init_one(pdev, port_info, 2);
|
|
}
|
|
|
|
+#ifdef CONFIG_PM
|
|
/**
|
|
* via_reinit_one - reinit after resume
|
|
* @pdev; PCI device
|
|
@@ -592,6 +595,7 @@ static int via_reinit_one(struct pci_dev *pdev)
|
|
}
|
|
return ata_pci_device_resume(pdev);
|
|
}
|
|
+#endif
|
|
|
|
static const struct pci_device_id via[] = {
|
|
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C576_1), },
|
|
@@ -607,8 +611,10 @@ static struct pci_driver via_pci_driver = {
|
|
.id_table = via,
|
|
.probe = via_init_one,
|
|
.remove = ata_pci_remove_one,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_pci_device_suspend,
|
|
.resume = via_reinit_one,
|
|
+#endif
|
|
};
|
|
|
|
static int __init via_init(void)
|
|
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
|
|
index 7808d03..a12d638 100644
|
|
--- a/drivers/ata/sata_sil.c
|
|
+++ b/drivers/ata/sata_sil.c
|
|
@@ -181,8 +181,10 @@ static struct scsi_host_template sil_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_scsi_device_suspend,
|
|
.resume = ata_scsi_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations sil_ops = {
|
|
@@ -383,9 +385,15 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
|
|
goto freeze;
|
|
}
|
|
|
|
- if (unlikely(!qc || qc->tf.ctl & ATA_NIEN))
|
|
+ if (unlikely(!qc))
|
|
goto freeze;
|
|
|
|
+ if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) {
|
|
+ /* this sometimes happens, just clear IRQ */
|
|
+ ata_chk_status(ap);
|
|
+ return;
|
|
+ }
|
|
+
|
|
/* Check whether we are expecting interrupt in this state */
|
|
switch (ap->hsm_task_state) {
|
|
case HSM_ST_FIRST:
|
|
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
|
|
index 5aa288d..c159bae 100644
|
|
--- a/drivers/ata/sata_sil24.c
|
|
+++ b/drivers/ata/sata_sil24.c
|
|
@@ -386,8 +386,10 @@ static struct scsi_host_template sil24_sht = {
|
|
.slave_configure = ata_scsi_slave_config,
|
|
.slave_destroy = ata_scsi_slave_destroy,
|
|
.bios_param = ata_std_bios_param,
|
|
+#ifdef CONFIG_PM
|
|
.suspend = ata_scsi_device_suspend,
|
|
.resume = ata_scsi_device_resume,
|
|
+#endif
|
|
};
|
|
|
|
static const struct ata_port_operations sil24_ops = {
|
|
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
|
|
index 6246219..dd38c30 100644
|
|
--- a/drivers/block/pktcdvd.c
|
|
+++ b/drivers/block/pktcdvd.c
|
|
@@ -777,7 +777,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *
|
|
goto out;
|
|
}
|
|
|
|
- rq->cmd_len = COMMAND_SIZE(rq->cmd[0]);
|
|
+ rq->cmd_len = COMMAND_SIZE(cgc->cmd[0]);
|
|
memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
|
|
if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
|
|
memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
|
|
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
|
|
index a3011de..84787ce 100644
|
|
--- a/drivers/char/agp/intel-agp.c
|
|
+++ b/drivers/char/agp/intel-agp.c
|
|
@@ -117,13 +117,15 @@ static int intel_i810_configure(void)
|
|
|
|
current_size = A_SIZE_FIX(agp_bridge->current_size);
|
|
|
|
- pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
|
|
- temp &= 0xfff80000;
|
|
-
|
|
- intel_i810_private.registers = ioremap(temp, 128 * 4096);
|
|
if (!intel_i810_private.registers) {
|
|
- printk(KERN_ERR PFX "Unable to remap memory.\n");
|
|
- return -ENOMEM;
|
|
+ pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
|
|
+ temp &= 0xfff80000;
|
|
+
|
|
+ intel_i810_private.registers = ioremap(temp, 128 * 4096);
|
|
+ if (!intel_i810_private.registers) {
|
|
+ printk(KERN_ERR PFX "Unable to remap memory.\n");
|
|
+ return -ENOMEM;
|
|
+ }
|
|
}
|
|
|
|
if ((readl(intel_i810_private.registers+I810_DRAM_CTL)
|
|
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
|
|
index 9b1ff7e..3a6d05b 100644
|
|
--- a/drivers/char/pcmcia/cm4040_cs.c
|
|
+++ b/drivers/char/pcmcia/cm4040_cs.c
|
|
@@ -273,6 +273,7 @@ static ssize_t cm4040_read(struct file *filp, char __user *buf,
|
|
DEBUGP(6, dev, "BytesToRead=%lu\n", bytes_to_read);
|
|
|
|
min_bytes_to_read = min(count, bytes_to_read + 5);
|
|
+ min_bytes_to_read = min_t(size_t, min_bytes_to_read, READ_WRITE_BUFFER_SIZE);
|
|
|
|
DEBUGP(6, dev, "Min=%lu\n", min_bytes_to_read);
|
|
|
|
@@ -340,7 +341,7 @@ static ssize_t cm4040_write(struct file *filp, const char __user *buf,
|
|
return 0;
|
|
}
|
|
|
|
- if (count < 5) {
|
|
+ if ((count < 5) || (count > READ_WRITE_BUFFER_SIZE)) {
|
|
DEBUGP(2, dev, "<- cm4040_write buffersize=%Zd < 5\n", count);
|
|
return -EIO;
|
|
}
|
|
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c
|
|
index 20946f5..0b3044d 100644
|
|
--- a/drivers/char/specialix.c
|
|
+++ b/drivers/char/specialix.c
|
|
@@ -459,7 +459,7 @@ void missed_irq (unsigned long data)
|
|
if (irq) {
|
|
printk (KERN_INFO "Missed interrupt... Calling int from timer. \n");
|
|
sx_interrupt (((struct specialix_board *)data)->irq,
|
|
- (void*)data, NULL);
|
|
+ (void*)data);
|
|
}
|
|
missed_irq_timer.expires = jiffies + sx_poll;
|
|
add_timer (&missed_irq_timer);
|
|
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
|
|
index 47a6eac..2370908 100644
|
|
--- a/drivers/char/tty_io.c
|
|
+++ b/drivers/char/tty_io.c
|
|
@@ -1891,6 +1891,20 @@ static int init_dev(struct tty_driver *driver, int idx,
|
|
/* check whether we're reopening an existing tty */
|
|
if (driver->flags & TTY_DRIVER_DEVPTS_MEM) {
|
|
tty = devpts_get_tty(idx);
|
|
+ /*
|
|
+ * If we don't have a tty here on a slave open, it's because
|
|
+ * the master already started the close process and there's
|
|
+ * no relation between devpts file and tty anymore.
|
|
+ */
|
|
+ if (!tty && driver->subtype == PTY_TYPE_SLAVE) {
|
|
+ retval = -EIO;
|
|
+ goto end_init;
|
|
+ }
|
|
+ /*
|
|
+ * It's safe from now on because init_dev() is called with
|
|
+ * tty_mutex held and release_dev() won't change tty->count
|
|
+ * or tty->flags without having to grab tty_mutex
|
|
+ */
|
|
if (tty && driver->subtype == PTY_TYPE_MASTER)
|
|
tty = tty->link;
|
|
} else {
|
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
index 49f18f5..5cb2500 100644
|
|
--- a/drivers/hid/hid-core.c
|
|
+++ b/drivers/hid/hid-core.c
|
|
@@ -670,7 +670,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
|
|
|
|
if (item.format != HID_ITEM_FORMAT_SHORT) {
|
|
dbg("unexpected long global item");
|
|
- kfree(device->collection);
|
|
hid_free_device(device);
|
|
kfree(parser);
|
|
return NULL;
|
|
@@ -679,7 +678,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
|
|
if (dispatch_type[item.type](parser, &item)) {
|
|
dbg("item %u %u %u %u parsing failed\n",
|
|
item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag);
|
|
- kfree(device->collection);
|
|
hid_free_device(device);
|
|
kfree(parser);
|
|
return NULL;
|
|
@@ -688,14 +686,12 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
|
|
if (start == end) {
|
|
if (parser->collection_stack_ptr) {
|
|
dbg("unbalanced collection at end of report description");
|
|
- kfree(device->collection);
|
|
hid_free_device(device);
|
|
kfree(parser);
|
|
return NULL;
|
|
}
|
|
if (parser->local.delimiter_depth) {
|
|
dbg("unbalanced delimiter at end of report description");
|
|
- kfree(device->collection);
|
|
hid_free_device(device);
|
|
kfree(parser);
|
|
return NULL;
|
|
@@ -706,7 +702,6 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
|
|
}
|
|
|
|
dbg("item fetching failed at offset %d\n", (int)(end - start));
|
|
- kfree(device->collection);
|
|
hid_free_device(device);
|
|
kfree(parser);
|
|
return NULL;
|
|
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
|
|
index badde63..6558055 100644
|
|
--- a/drivers/ide/ide-iops.c
|
|
+++ b/drivers/ide/ide-iops.c
|
|
@@ -607,6 +607,8 @@ u8 eighty_ninty_three (ide_drive_t *drive)
|
|
if(!(drive->id->hw_config & 0x4000))
|
|
return 0;
|
|
#endif /* CONFIG_IDEDMA_IVB */
|
|
+ if (!(drive->id->hw_config & 0x2000))
|
|
+ return 0;
|
|
return 1;
|
|
}
|
|
|
|
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
|
|
index 61307ca..e2e0771 100644
|
|
--- a/drivers/ieee1394/nodemgr.c
|
|
+++ b/drivers/ieee1394/nodemgr.c
|
|
@@ -274,7 +274,6 @@ static struct device_driver nodemgr_mid_layer_driver = {
|
|
struct device nodemgr_dev_template_host = {
|
|
.bus = &ieee1394_bus_type,
|
|
.release = nodemgr_release_host,
|
|
- .driver = &nodemgr_mid_layer_driver,
|
|
};
|
|
|
|
|
|
@@ -1889,22 +1888,31 @@ int init_ieee1394_nodemgr(void)
|
|
|
|
error = class_register(&nodemgr_ne_class);
|
|
if (error)
|
|
- return error;
|
|
-
|
|
+ goto fail_ne;
|
|
error = class_register(&nodemgr_ud_class);
|
|
- if (error) {
|
|
- class_unregister(&nodemgr_ne_class);
|
|
- return error;
|
|
- }
|
|
+ if (error)
|
|
+ goto fail_ud;
|
|
error = driver_register(&nodemgr_mid_layer_driver);
|
|
+ if (error)
|
|
+ goto fail_ml;
|
|
+ /* This driver is not used if nodemgr is off (disable_nodemgr=1). */
|
|
+ nodemgr_dev_template_host.driver = &nodemgr_mid_layer_driver;
|
|
+
|
|
hpsb_register_highlevel(&nodemgr_highlevel);
|
|
return 0;
|
|
+
|
|
+fail_ml:
|
|
+ class_unregister(&nodemgr_ud_class);
|
|
+fail_ud:
|
|
+ class_unregister(&nodemgr_ne_class);
|
|
+fail_ne:
|
|
+ return error;
|
|
}
|
|
|
|
void cleanup_ieee1394_nodemgr(void)
|
|
{
|
|
hpsb_unregister_highlevel(&nodemgr_highlevel);
|
|
-
|
|
+ driver_unregister(&nodemgr_mid_layer_driver);
|
|
class_unregister(&nodemgr_ud_class);
|
|
class_unregister(&nodemgr_ne_class);
|
|
}
|
|
diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c
|
|
index 598b19f..f4d1ec0 100644
|
|
--- a/drivers/ieee1394/video1394.c
|
|
+++ b/drivers/ieee1394/video1394.c
|
|
@@ -489,6 +489,9 @@ static void wakeup_dma_ir_ctx(unsigned long l)
|
|
reset_ir_status(d, i);
|
|
d->buffer_status[d->buffer_prg_assignment[i]] = VIDEO1394_BUFFER_READY;
|
|
do_gettimeofday(&d->buffer_time[d->buffer_prg_assignment[i]]);
|
|
+ dma_region_sync_for_cpu(&d->dma,
|
|
+ d->buffer_prg_assignment[i] * d->buf_size,
|
|
+ d->buf_size);
|
|
}
|
|
}
|
|
|
|
@@ -1096,6 +1099,8 @@ static long video1394_ioctl(struct file *file,
|
|
DBGMSG(ohci->host->id, "Starting iso transmit DMA ctx=%d",
|
|
d->ctx);
|
|
put_timestamp(ohci, d, d->last_buffer);
|
|
+ dma_region_sync_for_device(&d->dma,
|
|
+ v.buffer * d->buf_size, d->buf_size);
|
|
|
|
/* Tell the controller where the first program is */
|
|
reg_write(ohci, d->cmdPtr,
|
|
@@ -1111,6 +1116,9 @@ static long video1394_ioctl(struct file *file,
|
|
"Waking up iso transmit dma ctx=%d",
|
|
d->ctx);
|
|
put_timestamp(ohci, d, d->last_buffer);
|
|
+ dma_region_sync_for_device(&d->dma,
|
|
+ v.buffer * d->buf_size, d->buf_size);
|
|
+
|
|
reg_write(ohci, d->ctrlSet, 0x1000);
|
|
}
|
|
}
|
|
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
|
|
index a0e4a03..9a6e4b6 100644
|
|
--- a/drivers/input/mouse/psmouse-base.c
|
|
+++ b/drivers/input/mouse/psmouse-base.c
|
|
@@ -987,8 +987,36 @@ static void psmouse_resync(struct work_struct *work)
|
|
static void psmouse_cleanup(struct serio *serio)
|
|
{
|
|
struct psmouse *psmouse = serio_get_drvdata(serio);
|
|
+ struct psmouse *parent = NULL;
|
|
+
|
|
+ mutex_lock(&psmouse_mutex);
|
|
+
|
|
+ if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {
|
|
+ parent = serio_get_drvdata(serio->parent);
|
|
+ psmouse_deactivate(parent);
|
|
+ }
|
|
+
|
|
+ psmouse_deactivate(psmouse);
|
|
+
|
|
+ if (psmouse->cleanup)
|
|
+ psmouse->cleanup(psmouse);
|
|
|
|
psmouse_reset(psmouse);
|
|
+
|
|
+/*
|
|
+ * Some boxes, such as HP nx7400, get terribly confused if mouse
|
|
+ * is not fully enabled before suspending/shutting down.
|
|
+ */
|
|
+ ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
|
|
+
|
|
+ if (parent) {
|
|
+ if (parent->pt_deactivate)
|
|
+ parent->pt_deactivate(parent);
|
|
+
|
|
+ psmouse_activate(parent);
|
|
+ }
|
|
+
|
|
+ mutex_unlock(&psmouse_mutex);
|
|
}
|
|
|
|
/*
|
|
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
|
|
index 1b74cae..cf1de95 100644
|
|
--- a/drivers/input/mouse/psmouse.h
|
|
+++ b/drivers/input/mouse/psmouse.h
|
|
@@ -68,6 +68,7 @@ struct psmouse {
|
|
|
|
int (*reconnect)(struct psmouse *psmouse);
|
|
void (*disconnect)(struct psmouse *psmouse);
|
|
+ void (*cleanup)(struct psmouse *psmouse);
|
|
int (*poll)(struct psmouse *psmouse);
|
|
|
|
void (*pt_activate)(struct psmouse *psmouse);
|
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
|
index 49ac696..f0f9413 100644
|
|
--- a/drivers/input/mouse/synaptics.c
|
|
+++ b/drivers/input/mouse/synaptics.c
|
|
@@ -652,6 +652,7 @@ int synaptics_init(struct psmouse *psmouse)
|
|
psmouse->set_rate = synaptics_set_rate;
|
|
psmouse->disconnect = synaptics_disconnect;
|
|
psmouse->reconnect = synaptics_reconnect;
|
|
+ psmouse->cleanup = synaptics_reset;
|
|
psmouse->pktsize = 6;
|
|
/* Synaptics can usually stay in sync without extra help */
|
|
psmouse->resync_time = 0;
|
|
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
|
|
index 2db1ca4..4ccb343 100644
|
|
--- a/drivers/kvm/kvm.h
|
|
+++ b/drivers/kvm/kvm.h
|
|
@@ -558,7 +558,7 @@ static inline void load_gs(u16 sel)
|
|
#ifndef load_ldt
|
|
static inline void load_ldt(u16 sel)
|
|
{
|
|
- asm ("lldt %0" : : "g"(sel));
|
|
+ asm ("lldt %0" : : "rm"(sel));
|
|
}
|
|
#endif
|
|
|
|
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig
|
|
index a9e747c..1a86387 100644
|
|
--- a/drivers/macintosh/Kconfig
|
|
+++ b/drivers/macintosh/Kconfig
|
|
@@ -1,6 +1,6 @@
|
|
|
|
menu "Macintosh device drivers"
|
|
- depends on PPC || MAC
|
|
+ depends on PPC || MAC || X86
|
|
|
|
config ADB
|
|
bool "Apple Desktop Bus (ADB) support"
|
|
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
|
|
index 1110816..059704f 100644
|
|
--- a/drivers/md/bitmap.c
|
|
+++ b/drivers/md/bitmap.c
|
|
@@ -1160,6 +1160,22 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect
|
|
return 0;
|
|
}
|
|
|
|
+ if (unlikely((*bmc & COUNTER_MAX) == COUNTER_MAX)) {
|
|
+ DEFINE_WAIT(__wait);
|
|
+ /* note that it is safe to do the prepare_to_wait
|
|
+ * after the test as long as we do it before dropping
|
|
+ * the spinlock.
|
|
+ */
|
|
+ prepare_to_wait(&bitmap->overflow_wait, &__wait,
|
|
+ TASK_UNINTERRUPTIBLE);
|
|
+ spin_unlock_irq(&bitmap->lock);
|
|
+ bitmap->mddev->queue
|
|
+ ->unplug_fn(bitmap->mddev->queue);
|
|
+ schedule();
|
|
+ finish_wait(&bitmap->overflow_wait, &__wait);
|
|
+ continue;
|
|
+ }
|
|
+
|
|
switch(*bmc) {
|
|
case 0:
|
|
bitmap_file_set_bit(bitmap, offset);
|
|
@@ -1169,7 +1185,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect
|
|
case 1:
|
|
*bmc = 2;
|
|
}
|
|
- BUG_ON((*bmc & COUNTER_MAX) == COUNTER_MAX);
|
|
+
|
|
(*bmc)++;
|
|
|
|
spin_unlock_irq(&bitmap->lock);
|
|
@@ -1207,6 +1223,9 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
|
|
if (!success && ! (*bmc & NEEDED_MASK))
|
|
*bmc |= NEEDED_MASK;
|
|
|
|
+ if ((*bmc & COUNTER_MAX) == COUNTER_MAX)
|
|
+ wake_up(&bitmap->overflow_wait);
|
|
+
|
|
(*bmc)--;
|
|
if (*bmc <= 2) {
|
|
set_page_attr(bitmap,
|
|
@@ -1431,6 +1450,7 @@ int bitmap_create(mddev_t *mddev)
|
|
spin_lock_init(&bitmap->lock);
|
|
atomic_set(&bitmap->pending_writes, 0);
|
|
init_waitqueue_head(&bitmap->write_wait);
|
|
+ init_waitqueue_head(&bitmap->overflow_wait);
|
|
|
|
bitmap->mddev = mddev;
|
|
|
|
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
|
|
index a9401c0..82249a6 100644
|
|
--- a/drivers/md/raid10.c
|
|
+++ b/drivers/md/raid10.c
|
|
@@ -429,7 +429,7 @@ static sector_t raid10_find_virt(conf_t *conf, sector_t sector, int dev)
|
|
if (dev < 0)
|
|
dev += conf->raid_disks;
|
|
} else {
|
|
- while (sector > conf->stride) {
|
|
+ while (sector >= conf->stride) {
|
|
sector -= conf->stride;
|
|
if (dev < conf->near_copies)
|
|
dev += conf->raid_disks - conf->near_copies;
|
|
@@ -1801,6 +1801,7 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
|
|
for (k=0; k<conf->copies; k++)
|
|
if (r10_bio->devs[k].devnum == i)
|
|
break;
|
|
+ BUG_ON(k == conf->copies);
|
|
bio = r10_bio->devs[1].bio;
|
|
bio->bi_next = biolist;
|
|
biolist = bio;
|
|
@@ -2021,19 +2022,30 @@ static int run(mddev_t *mddev)
|
|
if (!conf->tmppage)
|
|
goto out_free_conf;
|
|
|
|
+ conf->mddev = mddev;
|
|
+ conf->raid_disks = mddev->raid_disks;
|
|
conf->near_copies = nc;
|
|
conf->far_copies = fc;
|
|
conf->copies = nc*fc;
|
|
conf->far_offset = fo;
|
|
conf->chunk_mask = (sector_t)(mddev->chunk_size>>9)-1;
|
|
conf->chunk_shift = ffz(~mddev->chunk_size) - 9;
|
|
+ size = mddev->size >> (conf->chunk_shift-1);
|
|
+ sector_div(size, fc);
|
|
+ size = size * conf->raid_disks;
|
|
+ sector_div(size, nc);
|
|
+ /* 'size' is now the number of chunks in the array */
|
|
+ /* calculate "used chunks per device" in 'stride' */
|
|
+ stride = size * conf->copies;
|
|
+ sector_div(stride, conf->raid_disks);
|
|
+ mddev->size = stride << (conf->chunk_shift-1);
|
|
+
|
|
if (fo)
|
|
- conf->stride = 1 << conf->chunk_shift;
|
|
- else {
|
|
- stride = mddev->size >> (conf->chunk_shift-1);
|
|
+ stride = 1;
|
|
+ else
|
|
sector_div(stride, fc);
|
|
- conf->stride = stride << conf->chunk_shift;
|
|
- }
|
|
+ conf->stride = stride << conf->chunk_shift;
|
|
+
|
|
conf->r10bio_pool = mempool_create(NR_RAID10_BIOS, r10bio_pool_alloc,
|
|
r10bio_pool_free, conf);
|
|
if (!conf->r10bio_pool) {
|
|
@@ -2063,8 +2075,6 @@ static int run(mddev_t *mddev)
|
|
|
|
disk->head_position = 0;
|
|
}
|
|
- conf->raid_disks = mddev->raid_disks;
|
|
- conf->mddev = mddev;
|
|
spin_lock_init(&conf->device_lock);
|
|
INIT_LIST_HEAD(&conf->retry_list);
|
|
|
|
@@ -2106,16 +2116,8 @@ static int run(mddev_t *mddev)
|
|
/*
|
|
* Ok, everything is just fine now
|
|
*/
|
|
- if (conf->far_offset) {
|
|
- size = mddev->size >> (conf->chunk_shift-1);
|
|
- size *= conf->raid_disks;
|
|
- size <<= conf->chunk_shift;
|
|
- sector_div(size, conf->far_copies);
|
|
- } else
|
|
- size = conf->stride * conf->raid_disks;
|
|
- sector_div(size, conf->near_copies);
|
|
- mddev->array_size = size/2;
|
|
- mddev->resync_max_sectors = size;
|
|
+ mddev->array_size = size << (conf->chunk_shift-1);
|
|
+ mddev->resync_max_sectors = size << conf->chunk_shift;
|
|
|
|
mddev->queue->unplug_fn = raid10_unplug;
|
|
mddev->queue->issue_flush_fn = raid10_issue_flush;
|
|
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
|
|
index 467c169..11c3d7b 100644
|
|
--- a/drivers/md/raid5.c
|
|
+++ b/drivers/md/raid5.c
|
|
@@ -2620,7 +2620,7 @@ static struct bio *remove_bio_from_retry(raid5_conf_t *conf)
|
|
}
|
|
bi = conf->retry_read_aligned_list;
|
|
if(bi) {
|
|
- conf->retry_read_aligned = bi->bi_next;
|
|
+ conf->retry_read_aligned_list = bi->bi_next;
|
|
bi->bi_next = NULL;
|
|
bi->bi_phys_segments = 1; /* biased count of active stripes */
|
|
bi->bi_hw_segments = 0; /* count of processed stripes */
|
|
@@ -2669,6 +2669,27 @@ static int raid5_align_endio(struct bio *bi, unsigned int bytes, int error)
|
|
return 0;
|
|
}
|
|
|
|
+static int bio_fits_rdev(struct bio *bi)
|
|
+{
|
|
+ request_queue_t *q = bdev_get_queue(bi->bi_bdev);
|
|
+
|
|
+ if ((bi->bi_size>>9) > q->max_sectors)
|
|
+ return 0;
|
|
+ blk_recount_segments(q, bi);
|
|
+ if (bi->bi_phys_segments > q->max_phys_segments ||
|
|
+ bi->bi_hw_segments > q->max_hw_segments)
|
|
+ return 0;
|
|
+
|
|
+ if (q->merge_bvec_fn)
|
|
+ /* it's too hard to apply the merge_bvec_fn at this stage,
|
|
+ * just just give up
|
|
+ */
|
|
+ return 0;
|
|
+
|
|
+ return 1;
|
|
+}
|
|
+
|
|
+
|
|
static int chunk_aligned_read(request_queue_t *q, struct bio * raid_bio)
|
|
{
|
|
mddev_t *mddev = q->queuedata;
|
|
@@ -2715,6 +2736,13 @@ static int chunk_aligned_read(request_queue_t *q, struct bio * raid_bio)
|
|
align_bi->bi_flags &= ~(1 << BIO_SEG_VALID);
|
|
align_bi->bi_sector += rdev->data_offset;
|
|
|
|
+ if (!bio_fits_rdev(align_bi)) {
|
|
+ /* too big in some way */
|
|
+ bio_put(align_bi);
|
|
+ rdev_dec_pending(rdev, mddev);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
spin_lock_irq(&conf->device_lock);
|
|
wait_event_lock_irq(conf->wait_for_stripe,
|
|
conf->quiesce == 0,
|
|
@@ -3107,7 +3135,9 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
|
|
last_sector = raid_bio->bi_sector + (raid_bio->bi_size>>9);
|
|
|
|
for (; logical_sector < last_sector;
|
|
- logical_sector += STRIPE_SECTORS, scnt++) {
|
|
+ logical_sector += STRIPE_SECTORS,
|
|
+ sector += STRIPE_SECTORS,
|
|
+ scnt++) {
|
|
|
|
if (scnt < raid_bio->bi_hw_segments)
|
|
/* already done this stripe */
|
|
@@ -3123,7 +3153,13 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
|
|
}
|
|
|
|
set_bit(R5_ReadError, &sh->dev[dd_idx].flags);
|
|
- add_stripe_bio(sh, raid_bio, dd_idx, 0);
|
|
+ if (!add_stripe_bio(sh, raid_bio, dd_idx, 0)) {
|
|
+ release_stripe(sh);
|
|
+ raid_bio->bi_hw_segments = scnt;
|
|
+ conf->retry_read_aligned = raid_bio;
|
|
+ return handled;
|
|
+ }
|
|
+
|
|
handle_stripe(sh, NULL);
|
|
release_stripe(sh);
|
|
handled++;
|
|
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c
|
|
index 40774fe..af35f30 100644
|
|
--- a/drivers/media/dvb/dvb-core/dvbdev.c
|
|
+++ b/drivers/media/dvb/dvb-core/dvbdev.c
|
|
@@ -200,6 +200,8 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|
const struct dvb_device *template, void *priv, int type)
|
|
{
|
|
struct dvb_device *dvbdev;
|
|
+ struct file_operations *dvbdevfops;
|
|
+
|
|
int id;
|
|
|
|
if (mutex_lock_interruptible(&dvbdev_register_lock))
|
|
@@ -219,12 +221,22 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
|
return -ENOMEM;
|
|
}
|
|
|
|
+ dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL);
|
|
+
|
|
+ if (!dvbdevfops) {
|
|
+ kfree (dvbdev);
|
|
+ mutex_unlock(&dvbdev_register_lock);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
|
dvbdev->type = type;
|
|
dvbdev->id = id;
|
|
dvbdev->adapter = adap;
|
|
dvbdev->priv = priv;
|
|
+ dvbdev->fops = dvbdevfops;
|
|
|
|
+ memcpy(dvbdev->fops, template->fops, sizeof(struct file_operations));
|
|
dvbdev->fops->owner = adap->module;
|
|
|
|
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
|
@@ -252,6 +264,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
|
|
dvbdev->type, dvbdev->id)));
|
|
|
|
list_del (&dvbdev->list_head);
|
|
+ kfree (dvbdev->fops);
|
|
kfree (dvbdev);
|
|
}
|
|
EXPORT_SYMBOL(dvb_unregister_device);
|
|
diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
|
|
index 15d12fc..127a94b 100644
|
|
--- a/drivers/media/dvb/dvb-usb/cxusb.c
|
|
+++ b/drivers/media/dvb/dvb-usb/cxusb.c
|
|
@@ -469,9 +469,9 @@ static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
|
|
fw->data[BLUEBIRD_01_ID_OFFSET + 1] == USB_VID_DVICO >> 8) {
|
|
|
|
fw->data[BLUEBIRD_01_ID_OFFSET + 2] =
|
|
- udev->descriptor.idProduct + 1;
|
|
+ le16_to_cpu(udev->descriptor.idProduct) + 1;
|
|
fw->data[BLUEBIRD_01_ID_OFFSET + 3] =
|
|
- udev->descriptor.idProduct >> 8;
|
|
+ le16_to_cpu(udev->descriptor.idProduct) >> 8;
|
|
|
|
return usb_cypress_load_firmware(udev, fw, CYPRESS_FX2);
|
|
}
|
|
diff --git a/drivers/media/dvb/dvb-usb/digitv.c b/drivers/media/dvb/dvb-usb/digitv.c
|
|
index 4a198d4..b5acb11 100644
|
|
--- a/drivers/media/dvb/dvb-usb/digitv.c
|
|
+++ b/drivers/media/dvb/dvb-usb/digitv.c
|
|
@@ -119,6 +119,8 @@ static int digitv_nxt6000_tuner_set_params(struct dvb_frontend *fe, struct dvb_f
|
|
struct dvb_usb_adapter *adap = fe->dvb->priv;
|
|
u8 b[5];
|
|
dvb_usb_tuner_calc_regs(fe,fep,b, 5);
|
|
+ if (fe->ops.i2c_gate_ctrl)
|
|
+ fe->ops.i2c_gate_ctrl(fe, 1);
|
|
return digitv_ctrl_msg(adap->dev, USB_WRITE_TUNER, 0, &b[1], 4, NULL, 0);
|
|
}
|
|
|
|
diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
|
|
index 7bb7589..2f29ba4 100644
|
|
--- a/drivers/media/video/cx25840/cx25840-core.c
|
|
+++ b/drivers/media/video/cx25840/cx25840-core.c
|
|
@@ -907,13 +907,13 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
|
|
state->vbi_line_offset = 8;
|
|
state->id = id;
|
|
|
|
+ i2c_attach_client(client);
|
|
+
|
|
if (state->is_cx25836)
|
|
cx25836_initialize(client);
|
|
else
|
|
cx25840_initialize(client, 1);
|
|
|
|
- i2c_attach_client(client);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/media/video/cx25840/cx25840-firmware.c b/drivers/media/video/cx25840/cx25840-firmware.c
|
|
index 1958d40..0e86b9d 100644
|
|
--- a/drivers/media/video/cx25840/cx25840-firmware.c
|
|
+++ b/drivers/media/video/cx25840/cx25840-firmware.c
|
|
@@ -37,7 +37,7 @@
|
|
*/
|
|
#define FWSEND 48
|
|
|
|
-#define FWDEV(x) &((x)->adapter->dev)
|
|
+#define FWDEV(x) &((x)->dev)
|
|
|
|
static char *firmware = FWFILE;
|
|
|
|
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
|
|
index 0cf0360..1c04516 100644
|
|
--- a/drivers/media/video/cx88/cx88-blackbird.c
|
|
+++ b/drivers/media/video/cx88/cx88-blackbird.c
|
|
@@ -53,7 +53,8 @@ MODULE_PARM_DESC(debug,"enable debug messages [blackbird]");
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
-#define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024
|
|
+#define OLD_BLACKBIRD_FIRM_IMAGE_SIZE 262144
|
|
+#define BLACKBIRD_FIRM_IMAGE_SIZE 376836
|
|
|
|
/* defines below are from ivtv-driver.h */
|
|
|
|
@@ -401,7 +402,7 @@ static int blackbird_find_mailbox(struct cx8802_dev *dev)
|
|
u32 value;
|
|
int i;
|
|
|
|
- for (i = 0; i < BLACKBIRD_FIRM_IMAGE_SIZE; i++) {
|
|
+ for (i = 0; i < dev->fw_size; i++) {
|
|
memory_read(dev->core, i, &value);
|
|
if (value == signature[signaturecnt])
|
|
signaturecnt++;
|
|
@@ -449,12 +450,15 @@ static int blackbird_load_firmware(struct cx8802_dev *dev)
|
|
return -1;
|
|
}
|
|
|
|
- if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) {
|
|
- dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n",
|
|
- firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE);
|
|
+ if ((firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) &&
|
|
+ (firmware->size != OLD_BLACKBIRD_FIRM_IMAGE_SIZE)) {
|
|
+ dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d or %d)\n",
|
|
+ firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE,
|
|
+ OLD_BLACKBIRD_FIRM_IMAGE_SIZE);
|
|
release_firmware(firmware);
|
|
return -1;
|
|
}
|
|
+ dev->fw_size = firmware->size;
|
|
|
|
if (0 != memcmp(firmware->data, magic, 8)) {
|
|
dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n");
|
|
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h
|
|
index a9575ad..e775b4b 100644
|
|
--- a/drivers/media/video/cx88/cx88.h
|
|
+++ b/drivers/media/video/cx88/cx88.h
|
|
@@ -459,6 +459,7 @@ struct cx8802_dev {
|
|
u32 mailbox;
|
|
int width;
|
|
int height;
|
|
+ int fw_size;
|
|
|
|
/* for dvb only */
|
|
struct videobuf_dvb dvb;
|
|
diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
|
|
index c94f97b..aec1a00 100644
|
|
--- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c
|
|
+++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
|
|
@@ -288,6 +288,44 @@ static int pvr2_encoder_vcmd(struct pvr2_hdw *hdw, int cmd,
|
|
return pvr2_encoder_cmd(hdw,cmd,args,0,data);
|
|
}
|
|
|
|
+
|
|
+/* This implements some extra setup for the encoder that seems to be
|
|
+ specific to the PVR USB2 hardware. */
|
|
+int pvr2_encoder_prep_config(struct pvr2_hdw *hdw)
|
|
+{
|
|
+ int ret = 0;
|
|
+ int encMisc3Arg = 0;
|
|
+
|
|
+ /* Mike Isely <isely@pobox.com> 22-Feb-2007 The windows driver
|
|
+ sends the following list of ENC_MISC commands (for both
|
|
+ 24xxx and 29xxx devices). Meanings are not entirely clear,
|
|
+ however without the ENC_MISC(3,encMisc3Arg) command then we risk
|
|
+ random perpetual video corruption whenever the video input
|
|
+ breaks up for a moment (like when switching channels). */
|
|
+
|
|
+
|
|
+ /* This ENC_MISC(3,encMisc3Arg) command is critical - without
|
|
+ it there will eventually be video corruption. Also, the
|
|
+ 29xxx case is strange - the Windows driver is passing 1
|
|
+ regardless of device type but if we have 1 for 29xxx device
|
|
+ the video turns sluggish. */
|
|
+ switch (hdw->hdw_type) {
|
|
+ case PVR2_HDW_TYPE_24XXX: encMisc3Arg = 1; break;
|
|
+ case PVR2_HDW_TYPE_29XXX: encMisc3Arg = 0; break;
|
|
+ default: break;
|
|
+ }
|
|
+ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3,
|
|
+ encMisc3Arg,0,0);
|
|
+
|
|
+ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 8,0,0,0);
|
|
+
|
|
+ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0);
|
|
+ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+
|
|
int pvr2_encoder_configure(struct pvr2_hdw *hdw)
|
|
{
|
|
int ret;
|
|
@@ -302,6 +340,8 @@ int pvr2_encoder_configure(struct pvr2_hdw *hdw)
|
|
|
|
ret = 0;
|
|
|
|
+ ret |= pvr2_encoder_prep_config(hdw);
|
|
+
|
|
if (!ret) ret = pvr2_encoder_vcmd(
|
|
hdw,CX2341X_ENC_SET_NUM_VSYNC_LINES, 2,
|
|
0xf0, 0xf0);
|
|
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
|
|
index d200496..2fbd24c 100644
|
|
--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
|
|
+++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
|
|
@@ -1041,7 +1041,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
|
|
{
|
|
const struct firmware *fw_entry = NULL;
|
|
void *fw_ptr;
|
|
- unsigned int pipe, fw_len, fw_done;
|
|
+ unsigned int pipe, fw_len, fw_done, bcnt, icnt;
|
|
int actual_length;
|
|
int ret = 0;
|
|
int fwidx;
|
|
@@ -1093,11 +1093,11 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
|
|
|
|
fw_len = fw_entry->size;
|
|
|
|
- if (fw_len % FIRMWARE_CHUNK_SIZE) {
|
|
+ if (fw_len % sizeof(u32)) {
|
|
pvr2_trace(PVR2_TRACE_ERROR_LEGS,
|
|
"size of %s firmware"
|
|
- " must be a multiple of 8192B",
|
|
- fw_files[fwidx]);
|
|
+ " must be a multiple of %zu bytes",
|
|
+ fw_files[fwidx],sizeof(u32));
|
|
release_firmware(fw_entry);
|
|
return -1;
|
|
}
|
|
@@ -1112,18 +1112,21 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
|
|
|
|
pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT);
|
|
|
|
- for (fw_done = 0 ; (fw_done < fw_len) && !ret ;
|
|
- fw_done += FIRMWARE_CHUNK_SIZE ) {
|
|
- int i;
|
|
- memcpy(fw_ptr, fw_entry->data + fw_done, FIRMWARE_CHUNK_SIZE);
|
|
- /* Usbsnoop log shows that we must swap bytes... */
|
|
- for (i = 0; i < FIRMWARE_CHUNK_SIZE/4 ; i++)
|
|
- ((u32 *)fw_ptr)[i] = ___swab32(((u32 *)fw_ptr)[i]);
|
|
-
|
|
- ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,
|
|
- FIRMWARE_CHUNK_SIZE,
|
|
+ fw_done = 0;
|
|
+ for (fw_done = 0; fw_done < fw_len;) {
|
|
+ bcnt = fw_len - fw_done;
|
|
+ if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE;
|
|
+ memcpy(fw_ptr, fw_entry->data + fw_done, bcnt);
|
|
+ /* Usbsnoop log shows that we must swap bytes... */
|
|
+ for (icnt = 0; icnt < bcnt/4 ; icnt++)
|
|
+ ((u32 *)fw_ptr)[icnt] =
|
|
+ ___swab32(((u32 *)fw_ptr)[icnt]);
|
|
+
|
|
+ ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt,
|
|
&actual_length, HZ);
|
|
- ret |= (actual_length != FIRMWARE_CHUNK_SIZE);
|
|
+ ret |= (actual_length != bcnt);
|
|
+ if (ret) break;
|
|
+ fw_done += bcnt;
|
|
}
|
|
|
|
trace_firmware("upload of %s : %i / %i ",
|
|
diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
|
|
index c2d13d7..175a942 100644
|
|
--- a/drivers/mmc/sdhci.c
|
|
+++ b/drivers/mmc/sdhci.c
|
|
@@ -37,6 +37,7 @@ static unsigned int debug_quirks = 0;
|
|
#define SDHCI_QUIRK_FORCE_DMA (1<<1)
|
|
/* Controller doesn't like some resets when there is no card inserted. */
|
|
#define SDHCI_QUIRK_NO_CARD_NO_RESET (1<<2)
|
|
+#define SDHCI_QUIRK_SINGLE_POWER_WRITE (1<<3)
|
|
|
|
static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
{
|
|
@@ -65,6 +66,14 @@ static const struct pci_device_id pci_ids[] __devinitdata = {
|
|
.driver_data = SDHCI_QUIRK_FORCE_DMA,
|
|
},
|
|
|
|
+ {
|
|
+ .vendor = PCI_VENDOR_ID_ENE,
|
|
+ .device = PCI_DEVICE_ID_ENE_CB712_SD,
|
|
+ .subvendor = PCI_ANY_ID,
|
|
+ .subdevice = PCI_ANY_ID,
|
|
+ .driver_data = SDHCI_QUIRK_SINGLE_POWER_WRITE,
|
|
+ },
|
|
+
|
|
{ /* Generic SD host controller */
|
|
PCI_DEVICE_CLASS((PCI_CLASS_SYSTEM_SDHCI << 8), 0xFFFF00)
|
|
},
|
|
@@ -674,10 +683,17 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
|
|
if (host->power == power)
|
|
return;
|
|
|
|
- writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
|
|
-
|
|
- if (power == (unsigned short)-1)
|
|
+ if (power == (unsigned short)-1) {
|
|
+ writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
|
|
goto out;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Spec says that we should clear the power reg before setting
|
|
+ * a new value. Some controllers don't seem to like this though.
|
|
+ */
|
|
+ if (!(host->chip->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE))
|
|
+ writeb(0, host->ioaddr + SDHCI_POWER_CONTROL);
|
|
|
|
pwr = SDHCI_POWER_ON;
|
|
|
|
diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c
|
|
index 035cd9b..a61351f 100644
|
|
--- a/drivers/mtd/redboot.c
|
|
+++ b/drivers/mtd/redboot.c
|
|
@@ -94,8 +94,19 @@ static int parse_redboot_partitions(struct mtd_info *master,
|
|
* (NOTE: this is 'size' not 'data_length'; size is
|
|
* the full size of the entry.)
|
|
*/
|
|
- if (swab32(buf[i].size) == master->erasesize) {
|
|
+
|
|
+ /* RedBoot can combine the FIS directory and
|
|
+ config partitions into a single eraseblock;
|
|
+ we assume wrong-endian if either the swapped
|
|
+ 'size' matches the eraseblock size precisely,
|
|
+ or if the swapped size actually fits in an
|
|
+ eraseblock while the unswapped size doesn't. */
|
|
+ if (swab32(buf[i].size) == master->erasesize ||
|
|
+ (buf[i].size > master->erasesize
|
|
+ && swab32(buf[i].size) < master->erasesize)) {
|
|
int j;
|
|
+ /* Update numslots based on actual FIS directory size */
|
|
+ numslots = swab32(buf[i].size) / sizeof (struct fis_image_desc);
|
|
for (j = 0; j < numslots; ++j) {
|
|
|
|
/* A single 0xff denotes a deleted entry.
|
|
@@ -120,11 +131,11 @@ static int parse_redboot_partitions(struct mtd_info *master,
|
|
swab32s(&buf[j].desc_cksum);
|
|
swab32s(&buf[j].file_cksum);
|
|
}
|
|
+ } else if (buf[i].size < master->erasesize) {
|
|
+ /* Update numslots based on actual FIS directory size */
|
|
+ numslots = buf[i].size / sizeof(struct fis_image_desc);
|
|
}
|
|
break;
|
|
- } else {
|
|
- /* re-calculate of real numslots */
|
|
- numslots = buf[i].size / sizeof(struct fis_image_desc);
|
|
}
|
|
}
|
|
if (i == numslots) {
|
|
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
|
|
index 93f2b7a..952a6bd 100644
|
|
--- a/drivers/net/forcedeth.c
|
|
+++ b/drivers/net/forcedeth.c
|
|
@@ -825,7 +825,7 @@ enum {
|
|
NV_MSIX_INT_DISABLED,
|
|
NV_MSIX_INT_ENABLED
|
|
};
|
|
-static int msix = NV_MSIX_INT_ENABLED;
|
|
+static int msix = NV_MSIX_INT_DISABLED;
|
|
|
|
/*
|
|
* DMA 64bit
|
|
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
|
|
index 822dd0b..f44c397 100644
|
|
--- a/drivers/net/sky2.c
|
|
+++ b/drivers/net/sky2.c
|
|
@@ -1796,6 +1796,7 @@ out:
|
|
|
|
/* Transmit timeout is only called if we are running, carries is up
|
|
* and tx queue is full (stopped).
|
|
+ * Called with netif_tx_lock held.
|
|
*/
|
|
static void sky2_tx_timeout(struct net_device *dev)
|
|
{
|
|
@@ -1821,17 +1822,14 @@ static void sky2_tx_timeout(struct net_device *dev)
|
|
sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START);
|
|
} else if (report != sky2->tx_cons) {
|
|
printk(KERN_INFO PFX "status report lost?\n");
|
|
-
|
|
- netif_tx_lock_bh(dev);
|
|
sky2_tx_complete(sky2, report);
|
|
- netif_tx_unlock_bh(dev);
|
|
} else {
|
|
printk(KERN_INFO PFX "hardware hung? flushing\n");
|
|
|
|
sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP);
|
|
sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
|
|
|
|
- sky2_tx_clean(dev);
|
|
+ sky2_tx_complete(sky2, sky2->tx_prod);
|
|
|
|
sky2_qset(hw, txq);
|
|
sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);
|
|
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
|
|
index 6ed1d47..148aab2 100644
|
|
--- a/drivers/net/sky2.h
|
|
+++ b/drivers/net/sky2.h
|
|
@@ -1579,7 +1579,7 @@ enum {
|
|
|
|
GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR |
|
|
GMR_FS_FRAGMENT | GMR_FS_LONG_ERR |
|
|
- GMR_FS_MII_ERR | GMR_FS_GOOD_FC | GMR_FS_BAD_FC |
|
|
+ GMR_FS_MII_ERR | GMR_FS_BAD_FC |
|
|
GMR_FS_UN_SIZE | GMR_FS_JABBER,
|
|
};
|
|
|
|
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c
|
|
index 7f59a3d..4dd8a0b 100644
|
|
--- a/drivers/net/tulip/dmfe.c
|
|
+++ b/drivers/net/tulip/dmfe.c
|
|
@@ -187,7 +187,7 @@ struct rx_desc {
|
|
struct dmfe_board_info {
|
|
u32 chip_id; /* Chip vendor/Device ID */
|
|
u32 chip_revision; /* Chip revision */
|
|
- struct DEVICE *dev; /* net device */
|
|
+ struct DEVICE *next_dev; /* next device */
|
|
struct pci_dev *pdev; /* PCI device */
|
|
spinlock_t lock;
|
|
|
|
@@ -399,8 +399,6 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
|
|
/* Init system & device */
|
|
db = netdev_priv(dev);
|
|
|
|
- db->dev = dev;
|
|
-
|
|
/* Allocate Tx/Rx descriptor memory */
|
|
db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr);
|
|
db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, &db->buf_pool_dma_ptr);
|
|
@@ -428,7 +426,6 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
|
|
dev->poll_controller = &poll_dmfe;
|
|
#endif
|
|
dev->ethtool_ops = &netdev_ethtool_ops;
|
|
- netif_carrier_off(db->dev);
|
|
spin_lock_init(&db->lock);
|
|
|
|
pci_read_config_dword(pdev, 0x50, &pci_pmr);
|
|
@@ -1053,7 +1050,6 @@ static void netdev_get_drvinfo(struct net_device *dev,
|
|
|
|
static const struct ethtool_ops netdev_ethtool_ops = {
|
|
.get_drvinfo = netdev_get_drvinfo,
|
|
- .get_link = ethtool_op_get_link,
|
|
};
|
|
|
|
/*
|
|
@@ -1148,7 +1144,6 @@ static void dmfe_timer(unsigned long data)
|
|
/* Link Failed */
|
|
DMFE_DBUG(0, "Link Failed", tmp_cr12);
|
|
db->link_failed = 1;
|
|
- netif_carrier_off(db->dev);
|
|
|
|
/* For Force 10/100M Half/Full mode: Enable Auto-Nego mode */
|
|
/* AUTO or force 1M Homerun/Longrun don't need */
|
|
@@ -1171,8 +1166,6 @@ static void dmfe_timer(unsigned long data)
|
|
if ( (db->media_mode & DMFE_AUTO) &&
|
|
dmfe_sense_speed(db) )
|
|
db->link_failed = 1;
|
|
- else
|
|
- netif_carrier_on(db->dev);
|
|
dmfe_process_mode(db);
|
|
/* SHOW_MEDIA_TYPE(db->op_mode); */
|
|
}
|
|
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx.h b/drivers/net/wireless/bcm43xx/bcm43xx.h
|
|
index 8286678..02ad9b1 100644
|
|
--- a/drivers/net/wireless/bcm43xx/bcm43xx.h
|
|
+++ b/drivers/net/wireless/bcm43xx/bcm43xx.h
|
|
@@ -21,7 +21,7 @@
|
|
#define PFX KBUILD_MODNAME ": "
|
|
|
|
#define BCM43xx_SWITCH_CORE_MAX_RETRIES 50
|
|
-#define BCM43xx_IRQWAIT_MAX_RETRIES 50
|
|
+#define BCM43xx_IRQWAIT_MAX_RETRIES 100
|
|
|
|
#define BCM43xx_IO_SIZE 8192
|
|
|
|
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
|
|
index 91b752e..629ba91 100644
|
|
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c
|
|
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
|
|
@@ -1453,12 +1453,10 @@ static void handle_irq_transmit_status(struct bcm43xx_private *bcm)
|
|
|
|
bcm43xx_debugfs_log_txstat(bcm, &stat);
|
|
|
|
- if (stat.flags & BCM43xx_TXSTAT_FLAG_IGNORE)
|
|
+ if (stat.flags & BCM43xx_TXSTAT_FLAG_AMPDU)
|
|
+ continue;
|
|
+ if (stat.flags & BCM43xx_TXSTAT_FLAG_INTER)
|
|
continue;
|
|
- if (!(stat.flags & BCM43xx_TXSTAT_FLAG_ACK)) {
|
|
- //TODO: packet was not acked (was lost)
|
|
- }
|
|
- //TODO: There are more (unknown) flags to test. see bcm43xx_main.h
|
|
|
|
if (bcm43xx_using_pio(bcm))
|
|
bcm43xx_pio_handle_xmitstatus(bcm, &stat);
|
|
@@ -1866,9 +1864,6 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id)
|
|
|
|
spin_lock(&bcm->irq_lock);
|
|
|
|
- assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED);
|
|
- assert(bcm->current_core->id == BCM43xx_COREID_80211);
|
|
-
|
|
reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON);
|
|
if (reason == 0xffffffff) {
|
|
/* irq not for us (shared irq) */
|
|
@@ -1879,6 +1874,9 @@ static irqreturn_t bcm43xx_interrupt_handler(int irq, void *dev_id)
|
|
if (!reason)
|
|
goto out;
|
|
|
|
+ assert(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED);
|
|
+ assert(bcm->current_core->id == BCM43xx_COREID_80211);
|
|
+
|
|
bcm->dma_reason[0] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA0_REASON)
|
|
& 0x0001DC00;
|
|
bcm->dma_reason[1] = bcm43xx_read32(bcm, BCM43xx_MMIO_DMA1_REASON)
|
|
@@ -2738,8 +2736,9 @@ static int bcm43xx_probe_cores(struct bcm43xx_private *bcm)
|
|
* dangling pins on the second core. Be careful
|
|
* and ignore these cores here.
|
|
*/
|
|
- if (bcm->pci_dev->device != 0x4324) {
|
|
- dprintk(KERN_INFO PFX "Ignoring additional 802.11 core.\n");
|
|
+ if (1 /*bcm->pci_dev->device != 0x4324*/ ) {
|
|
+ /* TODO: A PHY */
|
|
+ dprintk(KERN_INFO PFX "Ignoring additional 802.11a core.\n");
|
|
continue;
|
|
}
|
|
}
|
|
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h
|
|
index 2aed19e..9ecf2bf 100644
|
|
--- a/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h
|
|
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_xmit.h
|
|
@@ -137,14 +137,8 @@ struct bcm43xx_xmitstatus {
|
|
u16 unknown; //FIXME
|
|
};
|
|
|
|
-#define BCM43xx_TXSTAT_FLAG_ACK 0x01
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x02
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x04
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x08
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x10
|
|
-#define BCM43xx_TXSTAT_FLAG_IGNORE 0x20
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x40
|
|
-//TODO #define BCM43xx_TXSTAT_FLAG_??? 0x80
|
|
+#define BCM43xx_TXSTAT_FLAG_AMPDU 0x10
|
|
+#define BCM43xx_TXSTAT_FLAG_INTER 0x20
|
|
|
|
u8 bcm43xx_plcp_get_ratecode_cck(const u8 bitrate);
|
|
u8 bcm43xx_plcp_get_ratecode_ofdm(const u8 bitrate);
|
|
diff --git a/drivers/net/wireless/prism54/isl_ioctl.c b/drivers/net/wireless/prism54/isl_ioctl.c
|
|
index 838d510..a5396c1 100644
|
|
--- a/drivers/net/wireless/prism54/isl_ioctl.c
|
|
+++ b/drivers/net/wireless/prism54/isl_ioctl.c
|
|
@@ -1395,11 +1395,16 @@ static int prism54_set_auth(struct net_device *ndev,
|
|
break;
|
|
|
|
case IW_AUTH_RX_UNENCRYPTED_EAPOL:
|
|
- dot1x = param->value ? 1 : 0;
|
|
+ /* dot1x should be the opposite of RX_UNENCRYPTED_EAPOL;
|
|
+ * turn off dot1x when allowing recepit of unencrypted eapol
|
|
+ * frames, turn on dot1x when we disallow receipt
|
|
+ */
|
|
+ dot1x = param->value ? 0x00 : 0x01;
|
|
break;
|
|
|
|
case IW_AUTH_PRIVACY_INVOKED:
|
|
privinvoked = param->value ? 1 : 0;
|
|
+ break;
|
|
|
|
case IW_AUTH_DROP_UNENCRYPTED:
|
|
exunencrypt = param->value ? 1 : 0;
|
|
@@ -1589,6 +1594,7 @@ static int prism54_set_encodeext(struct net_device *ndev,
|
|
}
|
|
key.type = DOT11_PRIV_TKIP;
|
|
key.length = KEY_SIZE_TKIP;
|
|
+ break;
|
|
default:
|
|
return -EINVAL;
|
|
}
|
|
diff --git a/drivers/rtc/rtc-pcf8563.c b/drivers/rtc/rtc-pcf8563.c
|
|
index 4b72b8e..038118b 100644
|
|
--- a/drivers/rtc/rtc-pcf8563.c
|
|
+++ b/drivers/rtc/rtc-pcf8563.c
|
|
@@ -53,6 +53,25 @@ I2C_CLIENT_INSMOD;
|
|
#define PCF8563_SC_LV 0x80 /* low voltage */
|
|
#define PCF8563_MO_C 0x80 /* century */
|
|
|
|
+struct pcf8563 {
|
|
+ struct i2c_client client;
|
|
+ /*
|
|
+ * The meaning of MO_C bit varies by the chip type.
|
|
+ * From PCF8563 datasheet: this bit is toggled when the years
|
|
+ * register overflows from 99 to 00
|
|
+ * 0 indicates the century is 20xx
|
|
+ * 1 indicates the century is 19xx
|
|
+ * From RTC8564 datasheet: this bit indicates change of
|
|
+ * century. When the year digit data overflows from 99 to 00,
|
|
+ * this bit is set. By presetting it to 0 while still in the
|
|
+ * 20th century, it will be set in year 2000, ...
|
|
+ * There seems no reliable way to know how the system use this
|
|
+ * bit. So let's do it heuristically, assuming we are live in
|
|
+ * 1970...2069.
|
|
+ */
|
|
+ int c_polarity; /* 0: MO_C=1 means 19xx, otherwise MO_C=1 means 20xx */
|
|
+};
|
|
+
|
|
static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind);
|
|
static int pcf8563_detach(struct i2c_client *client);
|
|
|
|
@@ -62,6 +81,7 @@ static int pcf8563_detach(struct i2c_client *client);
|
|
*/
|
|
static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm)
|
|
{
|
|
+ struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client);
|
|
unsigned char buf[13] = { PCF8563_REG_ST1 };
|
|
|
|
struct i2c_msg msgs[] = {
|
|
@@ -94,8 +114,12 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm)
|
|
tm->tm_mday = BCD2BIN(buf[PCF8563_REG_DM] & 0x3F);
|
|
tm->tm_wday = buf[PCF8563_REG_DW] & 0x07;
|
|
tm->tm_mon = BCD2BIN(buf[PCF8563_REG_MO] & 0x1F) - 1; /* rtc mn 1-12 */
|
|
- tm->tm_year = BCD2BIN(buf[PCF8563_REG_YR])
|
|
- + (buf[PCF8563_REG_MO] & PCF8563_MO_C ? 0 : 100);
|
|
+ tm->tm_year = BCD2BIN(buf[PCF8563_REG_YR]);
|
|
+ if (tm->tm_year < 70)
|
|
+ tm->tm_year += 100; /* assume we are in 1970...2069 */
|
|
+ /* detect the polarity heuristically. see note above. */
|
|
+ pcf8563->c_polarity = (buf[PCF8563_REG_MO] & PCF8563_MO_C) ?
|
|
+ (tm->tm_year >= 100) : (tm->tm_year < 100);
|
|
|
|
dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
|
|
"mday=%d, mon=%d, year=%d, wday=%d\n",
|
|
@@ -114,6 +138,7 @@ static int pcf8563_get_datetime(struct i2c_client *client, struct rtc_time *tm)
|
|
|
|
static int pcf8563_set_datetime(struct i2c_client *client, struct rtc_time *tm)
|
|
{
|
|
+ struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client);
|
|
int i, err;
|
|
unsigned char buf[9];
|
|
|
|
@@ -135,7 +160,7 @@ static int pcf8563_set_datetime(struct i2c_client *client, struct rtc_time *tm)
|
|
|
|
/* year and century */
|
|
buf[PCF8563_REG_YR] = BIN2BCD(tm->tm_year % 100);
|
|
- if (tm->tm_year < 100)
|
|
+ if (pcf8563->c_polarity ? (tm->tm_year >= 100) : (tm->tm_year < 100))
|
|
buf[PCF8563_REG_MO] |= PCF8563_MO_C;
|
|
|
|
buf[PCF8563_REG_DW] = tm->tm_wday & 0x07;
|
|
@@ -248,6 +273,7 @@ static struct i2c_driver pcf8563_driver = {
|
|
|
|
static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind)
|
|
{
|
|
+ struct pcf8563 *pcf8563;
|
|
struct i2c_client *client;
|
|
struct rtc_device *rtc;
|
|
|
|
@@ -260,11 +286,12 @@ static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind)
|
|
goto exit;
|
|
}
|
|
|
|
- if (!(client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL))) {
|
|
+ if (!(pcf8563 = kzalloc(sizeof(struct pcf8563), GFP_KERNEL))) {
|
|
err = -ENOMEM;
|
|
goto exit;
|
|
}
|
|
|
|
+ client = &pcf8563->client;
|
|
client->addr = address;
|
|
client->driver = &pcf8563_driver;
|
|
client->adapter = adapter;
|
|
@@ -301,7 +328,7 @@ exit_detach:
|
|
i2c_detach_client(client);
|
|
|
|
exit_kfree:
|
|
- kfree(client);
|
|
+ kfree(pcf8563);
|
|
|
|
exit:
|
|
return err;
|
|
@@ -309,6 +336,7 @@ exit:
|
|
|
|
static int pcf8563_detach(struct i2c_client *client)
|
|
{
|
|
+ struct pcf8563 *pcf8563 = container_of(client, struct pcf8563, client);
|
|
int err;
|
|
struct rtc_device *rtc = i2c_get_clientdata(client);
|
|
|
|
@@ -318,7 +346,7 @@ static int pcf8563_detach(struct i2c_client *client)
|
|
if ((err = i2c_detach_client(client)))
|
|
return err;
|
|
|
|
- kfree(client);
|
|
+ kfree(pcf8563);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c
|
|
index 22631f8..8410587 100644
|
|
--- a/drivers/sbus/char/bbc_i2c.c
|
|
+++ b/drivers/sbus/char/bbc_i2c.c
|
|
@@ -187,19 +187,20 @@ static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status)
|
|
bp->waiting = 1;
|
|
add_wait_queue(&bp->wq, &wait);
|
|
while (limit-- > 0) {
|
|
- u8 val;
|
|
-
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
- *status = val = readb(bp->i2c_control_regs + 0);
|
|
- if ((val & I2C_PCF_PIN) == 0) {
|
|
+ unsigned long val;
|
|
+
|
|
+ val = wait_event_interruptible_timeout(
|
|
+ bp->wq,
|
|
+ (((*status = readb(bp->i2c_control_regs + 0))
|
|
+ & I2C_PCF_PIN) == 0),
|
|
+ msecs_to_jiffies(250));
|
|
+ if (val > 0) {
|
|
ret = 0;
|
|
break;
|
|
}
|
|
- msleep_interruptible(250);
|
|
}
|
|
remove_wait_queue(&bp->wq, &wait);
|
|
bp->waiting = 0;
|
|
- current->state = TASK_RUNNING;
|
|
|
|
return ret;
|
|
}
|
|
@@ -340,7 +341,7 @@ static irqreturn_t bbc_i2c_interrupt(int irq, void *dev_id)
|
|
*/
|
|
if (bp->waiting &&
|
|
!(readb(bp->i2c_control_regs + 0x0) & I2C_PCF_PIN))
|
|
- wake_up(&bp->wq);
|
|
+ wake_up_interruptible(&bp->wq);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c
|
|
index dae4ef1..4973e14 100644
|
|
--- a/drivers/usb/atm/ueagle-atm.c
|
|
+++ b/drivers/usb/atm/ueagle-atm.c
|
|
@@ -61,6 +61,7 @@
|
|
#include <linux/usb.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/ctype.h>
|
|
+#include <linux/sched.h>
|
|
#include <linux/kthread.h>
|
|
#include <linux/version.h>
|
|
#include <linux/mutex.h>
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index 1988224..8ddeed3 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -44,6 +44,7 @@ struct usb_hub {
|
|
struct usb_hub_status hub;
|
|
struct usb_port_status port;
|
|
} *status; /* buffer for status reports */
|
|
+ struct mutex status_mutex; /* for the status buffer */
|
|
|
|
int error; /* last reported error */
|
|
int nerrors; /* track consecutive errors */
|
|
@@ -538,6 +539,7 @@ static int hub_hub_status(struct usb_hub *hub,
|
|
{
|
|
int ret;
|
|
|
|
+ mutex_lock(&hub->status_mutex);
|
|
ret = get_hub_status(hub->hdev, &hub->status->hub);
|
|
if (ret < 0)
|
|
dev_err (hub->intfdev,
|
|
@@ -547,6 +549,7 @@ static int hub_hub_status(struct usb_hub *hub,
|
|
*change = le16_to_cpu(hub->status->hub.wHubChange);
|
|
ret = 0;
|
|
}
|
|
+ mutex_unlock(&hub->status_mutex);
|
|
return ret;
|
|
}
|
|
|
|
@@ -620,6 +623,7 @@ static int hub_configure(struct usb_hub *hub,
|
|
ret = -ENOMEM;
|
|
goto fail;
|
|
}
|
|
+ mutex_init(&hub->status_mutex);
|
|
|
|
hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);
|
|
if (!hub->descriptor) {
|
|
@@ -1418,6 +1422,7 @@ static int hub_port_status(struct usb_hub *hub, int port1,
|
|
{
|
|
int ret;
|
|
|
|
+ mutex_lock(&hub->status_mutex);
|
|
ret = get_port_status(hub->hdev, port1, &hub->status->port);
|
|
if (ret < 4) {
|
|
dev_err (hub->intfdev,
|
|
@@ -1429,6 +1434,7 @@ static int hub_port_status(struct usb_hub *hub, int port1,
|
|
*change = le16_to_cpu(hub->status->port.wPortChange);
|
|
ret = 0;
|
|
}
|
|
+ mutex_unlock(&hub->status_mutex);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
|
|
index 025d333..6e9fdd6 100644
|
|
--- a/drivers/usb/host/ehci-hcd.c
|
|
+++ b/drivers/usb/host/ehci-hcd.c
|
|
@@ -296,6 +296,18 @@ static void ehci_watchdog (unsigned long param)
|
|
spin_unlock_irqrestore (&ehci->lock, flags);
|
|
}
|
|
|
|
+/* On some systems, leaving remote wakeup enabled prevents system shutdown.
|
|
+ * The firmware seems to think that powering off is a wakeup event!
|
|
+ * This routine turns off remote wakeup and everything else, on all ports.
|
|
+ */
|
|
+static void ehci_turn_off_all_ports(struct ehci_hcd *ehci)
|
|
+{
|
|
+ int port = HCS_N_PORTS(ehci->hcs_params);
|
|
+
|
|
+ while (port--)
|
|
+ writel(PORT_RWC_BITS, &ehci->regs->port_status[port]);
|
|
+}
|
|
+
|
|
/* ehci_shutdown kick in for silicon on any bus (not just pci, etc).
|
|
* This forcibly disables dma and IRQs, helping kexec and other cases
|
|
* where the next system software may expect clean state.
|
|
@@ -307,9 +319,13 @@ ehci_shutdown (struct usb_hcd *hcd)
|
|
|
|
ehci = hcd_to_ehci (hcd);
|
|
(void) ehci_halt (ehci);
|
|
+ ehci_turn_off_all_ports(ehci);
|
|
|
|
/* make BIOS/etc use companion controller during reboot */
|
|
writel (0, &ehci->regs->configured_flag);
|
|
+
|
|
+ /* unblock posted writes */
|
|
+ readl(&ehci->regs->configured_flag);
|
|
}
|
|
|
|
static void ehci_port_power (struct ehci_hcd *ehci, int is_on)
|
|
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c
|
|
index bacc25c..8e4427a 100644
|
|
--- a/drivers/usb/host/uhci-hub.c
|
|
+++ b/drivers/usb/host/uhci-hub.c
|
|
@@ -33,6 +33,9 @@ static __u8 root_hub_hub_des[] =
|
|
/* status change bits: nonzero writes will clear */
|
|
#define RWC_BITS (USBPORTSC_OCC | USBPORTSC_PEC | USBPORTSC_CSC)
|
|
|
|
+/* suspend/resume bits: port suspended or port resuming */
|
|
+#define SUSPEND_BITS (USBPORTSC_SUSP | USBPORTSC_RD)
|
|
+
|
|
/* A port that either is connected or has a changed-bit set will prevent
|
|
* us from AUTO_STOPPING.
|
|
*/
|
|
@@ -96,8 +99,8 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port,
|
|
int status;
|
|
int i;
|
|
|
|
- if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) {
|
|
- CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD);
|
|
+ if (inw(port_addr) & SUSPEND_BITS) {
|
|
+ CLR_RH_PORTSTAT(SUSPEND_BITS);
|
|
if (test_bit(port, &uhci->resuming_ports))
|
|
set_bit(port, &uhci->port_c_suspend);
|
|
|
|
@@ -107,7 +110,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port,
|
|
* Experiments show that some controllers take longer, so
|
|
* we'll poll for completion. */
|
|
for (i = 0; i < 10; ++i) {
|
|
- if (!(inw(port_addr) & USBPORTSC_RD))
|
|
+ if (!(inw(port_addr) & SUSPEND_BITS))
|
|
break;
|
|
udelay(1);
|
|
}
|
|
@@ -289,7 +292,7 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
|
|
wPortStatus |= USB_PORT_STAT_CONNECTION;
|
|
if (status & USBPORTSC_PE) {
|
|
wPortStatus |= USB_PORT_STAT_ENABLE;
|
|
- if (status & (USBPORTSC_SUSP | USBPORTSC_RD))
|
|
+ if (status & SUSPEND_BITS)
|
|
wPortStatus |= USB_PORT_STAT_SUSPEND;
|
|
}
|
|
if (status & USBPORTSC_OC)
|
|
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
|
|
index c6c9e72..dd9e546 100644
|
|
--- a/drivers/usb/input/hid-core.c
|
|
+++ b/drivers/usb/input/hid-core.c
|
|
@@ -1212,8 +1212,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
|
|
le16_to_cpu(dev->descriptor.idProduct));
|
|
|
|
hid->bus = BUS_USB;
|
|
- hid->vendor = dev->descriptor.idVendor;
|
|
- hid->product = dev->descriptor.idProduct;
|
|
+ hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
|
|
+ hid->product = le16_to_cpu(dev->descriptor.idProduct);
|
|
|
|
usb_make_path(dev, hid->phys, sizeof(hid->phys));
|
|
strlcat(hid->phys, "/input", sizeof(hid->phys));
|
|
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c
|
|
index a7932a7..32f0e3a 100644
|
|
--- a/drivers/usb/misc/appledisplay.c
|
|
+++ b/drivers/usb/misc/appledisplay.c
|
|
@@ -281,8 +281,8 @@ static int appledisplay_probe(struct usb_interface *iface,
|
|
/* Register backlight device */
|
|
snprintf(bl_name, sizeof(bl_name), "appledisplay%d",
|
|
atomic_inc_return(&count_displays) - 1);
|
|
- pdata->bd = backlight_device_register(bl_name, NULL, NULL,
|
|
- &appledisplay_bl_data);
|
|
+ pdata->bd = backlight_device_register(bl_name, NULL,
|
|
+ pdata, &appledisplay_bl_data);
|
|
if (IS_ERR(pdata->bd)) {
|
|
err("appledisplay: Backlight registration failed");
|
|
goto error;
|
|
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
|
|
index 6e39e99..d2acc15 100644
|
|
--- a/drivers/usb/net/usbnet.c
|
|
+++ b/drivers/usb/net/usbnet.c
|
|
@@ -1182,6 +1182,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
|
// NOTE net->name still not usable ...
|
|
if (info->bind) {
|
|
status = info->bind (dev, udev);
|
|
+ if (status < 0)
|
|
+ goto out1;
|
|
+
|
|
// heuristic: "usb%d" for links we know are two-host,
|
|
// else "eth%d" when there's reasonable doubt. userspace
|
|
// can rename the link if it knows better.
|
|
@@ -1208,12 +1211,12 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
|
if (status == 0 && dev->status)
|
|
status = init_status (dev, udev);
|
|
if (status < 0)
|
|
- goto out1;
|
|
+ goto out3;
|
|
|
|
if (!dev->rx_urb_size)
|
|
dev->rx_urb_size = dev->hard_mtu;
|
|
dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
|
|
-
|
|
+
|
|
SET_NETDEV_DEV(net, &udev->dev);
|
|
status = register_netdev (net);
|
|
if (status)
|
|
diff --git a/drivers/video/aty/mach64_ct.c b/drivers/video/aty/mach64_ct.c
|
|
index f3b487b..1fdcfdb 100644
|
|
--- a/drivers/video/aty/mach64_ct.c
|
|
+++ b/drivers/video/aty/mach64_ct.c
|
|
@@ -598,7 +598,6 @@ static void aty_resume_pll_ct(const struct fb_info *info,
|
|
struct atyfb_par *par = info->par;
|
|
|
|
if (par->mclk_per != par->xclk_per) {
|
|
- int i;
|
|
/*
|
|
* This disables the sclk, crashes the computer as reported:
|
|
* aty_st_pll_ct(SPLL_CNTL2, 3, info);
|
|
@@ -614,7 +613,7 @@ static void aty_resume_pll_ct(const struct fb_info *info,
|
|
* helps for Rage Mobilities that sometimes crash when
|
|
* we switch to sclk. (Daniel Mantione, 13-05-2003)
|
|
*/
|
|
- for (i=0;i<=0x1ffff;i++);
|
|
+ udelay(500);
|
|
}
|
|
|
|
aty_st_pll_ct(PLL_REF_DIV, pll->ct.pll_ref_div, par);
|
|
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
|
|
index 9109ba1..378767c 100644
|
|
--- a/fs/9p/vfs_inode.c
|
|
+++ b/fs/9p/vfs_inode.c
|
|
@@ -585,17 +585,14 @@ static int v9fs_vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
|
if (IS_ERR(inode)) {
|
|
err = PTR_ERR(inode);
|
|
inode = NULL;
|
|
- goto clean_up_fids;
|
|
+ v9fs_fid_destroy(vfid);
|
|
+ goto error;
|
|
}
|
|
|
|
dentry->d_op = &v9fs_dentry_operations;
|
|
d_instantiate(dentry, inode);
|
|
return 0;
|
|
|
|
-clean_up_fids:
|
|
- if (vfid)
|
|
- v9fs_fid_destroy(vfid);
|
|
-
|
|
clean_up_dfid:
|
|
v9fs_fid_clunk(v9ses, dfid);
|
|
|
|
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
|
|
index 669dbe5..51db118 100644
|
|
--- a/fs/binfmt_elf.c
|
|
+++ b/fs/binfmt_elf.c
|
|
@@ -76,7 +76,8 @@ static struct linux_binfmt elf_format = {
|
|
.load_binary = load_elf_binary,
|
|
.load_shlib = load_elf_library,
|
|
.core_dump = elf_core_dump,
|
|
- .min_coredump = ELF_EXEC_PAGESIZE
|
|
+ .min_coredump = ELF_EXEC_PAGESIZE,
|
|
+ .hasvdso = 1
|
|
};
|
|
|
|
#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
|
|
diff --git a/fs/buffer.c b/fs/buffer.c
|
|
index 1ad674f..05c5d02 100644
|
|
--- a/fs/buffer.c
|
|
+++ b/fs/buffer.c
|
|
@@ -78,6 +78,7 @@ EXPORT_SYMBOL(__lock_buffer);
|
|
|
|
void fastcall unlock_buffer(struct buffer_head *bh)
|
|
{
|
|
+ smp_mb__before_clear_bit();
|
|
clear_buffer_locked(bh);
|
|
smp_mb__after_clear_bit();
|
|
wake_up_bit(&bh->b_state, BH_Lock);
|
|
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
|
|
index 6347c2d..daaa243 100644
|
|
--- a/fs/ext2/super.c
|
|
+++ b/fs/ext2/super.c
|
|
@@ -708,10 +708,14 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
|
|
set_opt(sbi->s_mount_opt, GRPID);
|
|
if (def_mount_opts & EXT2_DEFM_UID16)
|
|
set_opt(sbi->s_mount_opt, NO_UID32);
|
|
+#ifdef CONFIG_EXT2_FS_XATTR
|
|
if (def_mount_opts & EXT2_DEFM_XATTR_USER)
|
|
set_opt(sbi->s_mount_opt, XATTR_USER);
|
|
+#endif
|
|
+#ifdef CONFIG_EXT2_FS_POSIX_ACL
|
|
if (def_mount_opts & EXT2_DEFM_ACL)
|
|
set_opt(sbi->s_mount_opt, POSIX_ACL);
|
|
+#endif
|
|
|
|
if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_PANIC)
|
|
set_opt(sbi->s_mount_opt, ERRORS_PANIC);
|
|
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
|
|
index b348867..1c0a51b 100644
|
|
--- a/fs/ext3/super.c
|
|
+++ b/fs/ext3/super.c
|
|
@@ -1459,10 +1459,14 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
|
|
set_opt(sbi->s_mount_opt, GRPID);
|
|
if (def_mount_opts & EXT3_DEFM_UID16)
|
|
set_opt(sbi->s_mount_opt, NO_UID32);
|
|
+#ifdef CONFIG_EXT3_FS_XATTR
|
|
if (def_mount_opts & EXT3_DEFM_XATTR_USER)
|
|
set_opt(sbi->s_mount_opt, XATTR_USER);
|
|
+#endif
|
|
+#ifdef CONFIG_EXT3_FS_POSIX_ACL
|
|
if (def_mount_opts & EXT3_DEFM_ACL)
|
|
set_opt(sbi->s_mount_opt, POSIX_ACL);
|
|
+#endif
|
|
if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_DATA)
|
|
sbi->s_mount_opt |= EXT3_MOUNT_JOURNAL_DATA;
|
|
else if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_ORDERED)
|
|
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
|
|
index 486a641..fa1d1f3 100644
|
|
--- a/fs/ext4/super.c
|
|
+++ b/fs/ext4/super.c
|
|
@@ -1518,10 +1518,14 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
|
|
set_opt(sbi->s_mount_opt, GRPID);
|
|
if (def_mount_opts & EXT4_DEFM_UID16)
|
|
set_opt(sbi->s_mount_opt, NO_UID32);
|
|
+#ifdef CONFIG_EXT4DEV_FS_XATTR
|
|
if (def_mount_opts & EXT4_DEFM_XATTR_USER)
|
|
set_opt(sbi->s_mount_opt, XATTR_USER);
|
|
+#endif
|
|
+#ifdef CONFIG_EXT4DEV_FS_POSIX_ACL
|
|
if (def_mount_opts & EXT4_DEFM_ACL)
|
|
set_opt(sbi->s_mount_opt, POSIX_ACL);
|
|
+#endif
|
|
if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)
|
|
sbi->s_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
|
|
else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)
|
|
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
|
|
index d0db881..c186857 100644
|
|
--- a/fs/gfs2/quota.c
|
|
+++ b/fs/gfs2/quota.c
|
|
@@ -279,7 +279,7 @@ static int bh_get(struct gfs2_quota_data *qd)
|
|
(bh->b_data + sizeof(struct gfs2_meta_header) +
|
|
offset * sizeof(struct gfs2_quota_change));
|
|
|
|
- mutex_lock(&sdp->sd_quota_mutex);
|
|
+ mutex_unlock(&sdp->sd_quota_mutex);
|
|
|
|
return 0;
|
|
|
|
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
|
|
index 4f4cd13..e6bd553 100644
|
|
--- a/fs/hugetlbfs/inode.c
|
|
+++ b/fs/hugetlbfs/inode.c
|
|
@@ -449,10 +449,13 @@ static int hugetlbfs_symlink(struct inode *dir,
|
|
}
|
|
|
|
/*
|
|
- * For direct-IO reads into hugetlb pages
|
|
+ * mark the head page dirty
|
|
*/
|
|
static int hugetlbfs_set_page_dirty(struct page *page)
|
|
{
|
|
+ struct page *head = (struct page *)page_private(page);
|
|
+
|
|
+ SetPageDirty(head);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
|
|
index 0b4acc1..a5c019e 100644
|
|
--- a/fs/lockd/clntproc.c
|
|
+++ b/fs/lockd/clntproc.c
|
|
@@ -361,7 +361,6 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message *
|
|
{
|
|
struct nlm_host *host = req->a_host;
|
|
struct rpc_clnt *clnt;
|
|
- int status = -ENOLCK;
|
|
|
|
dprintk("lockd: call procedure %d on %s (async)\n",
|
|
(int)proc, host->h_name);
|
|
@@ -373,12 +372,10 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message *
|
|
msg->rpc_proc = &clnt->cl_procinfo[proc];
|
|
|
|
/* bootstrap and kick off the async RPC call */
|
|
- status = rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req);
|
|
- if (status == 0)
|
|
- return 0;
|
|
+ return rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req);
|
|
out_err:
|
|
- nlm_release_call(req);
|
|
- return status;
|
|
+ tk_ops->rpc_release(req);
|
|
+ return -ENOLCK;
|
|
}
|
|
|
|
int nlm_async_call(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops)
|
|
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
|
|
index c7db0a5..cf51f84 100644
|
|
--- a/fs/lockd/svclock.c
|
|
+++ b/fs/lockd/svclock.c
|
|
@@ -593,9 +593,7 @@ callback:
|
|
|
|
/* Call the client */
|
|
kref_get(&block->b_count);
|
|
- if (nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG,
|
|
- &nlmsvc_grant_ops) < 0)
|
|
- nlmsvc_release_block(block);
|
|
+ nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops);
|
|
}
|
|
|
|
/*
|
|
diff --git a/fs/ocfs2/journal.h b/fs/ocfs2/journal.h
|
|
index e121636..d026b4f 100644
|
|
--- a/fs/ocfs2/journal.h
|
|
+++ b/fs/ocfs2/journal.h
|
|
@@ -306,8 +306,8 @@ int ocfs2_journal_dirty_data(handle_t *handle,
|
|
* for the dinode, one for the new block. */
|
|
#define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2)
|
|
|
|
-/* file update (nlink, etc) + dir entry block */
|
|
-#define OCFS2_LINK_CREDITS (OCFS2_INODE_UPDATE_CREDITS + 1)
|
|
+/* file update (nlink, etc) + directory mtime/ctime + dir entry block */
|
|
+#define OCFS2_LINK_CREDITS (2*OCFS2_INODE_UPDATE_CREDITS + 1)
|
|
|
|
/* inode + dir inode (if we unlink a dir), + dir entry block + orphan
|
|
* dir inode link */
|
|
diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c
|
|
index 433b6f6..a6c0ca9 100644
|
|
--- a/fs/ufs/dir.c
|
|
+++ b/fs/ufs/dir.c
|
|
@@ -106,12 +106,13 @@ static void ufs_check_page(struct page *page)
|
|
char *kaddr = page_address(page);
|
|
unsigned offs, rec_len;
|
|
unsigned limit = PAGE_CACHE_SIZE;
|
|
+ const unsigned chunk_mask = UFS_SB(sb)->s_uspi->s_dirblksize - 1;
|
|
struct ufs_dir_entry *p;
|
|
char *error;
|
|
|
|
if ((dir->i_size >> PAGE_CACHE_SHIFT) == page->index) {
|
|
limit = dir->i_size & ~PAGE_CACHE_MASK;
|
|
- if (limit & (UFS_SECTOR_SIZE - 1))
|
|
+ if (limit & chunk_mask)
|
|
goto Ebadsize;
|
|
if (!limit)
|
|
goto out;
|
|
@@ -126,7 +127,7 @@ static void ufs_check_page(struct page *page)
|
|
goto Ealign;
|
|
if (rec_len < UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, p)))
|
|
goto Enamelen;
|
|
- if (((offs + rec_len - 1) ^ offs) & ~(UFS_SECTOR_SIZE-1))
|
|
+ if (((offs + rec_len - 1) ^ offs) & ~chunk_mask)
|
|
goto Espan;
|
|
if (fs32_to_cpu(sb, p->d_ino) > (UFS_SB(sb)->s_uspi->s_ipg *
|
|
UFS_SB(sb)->s_uspi->s_ncg))
|
|
@@ -310,6 +311,7 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode)
|
|
int namelen = dentry->d_name.len;
|
|
struct super_block *sb = dir->i_sb;
|
|
unsigned reclen = UFS_DIR_REC_LEN(namelen);
|
|
+ const unsigned int chunk_size = UFS_SB(sb)->s_uspi->s_dirblksize;
|
|
unsigned short rec_len, name_len;
|
|
struct page *page = NULL;
|
|
struct ufs_dir_entry *de;
|
|
@@ -342,8 +344,8 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode)
|
|
if ((char *)de == dir_end) {
|
|
/* We hit i_size */
|
|
name_len = 0;
|
|
- rec_len = UFS_SECTOR_SIZE;
|
|
- de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE);
|
|
+ rec_len = chunk_size;
|
|
+ de->d_reclen = cpu_to_fs16(sb, chunk_size);
|
|
de->d_ino = 0;
|
|
goto got_it;
|
|
}
|
|
@@ -431,7 +433,7 @@ ufs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|
unsigned int offset = pos & ~PAGE_CACHE_MASK;
|
|
unsigned long n = pos >> PAGE_CACHE_SHIFT;
|
|
unsigned long npages = ufs_dir_pages(inode);
|
|
- unsigned chunk_mask = ~(UFS_SECTOR_SIZE - 1);
|
|
+ unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
|
|
int need_revalidate = filp->f_version != inode->i_version;
|
|
unsigned flags = UFS_SB(sb)->s_flags;
|
|
|
|
@@ -511,7 +513,7 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir,
|
|
struct super_block *sb = inode->i_sb;
|
|
struct address_space *mapping = page->mapping;
|
|
char *kaddr = page_address(page);
|
|
- unsigned from = ((char*)dir - kaddr) & ~(UFS_SECTOR_SIZE - 1);
|
|
+ unsigned from = ((char*)dir - kaddr) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
|
|
unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen);
|
|
struct ufs_dir_entry *pde = NULL;
|
|
struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from);
|
|
@@ -556,6 +558,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir)
|
|
struct super_block * sb = dir->i_sb;
|
|
struct address_space *mapping = inode->i_mapping;
|
|
struct page *page = grab_cache_page(mapping, 0);
|
|
+ const unsigned int chunk_size = UFS_SB(sb)->s_uspi->s_dirblksize;
|
|
struct ufs_dir_entry * de;
|
|
char *base;
|
|
int err;
|
|
@@ -563,7 +566,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir)
|
|
if (!page)
|
|
return -ENOMEM;
|
|
kmap(page);
|
|
- err = mapping->a_ops->prepare_write(NULL, page, 0, UFS_SECTOR_SIZE);
|
|
+ err = mapping->a_ops->prepare_write(NULL, page, 0, chunk_size);
|
|
if (err) {
|
|
unlock_page(page);
|
|
goto fail;
|
|
@@ -584,11 +587,11 @@ int ufs_make_empty(struct inode * inode, struct inode *dir)
|
|
((char *)de + fs16_to_cpu(sb, de->d_reclen));
|
|
de->d_ino = cpu_to_fs32(sb, dir->i_ino);
|
|
ufs_set_de_type(sb, de, dir->i_mode);
|
|
- de->d_reclen = cpu_to_fs16(sb, UFS_SECTOR_SIZE - UFS_DIR_REC_LEN(1));
|
|
+ de->d_reclen = cpu_to_fs16(sb, chunk_size - UFS_DIR_REC_LEN(1));
|
|
ufs_set_de_namlen(sb, de, 2);
|
|
strcpy (de->d_name, "..");
|
|
|
|
- err = ufs_commit_chunk(page, 0, UFS_SECTOR_SIZE);
|
|
+ err = ufs_commit_chunk(page, 0, chunk_size);
|
|
fail:
|
|
kunmap(page);
|
|
page_cache_release(page);
|
|
diff --git a/fs/ufs/super.c b/fs/ufs/super.c
|
|
index 8a8e938..209be95 100644
|
|
--- a/fs/ufs/super.c
|
|
+++ b/fs/ufs/super.c
|
|
@@ -649,7 +649,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|
kmalloc (sizeof(struct ufs_sb_private_info), GFP_KERNEL);
|
|
if (!uspi)
|
|
goto failed;
|
|
-
|
|
+ uspi->s_dirblksize = UFS_SECTOR_SIZE;
|
|
super_block_offset=UFS_SBLOCK;
|
|
|
|
/* Keep 2Gig file limit. Some UFS variants need to override
|
|
@@ -718,6 +718,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|
break;
|
|
|
|
case UFS_MOUNT_UFSTYPE_NEXTSTEP:
|
|
+ /*TODO: check may be we need set special dir block size?*/
|
|
UFSD("ufstype=nextstep\n");
|
|
uspi->s_fsize = block_size = 1024;
|
|
uspi->s_fmask = ~(1024 - 1);
|
|
@@ -733,6 +734,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|
break;
|
|
|
|
case UFS_MOUNT_UFSTYPE_NEXTSTEP_CD:
|
|
+ /*TODO: check may be we need set special dir block size?*/
|
|
UFSD("ufstype=nextstep-cd\n");
|
|
uspi->s_fsize = block_size = 2048;
|
|
uspi->s_fmask = ~(2048 - 1);
|
|
@@ -754,6 +756,7 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
|
|
uspi->s_fshift = 10;
|
|
uspi->s_sbsize = super_block_size = 2048;
|
|
uspi->s_sbbase = 0;
|
|
+ uspi->s_dirblksize = 1024;
|
|
flags |= UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
|
|
if (!(sb->s_flags & MS_RDONLY)) {
|
|
if (!silent)
|
|
diff --git a/include/asm-generic/page.h b/include/asm-generic/page.h
|
|
index b55052c..a96b5d9 100644
|
|
--- a/include/asm-generic/page.h
|
|
+++ b/include/asm-generic/page.h
|
|
@@ -4,51 +4,21 @@
|
|
#ifdef __KERNEL__
|
|
#ifndef __ASSEMBLY__
|
|
|
|
-#include <linux/log2.h>
|
|
+#include <linux/compiler.h>
|
|
|
|
-/*
|
|
- * non-const pure 2^n version of get_order
|
|
- * - the arch may override these in asm/bitops.h if they can be implemented
|
|
- * more efficiently than using the arch log2 routines
|
|
- * - we use the non-const log2() instead if the arch has defined one suitable
|
|
- */
|
|
-#ifndef ARCH_HAS_GET_ORDER
|
|
-static inline __attribute__((const))
|
|
-int __get_order(unsigned long size, int page_shift)
|
|
+/* Pure 2^n version of get_order */
|
|
+static __inline__ __attribute_const__ int get_order(unsigned long size)
|
|
{
|
|
-#if BITS_PER_LONG == 32 && defined(ARCH_HAS_ILOG2_U32)
|
|
- int order = __ilog2_u32(size) - page_shift;
|
|
- return order >= 0 ? order : 0;
|
|
-#elif BITS_PER_LONG == 64 && defined(ARCH_HAS_ILOG2_U64)
|
|
- int order = __ilog2_u64(size) - page_shift;
|
|
- return order >= 0 ? order : 0;
|
|
-#else
|
|
int order;
|
|
|
|
- size = (size - 1) >> (page_shift - 1);
|
|
+ size = (size - 1) >> (PAGE_SHIFT - 1);
|
|
order = -1;
|
|
do {
|
|
size >>= 1;
|
|
order++;
|
|
} while (size);
|
|
return order;
|
|
-#endif
|
|
}
|
|
-#endif
|
|
-
|
|
-/**
|
|
- * get_order - calculate log2(pages) to hold a block of the specified size
|
|
- * @n - size
|
|
- *
|
|
- * calculate allocation order based on the current page size
|
|
- * - this can be used to initialise global variables from constant data
|
|
- */
|
|
-#define get_order(n) \
|
|
-( \
|
|
- __builtin_constant_p(n) ? \
|
|
- ((n < (1UL << PAGE_SHIFT)) ? 0 : ilog2(n) - PAGE_SHIFT) : \
|
|
- __get_order(n, PAGE_SHIFT) \
|
|
- )
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __KERNEL__ */
|
|
diff --git a/include/asm-ia64/libata-portmap.h b/include/asm-ia64/libata-portmap.h
|
|
new file mode 100644
|
|
index 0000000..0e00c9a
|
|
--- /dev/null
|
|
+++ b/include/asm-ia64/libata-portmap.h
|
|
@@ -0,0 +1,12 @@
|
|
+#ifndef __ASM_IA64_LIBATA_PORTMAP_H
|
|
+#define __ASM_IA64_LIBATA_PORTMAP_H
|
|
+
|
|
+#define ATA_PRIMARY_CMD 0x1F0
|
|
+#define ATA_PRIMARY_CTL 0x3F6
|
|
+#define ATA_PRIMARY_IRQ(dev) isa_irq_to_vector(14)
|
|
+
|
|
+#define ATA_SECONDARY_CMD 0x170
|
|
+#define ATA_SECONDARY_CTL 0x376
|
|
+#define ATA_SECONDARY_IRQ(dev) isa_irq_to_vector(15)
|
|
+
|
|
+#endif
|
|
diff --git a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h
|
|
index 8da9609..d4dbbe5 100644
|
|
--- a/include/asm-x86_64/bitops.h
|
|
+++ b/include/asm-x86_64/bitops.h
|
|
@@ -7,7 +7,7 @@
|
|
|
|
#include <asm/alternative.h>
|
|
|
|
-#if __GNUC__ < 4 || __GNUC_MINOR__ < 1
|
|
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
|
|
/* Technically wrong, but this avoids compilation errors on some gcc
|
|
versions. */
|
|
#define ADDR "=m" (*(volatile long *) addr)
|
|
diff --git a/include/linux/atmarp.h b/include/linux/atmarp.h
|
|
index ee108f9..231f4bd 100644
|
|
--- a/include/linux/atmarp.h
|
|
+++ b/include/linux/atmarp.h
|
|
@@ -6,9 +6,7 @@
|
|
#ifndef _LINUX_ATMARP_H
|
|
#define _LINUX_ATMARP_H
|
|
|
|
-#ifdef __KERNEL__
|
|
#include <linux/types.h>
|
|
-#endif
|
|
#include <linux/atmapi.h>
|
|
#include <linux/atmioc.h>
|
|
|
|
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
|
|
index c1e82c5..2d956cd 100644
|
|
--- a/include/linux/binfmts.h
|
|
+++ b/include/linux/binfmts.h
|
|
@@ -59,6 +59,7 @@ struct linux_binfmt {
|
|
int (*load_shlib)(struct file *);
|
|
int (*core_dump)(long signr, struct pt_regs * regs, struct file * file);
|
|
unsigned long min_coredump; /* minimal dump size */
|
|
+ int hasvdso;
|
|
};
|
|
|
|
extern int register_binfmt(struct linux_binfmt *);
|
|
diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
|
|
index ea097dd..782abaf 100644
|
|
--- a/include/linux/lockdep.h
|
|
+++ b/include/linux/lockdep.h
|
|
@@ -8,6 +8,8 @@
|
|
#ifndef __LINUX_LOCKDEP_H
|
|
#define __LINUX_LOCKDEP_H
|
|
|
|
+struct task_struct;
|
|
+
|
|
#ifdef CONFIG_LOCKDEP
|
|
|
|
#include <linux/linkage.h>
|
|
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
|
|
index 3d1d210..d37f46a 100644
|
|
--- a/include/linux/pci_ids.h
|
|
+++ b/include/linux/pci_ids.h
|
|
@@ -1971,6 +1971,7 @@
|
|
#define PCI_DEVICE_ID_TOPIC_TP560 0x0000
|
|
|
|
#define PCI_VENDOR_ID_ENE 0x1524
|
|
+#define PCI_DEVICE_ID_ENE_CB712_SD 0x0550
|
|
#define PCI_DEVICE_ID_ENE_1211 0x1211
|
|
#define PCI_DEVICE_ID_ENE_1225 0x1225
|
|
#define PCI_DEVICE_ID_ENE_1410 0x1410
|
|
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h
|
|
index ebd42a3..6db9a4c 100644
|
|
--- a/include/linux/raid/bitmap.h
|
|
+++ b/include/linux/raid/bitmap.h
|
|
@@ -247,6 +247,7 @@ struct bitmap {
|
|
|
|
atomic_t pending_writes; /* pending writes to the bitmap file */
|
|
wait_queue_head_t write_wait;
|
|
+ wait_queue_head_t overflow_wait;
|
|
|
|
};
|
|
|
|
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h
|
|
index 98b21ad..523fb3a 100644
|
|
--- a/include/linux/sunrpc/svcsock.h
|
|
+++ b/include/linux/sunrpc/svcsock.h
|
|
@@ -63,7 +63,7 @@ struct svc_sock {
|
|
* Function prototypes.
|
|
*/
|
|
int svc_makesock(struct svc_serv *, int, unsigned short);
|
|
-void svc_delete_socket(struct svc_sock *);
|
|
+void svc_force_close_socket(struct svc_sock *);
|
|
int svc_recv(struct svc_rqst *, long);
|
|
int svc_send(struct svc_rqst *);
|
|
void svc_drop(struct svc_rqst *);
|
|
diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h
|
|
index 28967ed..d3a4f99 100644
|
|
--- a/include/linux/ufs_fs.h
|
|
+++ b/include/linux/ufs_fs.h
|
|
@@ -789,6 +789,7 @@ struct ufs_sb_private_info {
|
|
|
|
__u32 s_maxsymlinklen;/* upper limit on fast symlinks' size */
|
|
__s32 fs_magic; /* filesystem magic */
|
|
+ unsigned int s_dirblksize;
|
|
};
|
|
|
|
/*
|
|
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
|
|
index fc35e6b..0c78f7f 100644
|
|
--- a/include/linux/writeback.h
|
|
+++ b/include/linux/writeback.h
|
|
@@ -84,7 +84,7 @@ static inline void wait_on_inode(struct inode *inode)
|
|
int wakeup_pdflush(long nr_pages);
|
|
void laptop_io_completion(void);
|
|
void laptop_sync_completion(void);
|
|
-void throttle_vm_writeout(void);
|
|
+void throttle_vm_writeout(gfp_t gfp_mask);
|
|
|
|
/* These are exported to sysctl. */
|
|
extern int dirty_background_ratio;
|
|
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
|
|
index 509efd4..33c9eeb 100644
|
|
--- a/kernel/lockdep.c
|
|
+++ b/kernel/lockdep.c
|
|
@@ -2577,7 +2577,7 @@ out_restore:
|
|
raw_local_irq_restore(flags);
|
|
}
|
|
|
|
-void __init lockdep_init(void)
|
|
+void lockdep_init(void)
|
|
{
|
|
int i;
|
|
|
|
diff --git a/kernel/power/user.c b/kernel/power/user.c
|
|
index f7b7a78..38418cd 100644
|
|
--- a/kernel/power/user.c
|
|
+++ b/kernel/power/user.c
|
|
@@ -292,7 +292,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
|
|
break;
|
|
}
|
|
|
|
- if (pm_ops->prepare) {
|
|
+ if (pm_ops && pm_ops->prepare) {
|
|
error = pm_ops->prepare(PM_SUSPEND_MEM);
|
|
if (error)
|
|
goto OutS3;
|
|
@@ -311,7 +311,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
|
|
device_resume();
|
|
}
|
|
resume_console();
|
|
- if (pm_ops->finish)
|
|
+ if (pm_ops && pm_ops->finish)
|
|
pm_ops->finish(PM_SUSPEND_MEM);
|
|
|
|
OutS3:
|
|
@@ -322,20 +322,25 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
|
|
switch (arg) {
|
|
|
|
case PMOPS_PREPARE:
|
|
- if (pm_ops->prepare) {
|
|
+ if (pm_ops && pm_ops->prepare)
|
|
error = pm_ops->prepare(PM_SUSPEND_DISK);
|
|
- }
|
|
+ else
|
|
+ error = -ENOSYS;
|
|
break;
|
|
|
|
case PMOPS_ENTER:
|
|
kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
|
|
- error = pm_ops->enter(PM_SUSPEND_DISK);
|
|
+ if (pm_ops && pm_ops->enter)
|
|
+ error = pm_ops->enter(PM_SUSPEND_DISK);
|
|
+ else
|
|
+ error = -ENOSYS;
|
|
break;
|
|
|
|
case PMOPS_FINISH:
|
|
- if (pm_ops && pm_ops->finish) {
|
|
+ if (pm_ops && pm_ops->finish)
|
|
pm_ops->finish(PM_SUSPEND_DISK);
|
|
- }
|
|
+ else
|
|
+ error = -ENOSYS;
|
|
break;
|
|
|
|
default:
|
|
diff --git a/kernel/sched.c b/kernel/sched.c
|
|
index cca93cc..62db30c 100644
|
|
--- a/kernel/sched.c
|
|
+++ b/kernel/sched.c
|
|
@@ -3528,7 +3528,7 @@ need_resched_nonpreemptible:
|
|
}
|
|
}
|
|
next->sleep_type = SLEEP_NORMAL;
|
|
- if (dependent_sleeper(cpu, rq, next))
|
|
+ if (rq->nr_running == 1 && dependent_sleeper(cpu, rq, next))
|
|
next = rq->idle;
|
|
switch_tasks:
|
|
if (next == rq->idle)
|
|
@@ -3547,7 +3547,7 @@ switch_tasks:
|
|
|
|
sched_info_switch(prev, next);
|
|
if (likely(prev != next)) {
|
|
- next->timestamp = now;
|
|
+ next->timestamp = next->last_ran = now;
|
|
rq->nr_switches++;
|
|
rq->curr = next;
|
|
++*switch_count;
|
|
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
|
|
index 22504af..d9ef176 100644
|
|
--- a/kernel/time/clocksource.c
|
|
+++ b/kernel/time/clocksource.c
|
|
@@ -28,6 +28,7 @@
|
|
#include <linux/sysdev.h>
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
+#include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */
|
|
|
|
/* XXX - Would like a better way for initializing curr_clocksource */
|
|
extern struct clocksource clocksource_jiffies;
|
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
|
index 5c26818..330bff8 100644
|
|
--- a/lib/Kconfig.debug
|
|
+++ b/lib/Kconfig.debug
|
|
@@ -399,8 +399,8 @@ config LKDTM
|
|
|
|
config FAULT_INJECTION
|
|
bool "Fault-injection framework"
|
|
- depends on DEBUG_KERNEL
|
|
- depends on STACKTRACE
|
|
+ depends on DEBUG_KERNEL && STACKTRACE_SUPPORT
|
|
+ select STACKTRACE
|
|
select FRAME_POINTER
|
|
help
|
|
Provide fault-injection framework.
|
|
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
|
|
index 1062578..d6d57fb 100644
|
|
--- a/lib/swiotlb.c
|
|
+++ b/lib/swiotlb.c
|
|
@@ -750,7 +750,7 @@ swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sg,
|
|
|
|
for (i = 0; i < nelems; i++, sg++)
|
|
if (sg->dma_address != SG_ENT_PHYS_ADDRESS(sg))
|
|
- sync_single(hwdev, (void *) sg->dma_address,
|
|
+ sync_single(hwdev, phys_to_virt(sg->dma_address),
|
|
sg->dma_length, dir, target);
|
|
}
|
|
|
|
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
|
|
index cb362f7..36db012 100644
|
|
--- a/mm/hugetlb.c
|
|
+++ b/mm/hugetlb.c
|
|
@@ -389,6 +389,8 @@ void __unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start,
|
|
continue;
|
|
|
|
page = pte_page(pte);
|
|
+ if (pte_dirty(pte))
|
|
+ set_page_dirty(page);
|
|
list_add(&page->lru, &page_list);
|
|
}
|
|
spin_unlock(&mm->page_table_lock);
|
|
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
|
|
index be0efbd..17255ab 100644
|
|
--- a/mm/page-writeback.c
|
|
+++ b/mm/page-writeback.c
|
|
@@ -296,11 +296,21 @@ void balance_dirty_pages_ratelimited_nr(struct address_space *mapping,
|
|
}
|
|
EXPORT_SYMBOL(balance_dirty_pages_ratelimited_nr);
|
|
|
|
-void throttle_vm_writeout(void)
|
|
+void throttle_vm_writeout(gfp_t gfp_mask)
|
|
{
|
|
long background_thresh;
|
|
long dirty_thresh;
|
|
|
|
+ if ((gfp_mask & (__GFP_FS|__GFP_IO)) != (__GFP_FS|__GFP_IO)) {
|
|
+ /*
|
|
+ * The caller might hold locks which can prevent IO completion
|
|
+ * or progress in the filesystem. So we cannot just sit here
|
|
+ * waiting for IO to complete.
|
|
+ */
|
|
+ congestion_wait(WRITE, HZ/10);
|
|
+ return;
|
|
+ }
|
|
+
|
|
for ( ; ; ) {
|
|
get_dirty_limits(&background_thresh, &dirty_thresh, NULL);
|
|
|
|
@@ -317,7 +327,6 @@ void throttle_vm_writeout(void)
|
|
}
|
|
}
|
|
|
|
-
|
|
/*
|
|
* writeback at least _min_pages, and keep writing until the amount of dirty
|
|
* memory is less than the background threshold, or until we're all clean.
|
|
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
|
index 7430df6..5b4528a 100644
|
|
--- a/mm/vmscan.c
|
|
+++ b/mm/vmscan.c
|
|
@@ -949,7 +949,7 @@ static unsigned long shrink_zone(int priority, struct zone *zone,
|
|
}
|
|
}
|
|
|
|
- throttle_vm_writeout();
|
|
+ throttle_vm_writeout(sc->gfp_mask);
|
|
|
|
atomic_dec(&zone->reclaim_in_progress);
|
|
return nr_reclaimed;
|
|
diff --git a/net/atm/common.c b/net/atm/common.c
|
|
index fbabff4..a2878e9 100644
|
|
--- a/net/atm/common.c
|
|
+++ b/net/atm/common.c
|
|
@@ -816,7 +816,8 @@ static void __exit atm_exit(void)
|
|
proto_unregister(&vcc_proto);
|
|
}
|
|
|
|
-module_init(atm_init);
|
|
+subsys_initcall(atm_init);
|
|
+
|
|
module_exit(atm_exit);
|
|
|
|
MODULE_LICENSE("GPL");
|
|
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
|
|
index 0017ccb..024ae56 100644
|
|
--- a/net/ipv4/igmp.c
|
|
+++ b/net/ipv4/igmp.c
|
|
@@ -455,6 +455,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
|
|
skb = add_grhead(skb, pmc, type, &pgr);
|
|
first = 0;
|
|
}
|
|
+ if (!skb)
|
|
+ return NULL;
|
|
psrc = (__be32 *)skb_put(skb, sizeof(__be32));
|
|
*psrc = psf->sf_inaddr;
|
|
scount++; stotal++;
|
|
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c
|
|
index f0319e5..6714bd1 100644
|
|
--- a/net/ipv4/netfilter/ipt_REJECT.c
|
|
+++ b/net/ipv4/netfilter/ipt_REJECT.c
|
|
@@ -79,6 +79,10 @@ static void send_reset(struct sk_buff *oldskb, int hook)
|
|
nskb->mark = 0;
|
|
skb_init_secmark(nskb);
|
|
|
|
+ skb_shinfo(nskb)->gso_size = 0;
|
|
+ skb_shinfo(nskb)->gso_segs = 0;
|
|
+ skb_shinfo(nskb)->gso_type = 0;
|
|
+
|
|
tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl);
|
|
|
|
/* Swap source and dest */
|
|
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
|
|
index b67e0dd..ebe9d0d 100644
|
|
--- a/net/ipv4/tcp.c
|
|
+++ b/net/ipv4/tcp.c
|
|
@@ -2266,12 +2266,12 @@ void tcp_free_md5sig_pool(void)
|
|
{
|
|
struct tcp_md5sig_pool **pool = NULL;
|
|
|
|
- spin_lock(&tcp_md5sig_pool_lock);
|
|
+ spin_lock_bh(&tcp_md5sig_pool_lock);
|
|
if (--tcp_md5sig_users == 0) {
|
|
pool = tcp_md5sig_pool;
|
|
tcp_md5sig_pool = NULL;
|
|
}
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
if (pool)
|
|
__tcp_free_md5sig_pool(pool);
|
|
}
|
|
@@ -2314,36 +2314,36 @@ struct tcp_md5sig_pool **tcp_alloc_md5sig_pool(void)
|
|
int alloc = 0;
|
|
|
|
retry:
|
|
- spin_lock(&tcp_md5sig_pool_lock);
|
|
+ spin_lock_bh(&tcp_md5sig_pool_lock);
|
|
pool = tcp_md5sig_pool;
|
|
if (tcp_md5sig_users++ == 0) {
|
|
alloc = 1;
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
} else if (!pool) {
|
|
tcp_md5sig_users--;
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
cpu_relax();
|
|
goto retry;
|
|
} else
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
|
|
if (alloc) {
|
|
/* we cannot hold spinlock here because this may sleep. */
|
|
struct tcp_md5sig_pool **p = __tcp_alloc_md5sig_pool();
|
|
- spin_lock(&tcp_md5sig_pool_lock);
|
|
+ spin_lock_bh(&tcp_md5sig_pool_lock);
|
|
if (!p) {
|
|
tcp_md5sig_users--;
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
return NULL;
|
|
}
|
|
pool = tcp_md5sig_pool;
|
|
if (pool) {
|
|
/* oops, it has already been assigned. */
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
__tcp_free_md5sig_pool(p);
|
|
} else {
|
|
tcp_md5sig_pool = pool = p;
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
}
|
|
}
|
|
return pool;
|
|
@@ -2354,11 +2354,11 @@ EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
|
|
struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu)
|
|
{
|
|
struct tcp_md5sig_pool **p;
|
|
- spin_lock(&tcp_md5sig_pool_lock);
|
|
+ spin_lock_bh(&tcp_md5sig_pool_lock);
|
|
p = tcp_md5sig_pool;
|
|
if (p)
|
|
tcp_md5sig_users++;
|
|
- spin_unlock(&tcp_md5sig_pool_lock);
|
|
+ spin_unlock_bh(&tcp_md5sig_pool_lock);
|
|
return (p ? *per_cpu_ptr(p, cpu) : NULL);
|
|
}
|
|
|
|
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
|
|
index 4a3889d..aa54ad4 100644
|
|
--- a/net/ipv4/tcp_minisocks.c
|
|
+++ b/net/ipv4/tcp_minisocks.c
|
|
@@ -381,7 +381,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
|
|
if (newsk != NULL) {
|
|
const struct inet_request_sock *ireq = inet_rsk(req);
|
|
struct tcp_request_sock *treq = tcp_rsk(req);
|
|
- struct inet_connection_sock *newicsk = inet_csk(sk);
|
|
+ struct inet_connection_sock *newicsk = inet_csk(newsk);
|
|
struct tcp_sock *newtp;
|
|
|
|
/* Now setup tcp_sock */
|
|
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
|
|
index 975f447..1951eaa 100644
|
|
--- a/net/ipv4/tcp_output.c
|
|
+++ b/net/ipv4/tcp_output.c
|
|
@@ -481,7 +481,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|
/* RFC1323: The window in SYN & SYN/ACK segments
|
|
* is never scaled.
|
|
*/
|
|
- th->window = htons(tp->rcv_wnd);
|
|
+ th->window = htons(min(tp->rcv_wnd, 65535U));
|
|
} else {
|
|
th->window = htons(tcp_select_window(sk));
|
|
}
|
|
@@ -965,7 +965,8 @@ static inline unsigned int tcp_cwnd_test(struct tcp_sock *tp, struct sk_buff *sk
|
|
u32 in_flight, cwnd;
|
|
|
|
/* Don't be strict about the congestion window for the final FIN. */
|
|
- if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
|
|
+ if ((TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN) &&
|
|
+ tcp_skb_pcount(skb) == 1)
|
|
return 1;
|
|
|
|
in_flight = tcp_packets_in_flight(tp);
|
|
@@ -2159,7 +2160,7 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
|
}
|
|
|
|
/* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */
|
|
- th->window = htons(req->rcv_wnd);
|
|
+ th->window = htons(min(req->rcv_wnd, 65535U));
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
tcp_syn_build_options((__be32 *)(th + 1), dst_metric(dst, RTAX_ADVMSS), ireq->tstamp_ok,
|
|
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c
|
|
index e23c21d..21ed667 100644
|
|
--- a/net/ipv4/xfrm4_mode_tunnel.c
|
|
+++ b/net/ipv4/xfrm4_mode_tunnel.c
|
|
@@ -84,6 +84,7 @@ static int xfrm4_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
|
|
(err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
|
|
goto out;
|
|
|
|
+ iph = skb->nh.iph;
|
|
if (x->props.flags & XFRM_STATE_DECAP_DSCP)
|
|
ipv4_copy_dscp(iph, skb->h.ipiph);
|
|
if (!(x->props.flags & XFRM_STATE_NOECN))
|
|
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
|
|
index e385469..58cb669 100644
|
|
--- a/net/ipv6/addrconf.c
|
|
+++ b/net/ipv6/addrconf.c
|
|
@@ -469,6 +469,8 @@ static void dev_forward_change(struct inet6_dev *idev)
|
|
ipv6_dev_mc_dec(dev, &addr);
|
|
}
|
|
for (ifa=idev->addr_list; ifa; ifa=ifa->if_next) {
|
|
+ if (ifa->flags&IFA_F_TENTATIVE)
|
|
+ continue;
|
|
if (idev->cnf.forwarding)
|
|
addrconf_join_anycast(ifa);
|
|
else
|
|
diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c
|
|
index a960476..fe0c895 100644
|
|
--- a/net/ipv6/anycast.c
|
|
+++ b/net/ipv6/anycast.c
|
|
@@ -462,6 +462,7 @@ static inline struct ifacaddr6 *ac6_get_first(struct seq_file *seq)
|
|
break;
|
|
}
|
|
read_unlock_bh(&idev->lock);
|
|
+ in6_dev_put(idev);
|
|
}
|
|
return im;
|
|
}
|
|
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
|
|
index b7e5bae..ba13f74 100644
|
|
--- a/net/ipv6/inet6_hashtables.c
|
|
+++ b/net/ipv6/inet6_hashtables.c
|
|
@@ -172,7 +172,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
|
|
const struct in6_addr *saddr = &np->daddr;
|
|
const int dif = sk->sk_bound_dev_if;
|
|
const __portpair ports = INET_COMBINED_PORTS(inet->dport, lport);
|
|
- const unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr,
|
|
+ const unsigned int hash = inet6_ehashfn(daddr, lport, saddr,
|
|
inet->dport);
|
|
struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash);
|
|
struct sock *sk2;
|
|
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
|
|
index 352690e..23db88e 100644
|
|
--- a/net/ipv6/ipv6_sockglue.c
|
|
+++ b/net/ipv6/ipv6_sockglue.c
|
|
@@ -796,11 +796,15 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|
EXPORT_SYMBOL(compat_ipv6_setsockopt);
|
|
#endif
|
|
|
|
-static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr,
|
|
+static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt,
|
|
char __user *optval, int len)
|
|
{
|
|
- if (!hdr)
|
|
+ struct ipv6_opt_hdr *hdr;
|
|
+
|
|
+ if (!opt || !opt->hopopt)
|
|
return 0;
|
|
+ hdr = opt->hopopt;
|
|
+
|
|
len = min_t(int, len, ipv6_optlen(hdr));
|
|
if (copy_to_user(optval, hdr, ipv6_optlen(hdr)))
|
|
return -EFAULT;
|
|
@@ -941,7 +945,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|
{
|
|
|
|
lock_sock(sk);
|
|
- len = ipv6_getsockopt_sticky(sk, np->opt->hopopt,
|
|
+ len = ipv6_getsockopt_sticky(sk, np->opt,
|
|
optval, len);
|
|
release_sock(sk);
|
|
return put_user(len, optlen);
|
|
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
|
|
index 882cde4..e3ec216 100644
|
|
--- a/net/ipv6/mcast.c
|
|
+++ b/net/ipv6/mcast.c
|
|
@@ -1582,6 +1582,8 @@ static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
|
|
skb = add_grhead(skb, pmc, type, &pgr);
|
|
first = 0;
|
|
}
|
|
+ if (!skb)
|
|
+ return NULL;
|
|
psrc = (struct in6_addr *)skb_put(skb, sizeof(*psrc));
|
|
*psrc = psf->sf_addr;
|
|
scount++; stotal++;
|
|
diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c
|
|
index 76c6615..89f283c 100644
|
|
--- a/net/ipx/af_ipx.c
|
|
+++ b/net/ipx/af_ipx.c
|
|
@@ -2035,19 +2035,27 @@ static void __exit ipx_proto_finito(void)
|
|
|
|
ipxitf_cleanup();
|
|
|
|
- unregister_snap_client(pSNAP_datalink);
|
|
- pSNAP_datalink = NULL;
|
|
+ if (pSNAP_datalink) {
|
|
+ unregister_snap_client(pSNAP_datalink);
|
|
+ pSNAP_datalink = NULL;
|
|
+ }
|
|
|
|
- unregister_8022_client(p8022_datalink);
|
|
- p8022_datalink = NULL;
|
|
+ if (p8022_datalink) {
|
|
+ unregister_8022_client(p8022_datalink);
|
|
+ p8022_datalink = NULL;
|
|
+ }
|
|
|
|
dev_remove_pack(&ipx_8023_packet_type);
|
|
- destroy_8023_client(p8023_datalink);
|
|
- p8023_datalink = NULL;
|
|
+ if (p8023_datalink) {
|
|
+ destroy_8023_client(p8023_datalink);
|
|
+ p8023_datalink = NULL;
|
|
+ }
|
|
|
|
dev_remove_pack(&ipx_dix_packet_type);
|
|
- destroy_EII_client(pEII_datalink);
|
|
- pEII_datalink = NULL;
|
|
+ if (pEII_datalink) {
|
|
+ destroy_EII_client(pEII_datalink);
|
|
+ pEII_datalink = NULL;
|
|
+ }
|
|
|
|
proto_unregister(&ipx_proto);
|
|
sock_unregister(ipx_family_ops.family);
|
|
diff --git a/net/key/af_key.c b/net/key/af_key.c
|
|
index 5dd5094..3b4a1f4 100644
|
|
--- a/net/key/af_key.c
|
|
+++ b/net/key/af_key.c
|
|
@@ -2297,16 +2297,17 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
|
|
&sel, tmp.security, 1);
|
|
security_xfrm_policy_free(&tmp);
|
|
|
|
- xfrm_audit_log(audit_get_loginuid(current->audit_context), 0,
|
|
- AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL);
|
|
-
|
|
if (xp == NULL)
|
|
return -ENOENT;
|
|
|
|
- err = 0;
|
|
+ err = security_xfrm_policy_delete(xp);
|
|
|
|
- if ((err = security_xfrm_policy_delete(xp)))
|
|
+ xfrm_audit_log(audit_get_loginuid(current->audit_context), 0,
|
|
+ AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL);
|
|
+
|
|
+ if (err)
|
|
goto out;
|
|
+
|
|
c.seq = hdr->sadb_msg_seq;
|
|
c.pid = hdr->sadb_msg_pid;
|
|
c.event = XFRM_MSG_DELPOLICY;
|
|
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
|
|
index d1505dd..24c1d29 100644
|
|
--- a/net/netfilter/nfnetlink_log.c
|
|
+++ b/net/netfilter/nfnetlink_log.c
|
|
@@ -217,6 +217,11 @@ _instance_destroy2(struct nfulnl_instance *inst, int lock)
|
|
|
|
spin_lock_bh(&inst->lock);
|
|
if (inst->skb) {
|
|
+ /* timer "holds" one reference (we have one more) */
|
|
+ if (timer_pending(&inst->timer)) {
|
|
+ del_timer(&inst->timer);
|
|
+ instance_put(inst);
|
|
+ }
|
|
if (inst->qlen)
|
|
__nfulnl_send(inst);
|
|
if (inst->skb) {
|
|
@@ -363,9 +368,6 @@ __nfulnl_send(struct nfulnl_instance *inst)
|
|
{
|
|
int status;
|
|
|
|
- if (timer_pending(&inst->timer))
|
|
- del_timer(&inst->timer);
|
|
-
|
|
if (!inst->skb)
|
|
return 0;
|
|
|
|
@@ -392,6 +394,8 @@ static void nfulnl_timer(unsigned long data)
|
|
UDEBUG("timer function called, flushing buffer\n");
|
|
|
|
spin_lock_bh(&inst->lock);
|
|
+ if (timer_pending(&inst->timer)) /* is it always true or false here? */
|
|
+ del_timer(&inst->timer);
|
|
__nfulnl_send(inst);
|
|
instance_put(inst);
|
|
spin_unlock_bh(&inst->lock);
|
|
@@ -689,6 +693,11 @@ nfulnl_log_packet(unsigned int pf,
|
|
* enough room in the skb left. flush to userspace. */
|
|
UDEBUG("flushing old skb\n");
|
|
|
|
+ /* timer "holds" one reference (we have another one) */
|
|
+ if (timer_pending(&inst->timer)) {
|
|
+ del_timer(&inst->timer);
|
|
+ instance_put(inst);
|
|
+ }
|
|
__nfulnl_send(inst);
|
|
|
|
if (!(inst->skb = nfulnl_alloc_skb(nlbufsiz, size))) {
|
|
diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c
|
|
index 3946ec3..76e59e9 100644
|
|
--- a/net/sunrpc/pmap_clnt.c
|
|
+++ b/net/sunrpc/pmap_clnt.c
|
|
@@ -62,7 +62,10 @@ static inline void pmap_map_free(struct portmap_args *map)
|
|
|
|
static void pmap_map_release(void *data)
|
|
{
|
|
- pmap_map_free(data);
|
|
+ struct portmap_args *map = data;
|
|
+
|
|
+ xprt_put(map->pm_xprt);
|
|
+ pmap_map_free(map);
|
|
}
|
|
|
|
static const struct rpc_call_ops pmap_getport_ops = {
|
|
@@ -133,7 +136,7 @@ void rpc_getport(struct rpc_task *task)
|
|
status = -EIO;
|
|
child = rpc_run_task(pmap_clnt, RPC_TASK_ASYNC, &pmap_getport_ops, map);
|
|
if (IS_ERR(child))
|
|
- goto bailout;
|
|
+ goto bailout_nofree;
|
|
rpc_put_task(child);
|
|
|
|
task->tk_xprt->stat.bind_count++;
|
|
@@ -222,7 +225,6 @@ static void pmap_getport_done(struct rpc_task *child, void *data)
|
|
child->tk_pid, status, map->pm_port);
|
|
|
|
pmap_wake_portmap_waiters(xprt, status);
|
|
- xprt_put(xprt);
|
|
}
|
|
|
|
/**
|
|
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
|
|
index 4c16112..baf27a9 100644
|
|
--- a/net/sunrpc/svc.c
|
|
+++ b/net/sunrpc/svc.c
|
|
@@ -79,7 +79,11 @@ svc_pool_map_choose_mode(void)
|
|
* x86_64 kernel on Xeons. In this case we
|
|
* want to divide the pools on cpu boundaries.
|
|
*/
|
|
- return SVC_POOL_PERCPU;
|
|
+ /* actually, unless your IRQs round-robin nicely,
|
|
+ * this turns out to be really bad, so just
|
|
+ * go GLOBAL for now until a better fix can be developped
|
|
+ */
|
|
+ return SVC_POOL_GLOBAL;
|
|
}
|
|
|
|
/* default: one global pool */
|
|
@@ -367,6 +371,7 @@ void
|
|
svc_destroy(struct svc_serv *serv)
|
|
{
|
|
struct svc_sock *svsk;
|
|
+ struct svc_sock *tmp;
|
|
|
|
dprintk("RPC: svc_destroy(%s, %d)\n",
|
|
serv->sv_program->pg_name,
|
|
@@ -382,22 +387,18 @@ svc_destroy(struct svc_serv *serv)
|
|
|
|
del_timer_sync(&serv->sv_temptimer);
|
|
|
|
- while (!list_empty(&serv->sv_tempsocks)) {
|
|
- svsk = list_entry(serv->sv_tempsocks.next,
|
|
- struct svc_sock,
|
|
- sk_list);
|
|
- svc_delete_socket(svsk);
|
|
- }
|
|
+ list_for_each_entry_safe(svsk, tmp, &serv->sv_tempsocks, sk_list)
|
|
+ svc_force_close_socket(svsk);
|
|
+
|
|
if (serv->sv_shutdown)
|
|
serv->sv_shutdown(serv);
|
|
|
|
- while (!list_empty(&serv->sv_permsocks)) {
|
|
- svsk = list_entry(serv->sv_permsocks.next,
|
|
- struct svc_sock,
|
|
- sk_list);
|
|
- svc_delete_socket(svsk);
|
|
- }
|
|
-
|
|
+ list_for_each_entry_safe(svsk, tmp, &serv->sv_permsocks, sk_list)
|
|
+ svc_force_close_socket(svsk);
|
|
+
|
|
+ BUG_ON(!list_empty(&serv->sv_permsocks));
|
|
+ BUG_ON(!list_empty(&serv->sv_tempsocks));
|
|
+
|
|
cache_clean_deferred(serv);
|
|
|
|
/* Unregister service with the portmapper */
|
|
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
|
|
index ff1f8bf..cd296a5 100644
|
|
--- a/net/sunrpc/svcsock.c
|
|
+++ b/net/sunrpc/svcsock.c
|
|
@@ -62,6 +62,12 @@
|
|
* after a clear, the socket must be read/accepted
|
|
* if this succeeds, it must be set again.
|
|
* SK_CLOSE can set at any time. It is never cleared.
|
|
+ * sk_inuse contains a bias of '1' until SK_DEAD is set.
|
|
+ * so when sk_inuse hits zero, we know the socket is dead
|
|
+ * and no-one is using it.
|
|
+ * SK_DEAD can only be set while SK_BUSY is held which ensures
|
|
+ * no other thread will be using the socket or will try to
|
|
+ * set SK_DEAD.
|
|
*
|
|
*/
|
|
|
|
@@ -70,9 +76,11 @@
|
|
|
|
static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
|
|
int *errp, int pmap_reg);
|
|
+static void svc_delete_socket(struct svc_sock *svsk);
|
|
static void svc_udp_data_ready(struct sock *, int);
|
|
static int svc_udp_recvfrom(struct svc_rqst *);
|
|
static int svc_udp_sendto(struct svc_rqst *);
|
|
+static void svc_close_socket(struct svc_sock *svsk);
|
|
|
|
static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk);
|
|
static int svc_deferred_recv(struct svc_rqst *rqstp);
|
|
@@ -329,8 +337,9 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
|
|
static inline void
|
|
svc_sock_put(struct svc_sock *svsk)
|
|
{
|
|
- if (atomic_dec_and_test(&svsk->sk_inuse) &&
|
|
- test_bit(SK_DEAD, &svsk->sk_flags)) {
|
|
+ if (atomic_dec_and_test(&svsk->sk_inuse)) {
|
|
+ BUG_ON(! test_bit(SK_DEAD, &svsk->sk_flags));
|
|
+
|
|
dprintk("svc: releasing dead socket\n");
|
|
if (svsk->sk_sock->file)
|
|
sockfd_put(svsk->sk_sock);
|
|
@@ -520,7 +529,7 @@ svc_sock_names(char *buf, struct svc_serv *serv, char *toclose)
|
|
|
|
if (!serv)
|
|
return 0;
|
|
- spin_lock(&serv->sv_lock);
|
|
+ spin_lock_bh(&serv->sv_lock);
|
|
list_for_each_entry(svsk, &serv->sv_permsocks, sk_list) {
|
|
int onelen = one_sock_name(buf+len, svsk);
|
|
if (toclose && strcmp(toclose, buf+len) == 0)
|
|
@@ -528,12 +537,12 @@ svc_sock_names(char *buf, struct svc_serv *serv, char *toclose)
|
|
else
|
|
len += onelen;
|
|
}
|
|
- spin_unlock(&serv->sv_lock);
|
|
+ spin_unlock_bh(&serv->sv_lock);
|
|
if (closesk)
|
|
/* Should unregister with portmap, but you cannot
|
|
* unregister just one protocol...
|
|
*/
|
|
- svc_delete_socket(closesk);
|
|
+ svc_close_socket(closesk);
|
|
else if (toclose)
|
|
return -ENOENT;
|
|
return len;
|
|
@@ -683,6 +692,11 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
|
return svc_deferred_recv(rqstp);
|
|
}
|
|
|
|
+ if (test_bit(SK_CLOSE, &svsk->sk_flags)) {
|
|
+ svc_delete_socket(svsk);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
clear_bit(SK_DATA, &svsk->sk_flags);
|
|
while ((skb = skb_recv_datagram(svsk->sk_sk, 0, 1, &err)) == NULL) {
|
|
if (err == -EAGAIN) {
|
|
@@ -1176,7 +1190,8 @@ svc_tcp_sendto(struct svc_rqst *rqstp)
|
|
rqstp->rq_sock->sk_server->sv_name,
|
|
(sent<0)?"got error":"sent only",
|
|
sent, xbufp->len);
|
|
- svc_delete_socket(rqstp->rq_sock);
|
|
+ set_bit(SK_CLOSE, &rqstp->rq_sock->sk_flags);
|
|
+ svc_sock_enqueue(rqstp->rq_sock);
|
|
sent = -EAGAIN;
|
|
}
|
|
return sent;
|
|
@@ -1495,7 +1510,7 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
|
|
svsk->sk_odata = inet->sk_data_ready;
|
|
svsk->sk_owspace = inet->sk_write_space;
|
|
svsk->sk_server = serv;
|
|
- atomic_set(&svsk->sk_inuse, 0);
|
|
+ atomic_set(&svsk->sk_inuse, 1);
|
|
svsk->sk_lastrecv = get_seconds();
|
|
spin_lock_init(&svsk->sk_defer_lock);
|
|
INIT_LIST_HEAD(&svsk->sk_deferred);
|
|
@@ -1618,7 +1633,7 @@ bummer:
|
|
/*
|
|
* Remove a dead socket
|
|
*/
|
|
-void
|
|
+static void
|
|
svc_delete_socket(struct svc_sock *svsk)
|
|
{
|
|
struct svc_serv *serv;
|
|
@@ -1644,19 +1659,42 @@ svc_delete_socket(struct svc_sock *svsk)
|
|
* while still attached to a queue, the queue itself
|
|
* is about to be destroyed (in svc_destroy).
|
|
*/
|
|
- if (!test_and_set_bit(SK_DEAD, &svsk->sk_flags))
|
|
+ if (!test_and_set_bit(SK_DEAD, &svsk->sk_flags)) {
|
|
+ BUG_ON(atomic_read(&svsk->sk_inuse)<2);
|
|
+ atomic_dec(&svsk->sk_inuse);
|
|
if (test_bit(SK_TEMP, &svsk->sk_flags))
|
|
serv->sv_tmpcnt--;
|
|
+ }
|
|
|
|
- /* This atomic_inc should be needed - svc_delete_socket
|
|
- * should have the semantic of dropping a reference.
|
|
- * But it doesn't yet....
|
|
- */
|
|
- atomic_inc(&svsk->sk_inuse);
|
|
spin_unlock_bh(&serv->sv_lock);
|
|
+}
|
|
+
|
|
+static void svc_close_socket(struct svc_sock *svsk)
|
|
+{
|
|
+ set_bit(SK_CLOSE, &svsk->sk_flags);
|
|
+ if (test_and_set_bit(SK_BUSY, &svsk->sk_flags))
|
|
+ /* someone else will have to effect the close */
|
|
+ return;
|
|
+
|
|
+ atomic_inc(&svsk->sk_inuse);
|
|
+ svc_delete_socket(svsk);
|
|
+ clear_bit(SK_BUSY, &svsk->sk_flags);
|
|
svc_sock_put(svsk);
|
|
}
|
|
|
|
+void svc_force_close_socket(struct svc_sock *svsk)
|
|
+{
|
|
+ set_bit(SK_CLOSE, &svsk->sk_flags);
|
|
+ if (test_bit(SK_BUSY, &svsk->sk_flags)) {
|
|
+ /* Waiting to be processed, but no threads left,
|
|
+ * So just remove it from the waiting list
|
|
+ */
|
|
+ list_del_init(&svsk->sk_ready);
|
|
+ clear_bit(SK_BUSY, &svsk->sk_flags);
|
|
+ }
|
|
+ svc_close_socket(svsk);
|
|
+}
|
|
+
|
|
/*
|
|
* Make a socket for nfsd and lockd
|
|
*/
|
|
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
|
|
index b7e537f..9704e05 100644
|
|
--- a/net/xfrm/xfrm_policy.c
|
|
+++ b/net/xfrm/xfrm_policy.c
|
|
@@ -1997,9 +1997,14 @@ void xfrm_audit_log(uid_t auid, u32 sid, int type, int result,
|
|
if (audit_enabled == 0)
|
|
return;
|
|
|
|
+ BUG_ON((type == AUDIT_MAC_IPSEC_ADDSA ||
|
|
+ type == AUDIT_MAC_IPSEC_DELSA) && !x);
|
|
+ BUG_ON((type == AUDIT_MAC_IPSEC_ADDSPD ||
|
|
+ type == AUDIT_MAC_IPSEC_DELSPD) && !xp);
|
|
+
|
|
audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC, type);
|
|
if (audit_buf == NULL)
|
|
- return;
|
|
+ return;
|
|
|
|
switch(type) {
|
|
case AUDIT_MAC_IPSEC_ADDSA:
|
|
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
|
|
index 82f36d3..24d15f2 100644
|
|
--- a/net/xfrm/xfrm_user.c
|
|
+++ b/net/xfrm/xfrm_user.c
|
|
@@ -1273,10 +1273,6 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, tmp.security, delete);
|
|
security_xfrm_policy_free(&tmp);
|
|
}
|
|
- if (delete)
|
|
- xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid,
|
|
- AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL);
|
|
-
|
|
if (xp == NULL)
|
|
return -ENOENT;
|
|
|
|
@@ -1292,8 +1288,14 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
MSG_DONTWAIT);
|
|
}
|
|
} else {
|
|
- if ((err = security_xfrm_policy_delete(xp)) != 0)
|
|
+ err = security_xfrm_policy_delete(xp);
|
|
+
|
|
+ xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid,
|
|
+ AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL);
|
|
+
|
|
+ if (err != 0)
|
|
goto out;
|
|
+
|
|
c.data.byid = p->index;
|
|
c.event = nlh->nlmsg_type;
|
|
c.seq = nlh->nlmsg_seq;
|
|
@@ -1555,14 +1557,13 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
struct xfrm_usersa_info *p = &ue->state;
|
|
|
|
x = xfrm_state_lookup(&p->id.daddr, p->id.spi, p->id.proto, p->family);
|
|
- err = -ENOENT;
|
|
|
|
+ err = -ENOENT;
|
|
if (x == NULL)
|
|
return err;
|
|
|
|
- err = -EINVAL;
|
|
-
|
|
spin_lock_bh(&x->lock);
|
|
+ err = -EINVAL;
|
|
if (x->km.state != XFRM_STATE_VALID)
|
|
goto out;
|
|
km_state_expired(x, ue->hard, current->pid);
|
|
@@ -1572,6 +1573,7 @@ static int xfrm_add_sa_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid,
|
|
AUDIT_MAC_IPSEC_DELSA, 1, NULL, x);
|
|
}
|
|
+ err = 0;
|
|
out:
|
|
spin_unlock_bh(&x->lock);
|
|
xfrm_state_put(x);
|
|
diff --git a/security/keys/key.c b/security/keys/key.c
|
|
index ac9326c..700400d 100644
|
|
--- a/security/keys/key.c
|
|
+++ b/security/keys/key.c
|
|
@@ -188,6 +188,7 @@ static inline void key_alloc_serial(struct key *key)
|
|
|
|
spin_lock(&key_serial_lock);
|
|
|
|
+attempt_insertion:
|
|
parent = NULL;
|
|
p = &key_serial_tree.rb_node;
|
|
|
|
@@ -202,39 +203,33 @@ static inline void key_alloc_serial(struct key *key)
|
|
else
|
|
goto serial_exists;
|
|
}
|
|
- goto insert_here;
|
|
+
|
|
+ /* we've found a suitable hole - arrange for this key to occupy it */
|
|
+ rb_link_node(&key->serial_node, parent, p);
|
|
+ rb_insert_color(&key->serial_node, &key_serial_tree);
|
|
+
|
|
+ spin_unlock(&key_serial_lock);
|
|
+ return;
|
|
|
|
/* we found a key with the proposed serial number - walk the tree from
|
|
* that point looking for the next unused serial number */
|
|
serial_exists:
|
|
for (;;) {
|
|
key->serial++;
|
|
- if (key->serial < 2)
|
|
- key->serial = 2;
|
|
-
|
|
- if (!rb_parent(parent))
|
|
- p = &key_serial_tree.rb_node;
|
|
- else if (rb_parent(parent)->rb_left == parent)
|
|
- p = &(rb_parent(parent)->rb_left);
|
|
- else
|
|
- p = &(rb_parent(parent)->rb_right);
|
|
+ if (key->serial < 3) {
|
|
+ key->serial = 3;
|
|
+ goto attempt_insertion;
|
|
+ }
|
|
|
|
parent = rb_next(parent);
|
|
if (!parent)
|
|
- break;
|
|
+ goto attempt_insertion;
|
|
|
|
xkey = rb_entry(parent, struct key, serial_node);
|
|
if (key->serial < xkey->serial)
|
|
- goto insert_here;
|
|
+ goto attempt_insertion;
|
|
}
|
|
|
|
- /* we've found a suitable hole - arrange for this key to occupy it */
|
|
-insert_here:
|
|
- rb_link_node(&key->serial_node, parent, p);
|
|
- rb_insert_color(&key->serial_node, &key_serial_tree);
|
|
-
|
|
- spin_unlock(&key_serial_lock);
|
|
-
|
|
} /* end key_alloc_serial() */
|
|
|
|
/*****************************************************************************/
|
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
|
index 1a7e821..77f8ec7 100644
|
|
--- a/sound/pci/hda/hda_intel.c
|
|
+++ b/sound/pci/hda/hda_intel.c
|
|
@@ -199,7 +199,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
|
|
|
|
/* STATESTS int mask: SD2,SD1,SD0 */
|
|
#define STATESTS_INT_MASK 0x07
|
|
-#define AZX_MAX_CODECS 4
|
|
+#define AZX_MAX_CODECS 3
|
|
|
|
/* SD_CTL bits */
|
|
#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
|
|
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
|
|
index 19bdcc7..1bd9af6 100644
|
|
--- a/sound/usb/usbaudio.c
|
|
+++ b/sound/usb/usbaudio.c
|
|
@@ -186,6 +186,7 @@ struct snd_usb_substream {
|
|
u64 formats; /* format bitmasks (all or'ed) */
|
|
unsigned int num_formats; /* number of supported audio formats (list) */
|
|
struct list_head fmt_list; /* format list */
|
|
+ struct snd_pcm_hw_constraint_list rate_list; /* limited rates */
|
|
spinlock_t lock;
|
|
|
|
struct snd_urb_ops ops; /* callbacks (must be filled at init) */
|
|
@@ -1810,28 +1811,33 @@ static int check_hw_params_convention(struct snd_usb_substream *subs)
|
|
static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
|
|
struct snd_usb_substream *subs)
|
|
{
|
|
- struct list_head *p;
|
|
- struct snd_pcm_hw_constraint_list constraints_rates;
|
|
+ struct audioformat *fp;
|
|
+ int count = 0, needs_knot = 0;
|
|
int err;
|
|
|
|
- list_for_each(p, &subs->fmt_list) {
|
|
- struct audioformat *fp;
|
|
- fp = list_entry(p, struct audioformat, list);
|
|
-
|
|
- if (!fp->needs_knot)
|
|
- continue;
|
|
-
|
|
- constraints_rates.count = fp->nr_rates;
|
|
- constraints_rates.list = fp->rate_table;
|
|
- constraints_rates.mask = 0;
|
|
-
|
|
- err = snd_pcm_hw_constraint_list(runtime, 0,
|
|
- SNDRV_PCM_HW_PARAM_RATE,
|
|
- &constraints_rates);
|
|
-
|
|
- if (err < 0)
|
|
- return err;
|
|
+ list_for_each_entry(fp, &subs->fmt_list, list) {
|
|
+ if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS)
|
|
+ return 0;
|
|
+ count += fp->nr_rates;
|
|
+ if (fp->needs_knot)
|
|
+ needs_knot = 1;
|
|
}
|
|
+ if (!needs_knot)
|
|
+ return 0;
|
|
+
|
|
+ subs->rate_list.count = count;
|
|
+ subs->rate_list.list = kmalloc(sizeof(int) * count, GFP_KERNEL);
|
|
+ subs->rate_list.mask = 0;
|
|
+ count = 0;
|
|
+ list_for_each_entry(fp, &subs->fmt_list, list) {
|
|
+ int i;
|
|
+ for (i = 0; i < fp->nr_rates; i++)
|
|
+ subs->rate_list.list[count++] = fp->rate_table[i];
|
|
+ }
|
|
+ err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
|
+ &subs->rate_list);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
|
|
return 0;
|
|
}
|
|
@@ -2231,6 +2237,7 @@ static void free_substream(struct snd_usb_substream *subs)
|
|
kfree(fp->rate_table);
|
|
kfree(fp);
|
|
}
|
|
+ kfree(subs->rate_list.list);
|
|
}
|
|
|
|
|
|
@@ -2456,6 +2463,7 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform
|
|
* build the rate table and bitmap flags
|
|
*/
|
|
int r, idx, c;
|
|
+ unsigned int nonzero_rates = 0;
|
|
/* this table corresponds to the SNDRV_PCM_RATE_XXX bit */
|
|
static unsigned int conv_rates[] = {
|
|
5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000,
|
|
@@ -2478,6 +2486,7 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform
|
|
fp->altsetting == 5 && fp->maxpacksize == 392)
|
|
rate = 96000;
|
|
fp->rate_table[r] = rate;
|
|
+ nonzero_rates |= rate;
|
|
if (rate < fp->rate_min)
|
|
fp->rate_min = rate;
|
|
else if (rate > fp->rate_max)
|
|
@@ -2493,6 +2502,10 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform
|
|
if (!found)
|
|
fp->needs_knot = 1;
|
|
}
|
|
+ if (!nonzero_rates) {
|
|
+ hwc_debug("All rates were zero. Skipping format!\n");
|
|
+ return -1;
|
|
+ }
|
|
if (fp->needs_knot)
|
|
fp->rates |= SNDRV_PCM_RATE_KNOT;
|
|
} else {
|