[kernel] r10164 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series
Maximilian Attems
maks at alioth.debian.org
Tue Jan 22 19:18:32 UTC 2008
Author: maks
Date: Tue Jan 22 19:18:32 2008
New Revision: 10164
Log:
add 2.6.24-rc8-git5
some important patches, no conflicts.
Added:
dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc8-git5
Modified:
dists/trunk/linux-2.6/debian/patches/series/1~experimental.2
Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc8-git5
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.24-rc8-git5 Tue Jan 22 19:18:32 2008
@@ -0,0 +1,4066 @@
+diff --git a/Documentation/local_ops.txt b/Documentation/local_ops.txt
+index 1a45f11..4269a11 100644
+--- a/Documentation/local_ops.txt
++++ b/Documentation/local_ops.txt
+@@ -68,29 +68,6 @@ typedef struct { atomic_long_t a; } local_t;
+ variable can be read when reading some _other_ cpu's variables.
+
+
+-* Rules to follow when using local atomic operations
+-
+-- Variables touched by local ops must be per cpu variables.
+-- _Only_ the CPU owner of these variables must write to them.
+-- This CPU can use local ops from any context (process, irq, softirq, nmi, ...)
+- to update its local_t variables.
+-- Preemption (or interrupts) must be disabled when using local ops in
+- process context to make sure the process won't be migrated to a
+- different CPU between getting the per-cpu variable and doing the
+- actual local op.
+-- When using local ops in interrupt context, no special care must be
+- taken on a mainline kernel, since they will run on the local CPU with
+- preemption already disabled. I suggest, however, to explicitly
+- disable preemption anyway to make sure it will still work correctly on
+- -rt kernels.
+-- Reading the local cpu variable will provide the current copy of the
+- variable.
+-- Reads of these variables can be done from any CPU, because updates to
+- "long", aligned, variables are always atomic. Since no memory
+- synchronization is done by the writer CPU, an outdated copy of the
+- variable can be read when reading some _other_ cpu's variables.
+-
+-
+ * How to use local atomic operations
+
+ #include <linux/percpu.h>
+diff --git a/Documentation/networking/driver.txt b/Documentation/networking/driver.txt
+index 4f7da5a..ea72d2e 100644
+--- a/Documentation/networking/driver.txt
++++ b/Documentation/networking/driver.txt
+@@ -61,7 +61,10 @@ Transmit path guidelines:
+ 2) Do not forget to update netdev->trans_start to jiffies after
+ each new tx packet is given to the hardware.
+
+-3) Do not forget that once you return 0 from your hard_start_xmit
++3) A hard_start_xmit method must not modify the shared parts of a
++ cloned SKB.
++
++4) Do not forget that once you return 0 from your hard_start_xmit
+ method, it is your driver's responsibility to free up the SKB
+ and in some finite amount of time.
+
+diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt
+index bb7cb1d..4cc4ba9 100644
+--- a/Documentation/watchdog/watchdog-api.txt
++++ b/Documentation/watchdog/watchdog-api.txt
+@@ -42,23 +42,27 @@ like this source file: see Documentation/watchdog/src/watchdog-simple.c
+ A more advanced driver could for example check that a HTTP server is
+ still responding before doing the write call to ping the watchdog.
+
+-When the device is closed, the watchdog is disabled. This is not
+-always such a good idea, since if there is a bug in the watchdog
+-daemon and it crashes the system will not reboot. Because of this,
+-some of the drivers support the configuration option "Disable watchdog
+-shutdown on close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when
+-compiling the kernel, there is no way of disabling the watchdog once
+-it has been started. So, if the watchdog daemon crashes, the system
+-will reboot after the timeout has passed. Watchdog devices also usually
+-support the nowayout module parameter so that this option can be controlled
+-at runtime.
+-
+-Drivers will not disable the watchdog, unless a specific magic character 'V'
+-has been sent /dev/watchdog just before closing the file. If the userspace
+-daemon closes the file without sending this special character, the driver
+-will assume that the daemon (and userspace in general) died, and will stop
+-pinging the watchdog without disabling it first. This will then cause a
+-reboot if the watchdog is not re-opened in sufficient time.
++When the device is closed, the watchdog is disabled, unless the "Magic
++Close" feature is supported (see below). This is not always such a
++good idea, since if there is a bug in the watchdog daemon and it
++crashes the system will not reboot. Because of this, some of the
++drivers support the configuration option "Disable watchdog shutdown on
++close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when compiling
++the kernel, there is no way of disabling the watchdog once it has been
++started. So, if the watchdog daemon crashes, the system will reboot
++after the timeout has passed. Watchdog devices also usually support
++the nowayout module parameter so that this option can be controlled at
++runtime.
++
++Magic Close feature:
++
++If a driver supports "Magic Close", the driver will not disable the
++watchdog unless a specific magic character 'V' has been sent to
++/dev/watchdog just before closing the file. If the userspace daemon
++closes the file without sending this special character, the driver
++will assume that the daemon (and userspace in general) died, and will
++stop pinging the watchdog without disabling it first. This will then
++cause a reboot if the watchdog is not re-opened in sufficient time.
+
+ The ioctl API:
+
+diff --git a/Makefile b/Makefile
+index 713f685..a22cac5 100644
+--- a/Makefile
++++ b/Makefile
+@@ -12,7 +12,7 @@ NAME = Arr Matey! A Hairy Bilge Rat!
+
+ # Do not:
+ # o use make's built-in rules and variables
+-# (this increases performance and avoid hard-to-debug behavour);
++# (this increases performance and avoids hard-to-debug behaviour);
+ # o print "Entering directory ...";
+ MAKEFLAGS += -rR --no-print-directory
+
+@@ -1329,7 +1329,7 @@ else
+ ALLINCLUDE_ARCHS := $(SRCARCH)
+ endif
+ else
+-#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour.
++#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
+ ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
+ endif
+
+diff --git a/arch/.gitignore b/arch/.gitignore
+new file mode 100644
+index 0000000..7414689
+--- /dev/null
++++ b/arch/.gitignore
+@@ -0,0 +1,2 @@
++i386
++x86_64
+diff --git a/arch/alpha/math-emu/math.c b/arch/alpha/math-emu/math.c
+index ae79dd9..58c2669 100644
+--- a/arch/alpha/math-emu/math.c
++++ b/arch/alpha/math-emu/math.c
+@@ -225,7 +225,7 @@ alpha_fp_emul (unsigned long pc)
+ FP_UNPACK_SP(SB, &vb);
+ DR_c = DB_c;
+ DR_s = DB_s;
+- DR_e = DB_e;
++ DR_e = DB_e + (1024 - 128);
+ DR_f = SB_f << (52 - 23);
+ goto pack_d;
+ }
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index 3a75a0b..a04f507 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -1072,6 +1072,8 @@ source "drivers/rtc/Kconfig"
+
+ source "drivers/dma/Kconfig"
+
++source "drivers/dca/Kconfig"
++
+ endmenu
+
+ source "fs/Kconfig"
+diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c
+index f65baa9..d5f6ea1 100644
+--- a/arch/arm/mach-omap1/board-fsample.c
++++ b/arch/arm/mach-omap1/board-fsample.c
+@@ -40,31 +40,29 @@ static int fsample_keymap[] = {
+ KEY(0,1,KEY_RIGHT),
+ KEY(0,2,KEY_LEFT),
+ KEY(0,3,KEY_DOWN),
+- KEY(0,4,KEY_CENTER),
+- KEY(0,5,KEY_0_5),
+- KEY(1,0,KEY_SOFT2),
++ KEY(0,4,KEY_ENTER),
++ KEY(1,0,KEY_F10),
+ KEY(1,1,KEY_SEND),
+ KEY(1,2,KEY_END),
+ KEY(1,3,KEY_VOLUMEDOWN),
+ KEY(1,4,KEY_VOLUMEUP),
+ KEY(1,5,KEY_RECORD),
+- KEY(2,0,KEY_SOFT1),
++ KEY(2,0,KEY_F9),
+ KEY(2,1,KEY_3),
+ KEY(2,2,KEY_6),
+ KEY(2,3,KEY_9),
+- KEY(2,4,KEY_SHARP),
+- KEY(2,5,KEY_2_5),
++ KEY(2,4,KEY_KPDOT),
+ KEY(3,0,KEY_BACK),
+ KEY(3,1,KEY_2),
+ KEY(3,2,KEY_5),
+ KEY(3,3,KEY_8),
+ KEY(3,4,KEY_0),
+- KEY(3,5,KEY_HEADSETHOOK),
++ KEY(3,5,KEY_KPSLASH),
+ KEY(4,0,KEY_HOME),
+ KEY(4,1,KEY_1),
+ KEY(4,2,KEY_4),
+ KEY(4,3,KEY_7),
+- KEY(4,4,KEY_STAR),
++ KEY(4,4,KEY_KPASTERISK),
+ KEY(4,5,KEY_POWER),
+ 0
+ };
+diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c
+index 22db19a..182a98a 100644
+--- a/arch/arm/mach-omap1/board-nokia770.c
++++ b/arch/arm/mach-omap1/board-nokia770.c
+@@ -36,8 +36,6 @@
+ #include <asm/arch/omapfb.h>
+ #include <asm/arch/lcd_mipid.h>
+
+-#include "../plat-omap/dsp/dsp_common.h"
+-
+ #define ADS7846_PENDOWN_GPIO 15
+
+ static void __init omap_nokia770_init_irq(void)
+@@ -318,6 +316,8 @@ static __init int omap_dsp_init(void)
+ out:
+ return ret;
+ }
++#else
++#define omap_dsp_init() do {} while (0)
+ #endif /* CONFIG_OMAP_DSP */
+
+ static void __init omap_nokia770_init(void)
+diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c
+index 1d5c8d5..e44437e 100644
+--- a/arch/arm/mach-omap1/board-perseus2.c
++++ b/arch/arm/mach-omap1/board-perseus2.c
+@@ -39,31 +39,29 @@ static int p2_keymap[] = {
+ KEY(0,1,KEY_RIGHT),
+ KEY(0,2,KEY_LEFT),
+ KEY(0,3,KEY_DOWN),
+- KEY(0,4,KEY_CENTER),
+- KEY(0,5,KEY_0_5),
+- KEY(1,0,KEY_SOFT2),
++ KEY(0,4,KEY_ENTER),
++ KEY(1,0,KEY_F10),
+ KEY(1,1,KEY_SEND),
+ KEY(1,2,KEY_END),
+ KEY(1,3,KEY_VOLUMEDOWN),
+ KEY(1,4,KEY_VOLUMEUP),
+ KEY(1,5,KEY_RECORD),
+- KEY(2,0,KEY_SOFT1),
++ KEY(2,0,KEY_F9),
+ KEY(2,1,KEY_3),
+ KEY(2,2,KEY_6),
+ KEY(2,3,KEY_9),
+- KEY(2,4,KEY_SHARP),
+- KEY(2,5,KEY_2_5),
++ KEY(2,4,KEY_KPDOT),
+ KEY(3,0,KEY_BACK),
+ KEY(3,1,KEY_2),
+ KEY(3,2,KEY_5),
+ KEY(3,3,KEY_8),
+ KEY(3,4,KEY_0),
+- KEY(3,5,KEY_HEADSETHOOK),
++ KEY(3,5,KEY_KPSLASH),
+ KEY(4,0,KEY_HOME),
+ KEY(4,1,KEY_1),
+ KEY(4,2,KEY_4),
+ KEY(4,3,KEY_7),
+- KEY(4,4,KEY_STAR),
++ KEY(4,4,KEY_KPASTERISK),
+ KEY(4,5,KEY_POWER),
+ 0
+ };
+diff --git a/arch/arm/mach-pxa/sleep.S b/arch/arm/mach-pxa/sleep.S
+index aff71fe..d044772 100644
+--- a/arch/arm/mach-pxa/sleep.S
++++ b/arch/arm/mach-pxa/sleep.S
+@@ -43,11 +43,11 @@ pxa_cpu_save_cp:
+ pxa_cpu_save_sp:
+ @ preserve phys address of stack
+ mov r0, sp
+- mov r2, lr
++ str lr, [sp, #-4]!
+ bl sleep_phys_sp
+ ldr r1, =sleep_save_sp
+ str r0, [r1]
+- mov pc, r2
++ ldr pc, [sp], #4
+
+ /*
+ * pxa27x_cpu_suspend()
+@@ -270,5 +270,3 @@ resume_after_mmu:
+ mar acc0, r2, r3
+ #endif
+ ldmfd sp!, {r4 - r12, pc} @ return to caller
+-
+-
+diff --git a/arch/cris/arch-v10/kernel/io_interface_mux.c b/arch/cris/arch-v10/kernel/io_interface_mux.c
+index 3a9114e..f3b327d 100644
+--- a/arch/cris/arch-v10/kernel/io_interface_mux.c
++++ b/arch/cris/arch-v10/kernel/io_interface_mux.c
+@@ -392,6 +392,7 @@ int cris_request_io_interface(enum cris_io_interface ioif, const char *device_id
+ if (((interfaces[ioif].gpio_g_in & gpio_in_pins) != interfaces[ioif].gpio_g_in) ||
+ ((interfaces[ioif].gpio_g_out & gpio_out_pins) != interfaces[ioif].gpio_g_out) ||
+ ((interfaces[ioif].gpio_b & gpio_pb_pins) != interfaces[ioif].gpio_b)) {
++ local_irq_restore(flags);
+ printk(KERN_CRIT "cris_request_io_interface: Could not get required pins for interface %u\n",
+ ioif);
+ return -EBUSY;
+diff --git a/arch/cris/arch-v10/vmlinux.lds.S b/arch/cris/arch-v10/vmlinux.lds.S
+index 9859d49..97a7876 100644
+--- a/arch/cris/arch-v10/vmlinux.lds.S
++++ b/arch/cris/arch-v10/vmlinux.lds.S
+@@ -9,7 +9,8 @@
+ */
+
+ #include <asm-generic/vmlinux.lds.h>
+-
++#include <asm/page.h>
++
+ jiffies = jiffies_64;
+ SECTIONS
+ {
+@@ -23,7 +24,7 @@ SECTIONS
+ _stext = .;
+ __stext = .;
+ .text : {
+- *(.text)
++ TEXT_TEXT
+ SCHED_TEXT
+ LOCK_TEXT
+ *(.fixup)
+@@ -49,10 +50,10 @@ SECTIONS
+ __edata = . ; /* End of data section */
+ _edata = . ;
+
+- . = ALIGN(8192); /* init_task and stack, must be aligned */
++ . = ALIGN(PAGE_SIZE); /* init_task and stack, must be aligned */
+ .data.init_task : { *(.data.init_task) }
+
+- . = ALIGN(8192); /* Init code and data */
++ . = ALIGN(PAGE_SIZE); /* Init code and data */
+ __init_begin = .;
+ .init.text : {
+ _sinittext = .;
+@@ -66,13 +67,7 @@ SECTIONS
+ __setup_end = .;
+ .initcall.init : {
+ __initcall_start = .;
+- *(.initcall1.init);
+- *(.initcall2.init);
+- *(.initcall3.init);
+- *(.initcall4.init);
+- *(.initcall5.init);
+- *(.initcall6.init);
+- *(.initcall7.init);
++ INITCALLS
+ __initcall_end = .;
+ }
+
+@@ -88,16 +83,18 @@ SECTIONS
+ __initramfs_start = .;
+ *(.init.ramfs)
+ __initramfs_end = .;
+- /* We fill to the next page, so we can discard all init
+- pages without needing to consider what payload might be
+- appended to the kernel image. */
+- FILL (0);
+- . = ALIGN (8192);
+ }
+ #endif
+-
+ __vmlinux_end = .; /* last address of the physical file */
+- __init_end = .;
++
++ /*
++ * We fill to the next page, so we can discard all init
++ * pages without needing to consider what payload might be
++ * appended to the kernel image.
++ */
++ . = ALIGN(PAGE_SIZE);
++
++ __init_end = .;
+
+ __data_end = . ; /* Move to _edata ? */
+ __bss_start = .; /* BSS */
+diff --git a/arch/mips/mips-boards/malta/malta_setup.c b/arch/mips/mips-boards/malta/malta_setup.c
+index 9a2636e..bc43a5c 100644
+--- a/arch/mips/mips-boards/malta/malta_setup.c
++++ b/arch/mips/mips-boards/malta/malta_setup.c
+@@ -149,7 +149,7 @@ void __init plat_mem_setup(void)
+ /* Check PCI clock */
+ {
+ unsigned int __iomem *jmpr_p = (unsigned int *) ioremap(MALTA_JMPRS_REG, sizeof(unsigned int));
+- int jmpr = (readw(jmpr_p) >> 2) & 0x07;
++ int jmpr = (__raw_readl(jmpr_p) >> 2) & 0x07;
+ static const int pciclocks[] __initdata = {
+ 33, 20, 25, 30, 12, 16, 37, 10
+ };
+diff --git a/arch/mips/tx4938/toshiba_rbtx4938/setup.c b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
+index 4a81523..632e5d2 100644
+--- a/arch/mips/tx4938/toshiba_rbtx4938/setup.c
++++ b/arch/mips/tx4938/toshiba_rbtx4938/setup.c
+@@ -598,8 +598,8 @@ static int __init rbtx4938_ethaddr_init(void)
+ printk(KERN_WARNING "seeprom: bad checksum.\n");
+ }
+ for (i = 0; i < 2; i++) {
+- unsigned int slot = TX4938_PCIC_IDSEL_AD_TO_SLOT(31 - i);
+- unsigned int id = (1 << 8) | PCI_DEVFN(slot, 0); /* bus 1 */
++ unsigned int id =
++ TXX9_IRQ_BASE + (i ? TX4938_IR_ETH1 : TX4938_IR_ETH0);
+ struct platform_device *pdev;
+ if (!(tx4938_ccfgptr->pcfg &
+ (i ? TX4938_PCFG_ETH1_SEL : TX4938_PCFG_ETH0_SEL)))
+diff --git a/arch/sparc64/kernel/sun4v_tlb_miss.S b/arch/sparc64/kernel/sun4v_tlb_miss.S
+index 9871dbb..fd94305 100644
+--- a/arch/sparc64/kernel/sun4v_tlb_miss.S
++++ b/arch/sparc64/kernel/sun4v_tlb_miss.S
+@@ -215,6 +215,7 @@ sun4v_itlb_error:
+
+ 1: ba,pt %xcc, etrap
+ 2: or %g7, %lo(2b), %g7
++ mov %l4, %o1
+ call sun4v_itlb_error_report
+ add %sp, PTREGS_OFF, %o0
+
+@@ -241,6 +242,7 @@ sun4v_dtlb_error:
+
+ 1: ba,pt %xcc, etrap
+ 2: or %g7, %lo(2b), %g7
++ mov %l4, %o1
+ call sun4v_dtlb_error_report
+ add %sp, PTREGS_OFF, %o0
+
+diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c
+index 0499838..2b6abf6 100644
+--- a/arch/sparc64/kernel/traps.c
++++ b/arch/sparc64/kernel/traps.c
+@@ -1950,6 +1950,8 @@ void sun4v_itlb_error_report(struct pt_regs *regs, int tl)
+ printk(KERN_EMERG "SUN4V-ITLB: Error at TPC[%lx], tl %d\n",
+ regs->tpc, tl);
+ print_symbol(KERN_EMERG "SUN4V-ITLB: TPC<%s>\n", regs->tpc);
++ printk(KERN_EMERG "SUN4V-ITLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
++ print_symbol(KERN_EMERG "SUN4V-ITLB: O7<%s>\n", regs->u_regs[UREG_I7]);
+ printk(KERN_EMERG "SUN4V-ITLB: vaddr[%lx] ctx[%lx] "
+ "pte[%lx] error[%lx]\n",
+ sun4v_err_itlb_vaddr, sun4v_err_itlb_ctx,
+@@ -1971,6 +1973,8 @@ void sun4v_dtlb_error_report(struct pt_regs *regs, int tl)
+ printk(KERN_EMERG "SUN4V-DTLB: Error at TPC[%lx], tl %d\n",
+ regs->tpc, tl);
+ print_symbol(KERN_EMERG "SUN4V-DTLB: TPC<%s>\n", regs->tpc);
++ printk(KERN_EMERG "SUN4V-DTLB: O7[%lx]\n", regs->u_regs[UREG_I7]);
++ print_symbol(KERN_EMERG "SUN4V-DTLB: O7<%s>\n", regs->u_regs[UREG_I7]);
+ printk(KERN_EMERG "SUN4V-DTLB: vaddr[%lx] ctx[%lx] "
+ "pte[%lx] error[%lx]\n",
+ sun4v_err_dtlb_vaddr, sun4v_err_dtlb_ctx,
+diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c
+index c88bbff..02d1e1e 100644
+--- a/arch/x86/kernel/traps_32.c
++++ b/arch/x86/kernel/traps_32.c
+@@ -541,6 +541,7 @@ fastcall void do_##name(struct pt_regs * regs, long error_code) \
+ info.si_errno = 0; \
+ info.si_code = sicode; \
+ info.si_addr = (void __user *)siaddr; \
++ trace_hardirqs_fixup(); \
+ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
+ == NOTIFY_STOP) \
+ return; \
+diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c
+index d11525a..cc68b92 100644
+--- a/arch/x86/kernel/traps_64.c
++++ b/arch/x86/kernel/traps_64.c
+@@ -635,6 +635,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+ info.si_errno = 0; \
+ info.si_code = sicode; \
+ info.si_addr = (void __user *)siaddr; \
++ trace_hardirqs_fixup(); \
+ if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
+ == NOTIFY_STOP) \
+ return; \
+diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
+index 2d0eeac..944bbcd 100644
+--- a/arch/x86/oprofile/nmi_int.c
++++ b/arch/x86/oprofile/nmi_int.c
+@@ -380,7 +380,7 @@ static int __init ppro_init(char ** cpu_type)
+
+ if (cpu_model == 14)
+ *cpu_type = "i386/core";
+- else if (cpu_model == 15)
++ else if (cpu_model == 15 || cpu_model == 23)
+ *cpu_type = "i386/core_2";
+ else if (cpu_model > 0xd)
+ return 0;
+diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
+index 8f28156..6c9689b 100644
+--- a/drivers/ata/pata_pdc202xx_old.c
++++ b/drivers/ata/pata_pdc202xx_old.c
+@@ -244,6 +244,24 @@ static int pdc2026x_port_start(struct ata_port *ap)
+ return ata_sff_port_start(ap);
+ }
+
++/**
++ * pdc2026x_check_atapi_dma - Check whether ATAPI DMA can be supported for this command
++ * @qc: Metadata associated with taskfile to check
++ *
++ * Just say no - not supported on older Promise.
++ *
++ * LOCKING:
++ * None (inherited from caller).
++ *
++ * RETURNS: 0 when ATAPI DMA can be used
++ * 1 otherwise
++ */
++
++static int pdc2026x_check_atapi_dma(struct ata_queued_cmd *qc)
++{
++ return 1;
++}
++
+ static struct scsi_host_template pdc202xx_sht = {
+ .module = THIS_MODULE,
+ .name = DRV_NAME,
+@@ -311,6 +329,7 @@ static struct ata_port_operations pdc2026x_port_ops = {
+ .post_internal_cmd = ata_bmdma_post_internal_cmd,
+ .cable_detect = pdc2026x_cable_detect,
+
++ .check_atapi_dma= pdc2026x_check_atapi_dma,
+ .bmdma_setup = ata_bmdma_setup,
+ .bmdma_start = pdc2026x_bmdma_start,
+ .bmdma_stop = pdc2026x_bmdma_stop,
+diff --git a/drivers/atm/idt77105.c b/drivers/atm/idt77105.c
+index 0bd657f..84672dc 100644
+--- a/drivers/atm/idt77105.c
++++ b/drivers/atm/idt77105.c
+@@ -357,7 +357,7 @@ static const struct atmphy_ops idt77105_ops = {
+ };
+
+
+-int __devinit idt77105_init(struct atm_dev *dev)
++int idt77105_init(struct atm_dev *dev)
+ {
+ dev->phy = &idt77105_ops;
+ return 0;
+diff --git a/drivers/atm/suni.c b/drivers/atm/suni.c
+index f04f39c..b1d063c 100644
+--- a/drivers/atm/suni.c
++++ b/drivers/atm/suni.c
+@@ -289,7 +289,7 @@ static const struct atmphy_ops suni_ops = {
+ };
+
+
+-int __devinit suni_init(struct atm_dev *dev)
++int suni_init(struct atm_dev *dev)
+ {
+ unsigned char mri;
+
+diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
+index 1bba997..5d3a04b 100644
+--- a/drivers/cpufreq/cpufreq_conservative.c
++++ b/drivers/cpufreq/cpufreq_conservative.c
+@@ -603,5 +603,9 @@ MODULE_DESCRIPTION ("'cpufreq_conservative' - A dynamic cpufreq governor for "
+ "optimised for use in a battery environment");
+ MODULE_LICENSE ("GPL");
+
++#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE
++fs_initcall(cpufreq_gov_dbs_init);
++#else
+ module_init(cpufreq_gov_dbs_init);
++#endif
+ module_exit(cpufreq_gov_dbs_exit);
+diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
+index 369f445..d2af20d 100644
+--- a/drivers/cpufreq/cpufreq_ondemand.c
++++ b/drivers/cpufreq/cpufreq_ondemand.c
+@@ -610,6 +610,9 @@ MODULE_DESCRIPTION("'cpufreq_ondemand' - A dynamic cpufreq governor for "
+ "Low Latency Frequency Transition capable processors");
+ MODULE_LICENSE("GPL");
+
++#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND
++fs_initcall(cpufreq_gov_dbs_init);
++#else
+ module_init(cpufreq_gov_dbs_init);
++#endif
+ module_exit(cpufreq_gov_dbs_exit);
+-
+diff --git a/drivers/cpufreq/cpufreq_userspace.c b/drivers/cpufreq/cpufreq_userspace.c
+index 51bedab..f8cdde4 100644
+--- a/drivers/cpufreq/cpufreq_userspace.c
++++ b/drivers/cpufreq/cpufreq_userspace.c
+@@ -231,5 +231,9 @@ MODULE_AUTHOR ("Dominik Brodowski <linux at brodo.de>, Russell King <rmk at arm.linux.
+ MODULE_DESCRIPTION ("CPUfreq policy governor 'userspace'");
+ MODULE_LICENSE ("GPL");
+
++#ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE
+ fs_initcall(cpufreq_gov_userspace_init);
++#else
++module_init(cpufreq_gov_userspace_init);
++#endif
+ module_exit(cpufreq_gov_userspace_exit);
+diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c
+index 16a2a93..b3df6f3 100644
+--- a/drivers/infiniband/hw/ipath/ipath_ud.c
++++ b/drivers/infiniband/hw/ipath/ipath_ud.c
+@@ -455,6 +455,28 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
+ }
+ }
+
++ /*
++ * The opcode is in the low byte when its in network order
++ * (top byte when in host order).
++ */
++ opcode = be32_to_cpu(ohdr->bth[0]) >> 24;
++ if (qp->ibqp.qp_num > 1 &&
++ opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
++ if (header_in_data) {
++ wc.imm_data = *(__be32 *) data;
++ data += sizeof(__be32);
++ } else
++ wc.imm_data = ohdr->u.ud.imm_data;
++ wc.wc_flags = IB_WC_WITH_IMM;
++ hdrsize += sizeof(u32);
++ } else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
++ wc.imm_data = 0;
++ wc.wc_flags = 0;
++ } else {
++ dev->n_pkt_drops++;
++ goto bail;
++ }
++
+ /* Get the number of bytes the message was padded by. */
+ pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3;
+ if (unlikely(tlen < (hdrsize + pad + 4))) {
+@@ -482,28 +504,6 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
+ wc.byte_len = tlen + sizeof(struct ib_grh);
+
+ /*
+- * The opcode is in the low byte when its in network order
+- * (top byte when in host order).
+- */
+- opcode = be32_to_cpu(ohdr->bth[0]) >> 24;
+- if (qp->ibqp.qp_num > 1 &&
+- opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
+- if (header_in_data) {
+- wc.imm_data = *(__be32 *) data;
+- data += sizeof(__be32);
+- } else
+- wc.imm_data = ohdr->u.ud.imm_data;
+- wc.wc_flags = IB_WC_WITH_IMM;
+- hdrsize += sizeof(u32);
+- } else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
+- wc.imm_data = 0;
+- wc.wc_flags = 0;
+- } else {
+- dev->n_pkt_drops++;
+- goto bail;
+- }
+-
+- /*
+ * Get the next work request entry to find where to put the data.
+ */
+ if (qp->r_reuse_sge)
+diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
+index 2b5ed11..b346a3b 100644
+--- a/drivers/input/mouse/alps.c
++++ b/drivers/input/mouse/alps.c
+@@ -54,7 +54,7 @@ static const struct alps_model_info alps_model_data[] = {
+ { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */
+ { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT },
+ { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */
+- { { 0x73, 0x02, 0x50 }, 0xcf, 0xff, ALPS_FW_BK_1 } /* Dell Vostro 1400 */
++ { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 } /* Dell Vostro 1400 */
+ };
+
+ /*
+diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c
+index 9ec57d8..df81b0a 100644
+--- a/drivers/input/mouse/lifebook.c
++++ b/drivers/input/mouse/lifebook.c
+@@ -225,8 +225,13 @@ static void lifebook_set_resolution(struct psmouse *psmouse, unsigned int resolu
+
+ static void lifebook_disconnect(struct psmouse *psmouse)
+ {
++ struct lifebook_data *priv = psmouse->private;
++
+ psmouse_reset(psmouse);
+- kfree(psmouse->private);
++ if (priv) {
++ input_unregister_device(priv->dev2);
++ kfree(priv);
++ }
+ psmouse->private = NULL;
+ }
+
+diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
+index 21a9c0b..b862825 100644
+--- a/drivers/input/mouse/psmouse-base.c
++++ b/drivers/input/mouse/psmouse-base.c
+@@ -1247,6 +1247,8 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
+ err_pt_deactivate:
+ if (parent && parent->pt_deactivate)
+ parent->pt_deactivate(parent);
++ input_unregister_device(psmouse->dev);
++ input_dev = NULL; /* so we don't try to free it below */
+ err_protocol_disconnect:
+ if (psmouse->disconnect)
+ psmouse->disconnect(psmouse);
+diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
+index 78c3ea7..be83516 100644
+--- a/drivers/input/mousedev.c
++++ b/drivers/input/mousedev.c
+@@ -1029,6 +1029,15 @@ static const struct input_device_id mousedev_ids[] = {
+ BIT_MASK(ABS_PRESSURE) |
+ BIT_MASK(ABS_TOOL_WIDTH) },
+ }, /* A touchpad */
++ {
++ .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
++ INPUT_DEVICE_ID_MATCH_KEYBIT |
++ INPUT_DEVICE_ID_MATCH_ABSBIT,
++ .evbit = { BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_SYN) },
++ .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
++ .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
++ }, /* Mouse-like device with absolute X and Y but ordinary
++ clicks, like hp ILO2 High Performance mouse */
+
+ { }, /* Terminating entry */
+ };
+diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
+index 19055e7..63f9664 100644
+--- a/drivers/input/touchscreen/usbtouchscreen.c
++++ b/drivers/input/touchscreen/usbtouchscreen.c
+@@ -11,6 +11,7 @@
+ * - DMC TSC-10/25
+ * - IRTOUCHSYSTEMS/UNITOP
+ * - IdealTEK URTC1000
++ * - General Touch
+ * - GoTop Super_Q2/GogoPen/PenPower tablets
+ *
+ * Copyright (C) 2004-2007 by Daniel Ritz <daniel.ritz at gmx.ch>
+@@ -50,7 +51,7 @@
+ #include <linux/usb/input.h>
+
+
+-#define DRIVER_VERSION "v0.5"
++#define DRIVER_VERSION "v0.6"
+ #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz at gmx.ch>"
+ #define DRIVER_DESC "USB Touchscreen Driver"
+
+@@ -65,17 +66,21 @@ struct usbtouch_device_info {
+ int min_yc, max_yc;
+ int min_press, max_press;
+ int rept_size;
+- int flags;
+
+ void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len);
++
++ /*
++ * used to get the packet len. possible return values:
++ * > 0: packet len
++ * = 0: skip one byte
++ * < 0: -return value more bytes needed
++ */
+ int (*get_pkt_len) (unsigned char *pkt, int len);
++
+ int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt);
+ int (*init) (struct usbtouch_usb *usbtouch);
+ };
+
+-#define USBTOUCH_FLG_BUFFER 0x01
+-
+-
+ /* a usbtouch device */
+ struct usbtouch_usb {
+ unsigned char *data;
+@@ -94,15 +99,6 @@ struct usbtouch_usb {
+ };
+
+
+-#if defined(CONFIG_TOUCHSCREEN_USB_EGALAX) || defined(CONFIG_TOUCHSCREEN_USB_ETURBO) || defined(CONFIG_TOUCHSCREEN_USB_IDEALTEK)
+-#define MULTI_PACKET
+-#endif
+-
+-#ifdef MULTI_PACKET
+-static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
+- unsigned char *pkt, int len);
+-#endif
+-
+ /* device types */
+ enum {
+ DEVTPYE_DUMMY = -1,
+@@ -186,6 +182,10 @@ static struct usb_device_id usbtouch_devices[] = {
+
+ #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX
+
++#ifndef MULTI_PACKET
++#define MULTI_PACKET
++#endif
++
+ #define EGALAX_PKT_TYPE_MASK 0xFE
+ #define EGALAX_PKT_TYPE_REPT 0x80
+ #define EGALAX_PKT_TYPE_DIAG 0x0A
+@@ -323,6 +323,9 @@ static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+ * eTurboTouch part
+ */
+ #ifdef CONFIG_TOUCHSCREEN_USB_ETURBO
++#ifndef MULTI_PACKET
++#define MULTI_PACKET
++#endif
+ static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+ {
+ unsigned int shift;
+@@ -461,6 +464,9 @@ static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+ * IdealTEK URTC1000 Part
+ */
+ #ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK
++#ifndef MULTI_PACKET
++#define MULTI_PACKET
++#endif
+ static int idealtek_get_pkt_len(unsigned char *buf, int len)
+ {
+ if (buf[0] & 0x80)
+@@ -525,6 +531,11 @@ static int gotop_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
+ /*****************************************************************************
+ * the different device descriptors
+ */
++#ifdef MULTI_PACKET
++static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
++ unsigned char *pkt, int len);
++#endif
++
+ static struct usbtouch_device_info usbtouch_dev_info[] = {
+ #ifdef CONFIG_TOUCHSCREEN_USB_EGALAX
+ [DEVTYPE_EGALAX] = {
+@@ -533,7 +544,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {
+ .min_yc = 0x0,
+ .max_yc = 0x07ff,
+ .rept_size = 16,
+- .flags = USBTOUCH_FLG_BUFFER,
+ .process_pkt = usbtouch_process_multi,
+ .get_pkt_len = egalax_get_pkt_len,
+ .read_data = egalax_read_data,
+@@ -582,7 +592,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {
+ .min_yc = 0x0,
+ .max_yc = 0x07ff,
+ .rept_size = 8,
+- .flags = USBTOUCH_FLG_BUFFER,
+ .process_pkt = usbtouch_process_multi,
+ .get_pkt_len = eturbo_get_pkt_len,
+ .read_data = eturbo_read_data,
+@@ -630,7 +639,6 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {
+ .min_yc = 0x0,
+ .max_yc = 0x0fff,
+ .rept_size = 8,
+- .flags = USBTOUCH_FLG_BUFFER,
+ .process_pkt = usbtouch_process_multi,
+ .get_pkt_len = idealtek_get_pkt_len,
+ .read_data = idealtek_read_data,
+@@ -738,11 +746,14 @@ static void usbtouch_process_multi(struct usbtouch_usb *usbtouch,
+ pos = 0;
+ while (pos < buf_len) {
+ /* get packet len */
+- pkt_len = usbtouch->type->get_pkt_len(buffer + pos, len);
++ pkt_len = usbtouch->type->get_pkt_len(buffer + pos,
++ buf_len - pos);
+
+- /* unknown packet: drop everything */
+- if (unlikely(!pkt_len))
+- goto out_flush_buf;
++ /* unknown packet: skip one byte */
++ if (unlikely(!pkt_len)) {
++ pos++;
++ continue;
++ }
+
+ /* full packet: process */
+ if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) {
+@@ -857,7 +868,7 @@ static int usbtouch_probe(struct usb_interface *intf,
+ if (!usbtouch->data)
+ goto out_free;
+
+- if (type->flags & USBTOUCH_FLG_BUFFER) {
++ if (type->get_pkt_len) {
+ usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL);
+ if (!usbtouch->buffer)
+ goto out_free_buffers;
+diff --git a/drivers/lguest/Kconfig b/drivers/lguest/Kconfig
+index 7eb9ecf..6b8dbb9 100644
+--- a/drivers/lguest/Kconfig
++++ b/drivers/lguest/Kconfig
+@@ -10,10 +10,3 @@ config LGUEST
+ not "rustyvisor". See Documentation/lguest/lguest.txt.
+
+ If unsure, say N. If curious, say M. If masochistic, say Y.
+-
+-config LGUEST_GUEST
+- bool
+- help
+- The guest needs code built-in, even if the host has lguest
+- support as a module. The drivers are tiny, so we build them
+- in too.
+diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
+index 4fd187a..4f0a915 100644
+--- a/drivers/media/video/saa7134/saa7134-core.c
++++ b/drivers/media/video/saa7134/saa7134-core.c
+@@ -1202,9 +1202,8 @@ static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
+
+ static int saa7134_resume(struct pci_dev *pci_dev)
+ {
+-
+ struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
+- unsigned int flags;
++ unsigned long flags;
+
+ pci_restore_state(pci_dev);
+ pci_set_power_state(pci_dev, PCI_D0);
+diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c
+index 275e751..684bab7 100644
+--- a/drivers/net/3c515.c
++++ b/drivers/net/3c515.c
+@@ -243,14 +243,16 @@ enum eeprom_offset {
+ enum Window3 { /* Window 3: MAC/config bits. */
+ Wn3_Config = 0, Wn3_MAC_Ctrl = 6, Wn3_Options = 8,
+ };
+-union wn3_config {
+- int i;
+- struct w3_config_fields {
+- unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
+- int pad8:8;
+- unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1;
+- int pad24:7;
+- } u;
++enum wn3_config {
++ Ram_size = 7,
++ Ram_width = 8,
++ Ram_speed = 0x30,
++ Rom_size = 0xc0,
++ Ram_split_shift = 16,
++ Ram_split = 3 << Ram_split_shift,
++ Xcvr_shift = 20,
++ Xcvr = 7 << Xcvr_shift,
++ Autoselect = 0x1000000,
+ };
+
+ enum Window4 {
+@@ -614,7 +616,7 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
+ /* Read the station address from the EEPROM. */
+ EL3WINDOW(0);
+ for (i = 0; i < 0x18; i++) {
+- short *phys_addr = (short *) dev->dev_addr;
++ __be16 *phys_addr = (__be16 *) dev->dev_addr;
+ int timer;
+ outw(EEPROM_Read + i, ioaddr + Wn0EepromCmd);
+ /* Pause for at least 162 us. for the read to take place. */
+@@ -646,22 +648,22 @@ static int corkscrew_setup(struct net_device *dev, int ioaddr,
+
+ {
+ char *ram_split[] = { "5:3", "3:1", "1:1", "3:5" };
+- union wn3_config config;
++ __u32 config;
+ EL3WINDOW(3);
+ vp->available_media = inw(ioaddr + Wn3_Options);
+- config.i = inl(ioaddr + Wn3_Config);
++ config = inl(ioaddr + Wn3_Config);
+ if (corkscrew_debug > 1)
+ printk(KERN_INFO " Internal config register is %4.4x, transceivers %#x.\n",
+- config.i, inw(ioaddr + Wn3_Options));
++ config, inw(ioaddr + Wn3_Options));
+ printk(KERN_INFO " %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
+- 8 << config.u.ram_size,
+- config.u.ram_width ? "word" : "byte",
+- ram_split[config.u.ram_split],
+- config.u.autoselect ? "autoselect/" : "",
+- media_tbl[config.u.xcvr].name);
+- dev->if_port = config.u.xcvr;
+- vp->default_media = config.u.xcvr;
+- vp->autoselect = config.u.autoselect;
++ 8 << config & Ram_size,
++ config & Ram_width ? "word" : "byte",
++ ram_split[(config & Ram_split) >> Ram_split_shift],
++ config & Autoselect ? "autoselect/" : "",
++ media_tbl[(config & Xcvr) >> Xcvr_shift].name);
++ vp->default_media = (config & Xcvr) >> Xcvr_shift;
++ vp->autoselect = config & Autoselect ? 1 : 0;
++ dev->if_port = vp->default_media;
+ }
+ if (vp->media_override != 7) {
+ printk(KERN_INFO " Media override to transceiver type %d (%s).\n",
+@@ -694,14 +696,14 @@ static int corkscrew_open(struct net_device *dev)
+ {
+ int ioaddr = dev->base_addr;
+ struct corkscrew_private *vp = netdev_priv(dev);
+- union wn3_config config;
++ __u32 config;
+ int i;
+
+ /* Before initializing select the active media port. */
+ EL3WINDOW(3);
+ if (vp->full_duplex)
+ outb(0x20, ioaddr + Wn3_MAC_Ctrl); /* Set the full-duplex bit. */
+- config.i = inl(ioaddr + Wn3_Config);
++ config = inl(ioaddr + Wn3_Config);
+
+ if (vp->media_override != 7) {
+ if (corkscrew_debug > 1)
+@@ -727,12 +729,12 @@ static int corkscrew_open(struct net_device *dev)
+ } else
+ dev->if_port = vp->default_media;
+
+- config.u.xcvr = dev->if_port;
+- outl(config.i, ioaddr + Wn3_Config);
++ config = (config & ~Xcvr) | (dev->if_port << Xcvr_shift);
++ outl(config, ioaddr + Wn3_Config);
+
+ if (corkscrew_debug > 1) {
+ printk("%s: corkscrew_open() InternalConfig %8.8x.\n",
+- dev->name, config.i);
++ dev->name, config);
+ }
+
+ outw(TxReset, ioaddr + EL3_CMD);
+@@ -901,7 +903,7 @@ static void corkscrew_timer(unsigned long data)
+ ok = 1;
+ }
+ if (!ok) {
+- union wn3_config config;
++ __u32 config;
+
+ do {
+ dev->if_port =
+@@ -928,9 +930,9 @@ static void corkscrew_timer(unsigned long data)
+ ioaddr + Wn4_Media);
+
+ EL3WINDOW(3);
+- config.i = inl(ioaddr + Wn3_Config);
+- config.u.xcvr = dev->if_port;
+- outl(config.i, ioaddr + Wn3_Config);
++ config = inl(ioaddr + Wn3_Config);
++ config = (config & ~Xcvr) | (dev->if_port << Xcvr_shift);
++ outl(config, ioaddr + Wn3_Config);
+
+ outw(dev->if_port == 3 ? StartCoax : StopCoax,
+ ioaddr + EL3_CMD);
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 114771a..9ae3166 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -1976,9 +1976,6 @@ config E1000E
+
+ <http://support.intel.com>
+
+- More specific information on configuring the driver is in
+- <file:Documentation/networking/e1000e.txt>.
+-
+ To compile this driver as a module, choose M here. The module
+ will be called e1000e.
+
+diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c
+index 35b0a7d..9200ee5 100644
+--- a/drivers/net/atl1/atl1_main.c
++++ b/drivers/net/atl1/atl1_main.c
+@@ -120,7 +120,7 @@ static int __devinit atl1_sw_init(struct atl1_adapter *adapter)
+ struct atl1_hw *hw = &adapter->hw;
+ struct net_device *netdev = adapter->netdev;
+
+- hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
++ hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
+ hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
+
+ adapter->wol = 0;
+@@ -688,7 +688,7 @@ static int atl1_change_mtu(struct net_device *netdev, int new_mtu)
+ {
+ struct atl1_adapter *adapter = netdev_priv(netdev);
+ int old_mtu = netdev->mtu;
+- int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
++ int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
+
+ if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
+ (max_frame > MAX_JUMBO_FRAME_SIZE)) {
+@@ -853,8 +853,8 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
+ /* set Interrupt Clear Timer */
+ iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);
+
+- /* set MTU, 4 : VLAN */
+- iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
++ /* set max frame size hw will accept */
++ iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);
+
+ /* jumbo size & rrd retirement timer */
+ value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)
+diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
+index 25b8dbf..b57bc94 100644
+--- a/drivers/net/bonding/bond_alb.c
++++ b/drivers/net/bonding/bond_alb.c
+@@ -979,7 +979,7 @@ static void alb_swap_mac_addr(struct bonding *bond, struct slave *slave1, struct
+ /*
+ * Send learning packets after MAC address swap.
+ *
+- * Called with RTNL and bond->lock held for read.
++ * Called with RTNL and no other locks
+ */
+ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
+ struct slave *slave2)
+@@ -987,6 +987,8 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
+ int slaves_state_differ = (SLAVE_IS_OK(slave1) != SLAVE_IS_OK(slave2));
+ struct slave *disabled_slave = NULL;
+
++ ASSERT_RTNL();
++
+ /* fasten the change in the switch */
+ if (SLAVE_IS_OK(slave1)) {
+ alb_send_learning_packets(slave1, slave1->dev->dev_addr);
+@@ -1031,7 +1033,7 @@ static void alb_fasten_mac_swap(struct bonding *bond, struct slave *slave1,
+ * a slave that has @slave's permanet address as its current address.
+ * We'll make sure that that slave no longer uses @slave's permanent address.
+ *
+- * Caller must hold bond lock
++ * Caller must hold RTNL and no other locks
+ */
+ static void alb_change_hw_addr_on_detach(struct bonding *bond, struct slave *slave)
+ {
+@@ -1542,7 +1544,12 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave)
+ return 0;
+ }
+
+-/* Caller must hold bond lock for write */
++/*
++ * Remove slave from tlb and rlb hash tables, and fix up MAC addresses
++ * if necessary.
++ *
++ * Caller must hold RTNL and no other locks
++ */
+ void bond_alb_deinit_slave(struct bonding *bond, struct slave *slave)
+ {
+ if (bond->slave_cnt > 1) {
+@@ -1601,9 +1608,6 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
+ struct slave *swap_slave;
+ int i;
+
+- if (new_slave)
+- ASSERT_RTNL();
+-
+ if (bond->curr_active_slave == new_slave) {
+ return;
+ }
+@@ -1649,6 +1653,8 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
+ write_unlock_bh(&bond->curr_slave_lock);
+ read_unlock(&bond->lock);
+
++ ASSERT_RTNL();
++
+ /* curr_active_slave must be set before calling alb_swap_mac_addr */
+ if (swap_slave) {
+ /* swap mac address */
+@@ -1659,12 +1665,11 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave
+ bond->alb_info.rlb_enabled);
+ }
+
+- read_lock(&bond->lock);
+-
+ if (swap_slave) {
+ alb_fasten_mac_swap(bond, swap_slave, new_slave);
++ read_lock(&bond->lock);
+ } else {
+- /* fasten bond mac on new current slave */
++ read_lock(&bond->lock);
+ alb_send_learning_packets(new_slave, bond->dev->dev_addr);
+ }
+
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index b0b2603..49a1982 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -1746,7 +1746,9 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
+ * has been cleared (if our_slave == old_current),
+ * but before a new active slave is selected.
+ */
++ write_unlock_bh(&bond->lock);
+ bond_alb_deinit_slave(bond, slave);
++ write_lock_bh(&bond->lock);
+ }
+
+ if (oldcurrent == slave) {
+@@ -1905,6 +1907,12 @@ static int bond_release_all(struct net_device *bond_dev)
+ slave_dev = slave->dev;
+ bond_detach_slave(bond, slave);
+
++ /* now that the slave is detached, unlock and perform
++ * all the undo steps that should not be called from
++ * within a lock.
++ */
++ write_unlock_bh(&bond->lock);
++
+ if ((bond->params.mode == BOND_MODE_TLB) ||
+ (bond->params.mode == BOND_MODE_ALB)) {
+ /* must be called only after the slave
+@@ -1915,12 +1923,6 @@ static int bond_release_all(struct net_device *bond_dev)
+
+ bond_compute_features(bond);
+
+- /* now that the slave is detached, unlock and perform
+- * all the undo steps that should not be called from
+- * within a lock.
+- */
+- write_unlock_bh(&bond->lock);
+-
+ bond_destroy_slave_symlinks(bond_dev, slave_dev);
+ bond_del_vlans_from_slave(bond, slave_dev);
+
+@@ -2384,7 +2386,9 @@ void bond_mii_monitor(struct work_struct *work)
+ rtnl_lock();
+ read_lock(&bond->lock);
+ __bond_mii_monitor(bond, 1);
+- rtnl_unlock();
++ read_unlock(&bond->lock);
++ rtnl_unlock(); /* might sleep, hold no other locks */
++ read_lock(&bond->lock);
+ }
+
+ delay = ((bond->params.miimon * HZ) / 1000) ? : 1;
+@@ -3399,9 +3403,7 @@ static int bond_master_netdev_event(unsigned long event, struct net_device *bond
+ case NETDEV_CHANGENAME:
+ return bond_event_changename(event_bond);
+ case NETDEV_UNREGISTER:
+- /*
+- * TODO: remove a bond from the list?
+- */
++ bond_release_all(event_bond->dev);
+ break;
+ default:
+ break;
+@@ -4540,18 +4542,27 @@ static void bond_free_all(void)
+
+ /*
+ * Convert string input module parms. Accept either the
+- * number of the mode or its string name.
++ * number of the mode or its string name. A bit complicated because
++ * some mode names are substrings of other names, and calls from sysfs
++ * may have whitespace in the name (trailing newlines, for example).
+ */
+-int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl)
++int bond_parse_parm(const char *buf, struct bond_parm_tbl *tbl)
+ {
+- int i;
++ int mode = -1, i, rv;
++ char modestr[BOND_MAX_MODENAME_LEN + 1] = { 0, };
++
++ rv = sscanf(buf, "%d", &mode);
++ if (!rv) {
++ rv = sscanf(buf, "%20s", modestr);
++ if (!rv)
++ return -1;
++ }
+
+ for (i = 0; tbl[i].modename; i++) {
+- if ((isdigit(*mode_arg) &&
+- tbl[i].mode == simple_strtol(mode_arg, NULL, 0)) ||
+- (strcmp(mode_arg, tbl[i].modename) == 0)) {
++ if (mode == tbl[i].mode)
++ return tbl[i].mode;
++ if (strcmp(modestr, tbl[i].modename) == 0)
+ return tbl[i].mode;
+- }
+ }
+
+ return -1;
+@@ -4865,9 +4876,22 @@ static struct lock_class_key bonding_netdev_xmit_lock_key;
+ int bond_create(char *name, struct bond_params *params, struct bonding **newbond)
+ {
+ struct net_device *bond_dev;
++ struct bonding *bond, *nxt;
+ int res;
+
+ rtnl_lock();
++ down_write(&bonding_rwsem);
++
++ /* Check to see if the bond already exists. */
++ list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
++ if (strnicmp(bond->dev->name, name, IFNAMSIZ) == 0) {
++ printk(KERN_ERR DRV_NAME
++ ": cannot add bond %s; it already exists\n",
++ name);
++ res = -EPERM;
++ goto out_rtnl;
++ }
++
+ bond_dev = alloc_netdev(sizeof(struct bonding), name ? name : "",
+ ether_setup);
+ if (!bond_dev) {
+@@ -4906,10 +4930,12 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond
+
+ netif_carrier_off(bond_dev);
+
++ up_write(&bonding_rwsem);
+ rtnl_unlock(); /* allows sysfs registration of net device */
+ res = bond_create_sysfs_entry(bond_dev->priv);
+ if (res < 0) {
+ rtnl_lock();
++ down_write(&bonding_rwsem);
+ goto out_bond;
+ }
+
+@@ -4920,6 +4946,7 @@ out_bond:
+ out_netdev:
+ free_netdev(bond_dev);
+ out_rtnl:
++ up_write(&bonding_rwsem);
+ rtnl_unlock();
+ return res;
+ }
+@@ -4940,6 +4967,9 @@ static int __init bonding_init(void)
+ #ifdef CONFIG_PROC_FS
+ bond_create_proc_dir();
+ #endif
++
++ init_rwsem(&bonding_rwsem);
++
+ for (i = 0; i < max_bonds; i++) {
+ res = bond_create(NULL, &bonding_defaults, NULL);
+ if (res)
+diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
+index 11b76b3..90a1f31 100644
+--- a/drivers/net/bonding/bond_sysfs.c
++++ b/drivers/net/bonding/bond_sysfs.c
+@@ -109,11 +109,10 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
+ {
+ char command[IFNAMSIZ + 1] = {0, };
+ char *ifname;
+- int res = count;
++ int rv, res = count;
+ struct bonding *bond;
+ struct bonding *nxt;
+
+- down_write(&(bonding_rwsem));
+ sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
+ ifname = command + 1;
+ if ((strlen(command) <= 1) ||
+@@ -121,39 +120,28 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
+ goto err_no_cmd;
+
+ if (command[0] == '+') {
+-
+- /* Check to see if the bond already exists. */
+- list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
+- if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
+- printk(KERN_ERR DRV_NAME
+- ": cannot add bond %s; it already exists\n",
+- ifname);
+- res = -EPERM;
+- goto out;
+- }
+-
+ printk(KERN_INFO DRV_NAME
+ ": %s is being created...\n", ifname);
+- if (bond_create(ifname, &bonding_defaults, &bond)) {
+- printk(KERN_INFO DRV_NAME
+- ": %s interface already exists. Bond creation failed.\n",
+- ifname);
+- res = -EPERM;
++ rv = bond_create(ifname, &bonding_defaults, &bond);
++ if (rv) {
++ printk(KERN_INFO DRV_NAME ": Bond creation failed.\n");
++ res = rv;
+ }
+ goto out;
+ }
+
+ if (command[0] == '-') {
++ rtnl_lock();
++ down_write(&bonding_rwsem);
++
+ list_for_each_entry_safe(bond, nxt, &bond_dev_list, bond_list)
+ if (strnicmp(bond->dev->name, ifname, IFNAMSIZ) == 0) {
+- rtnl_lock();
+ /* check the ref count on the bond's kobject.
+ * If it's > expected, then there's a file open,
+ * and we have to fail.
+ */
+ if (atomic_read(&bond->dev->dev.kobj.kref.refcount)
+ > expected_refcount){
+- rtnl_unlock();
+ printk(KERN_INFO DRV_NAME
+ ": Unable remove bond %s due to open references.\n",
+ ifname);
+@@ -164,6 +152,7 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
+ ": %s is being deleted...\n",
+ bond->dev->name);
+ bond_destroy(bond);
++ up_write(&bonding_rwsem);
+ rtnl_unlock();
+ goto out;
+ }
+@@ -171,6 +160,8 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t
+ printk(KERN_ERR DRV_NAME
+ ": unable to delete non-existent bond %s\n", ifname);
+ res = -ENODEV;
++ up_write(&bonding_rwsem);
++ rtnl_unlock();
+ goto out;
+ }
+
+@@ -183,7 +174,6 @@ err_no_cmd:
+ * get called forever, which is bad.
+ */
+ out:
+- up_write(&(bonding_rwsem));
+ return res;
+ }
+ /* class attribute for bond_masters file. This ends up in /sys/class/net */
+@@ -271,6 +261,9 @@ static ssize_t bonding_store_slaves(struct device *d,
+
+ /* Note: We can't hold bond->lock here, as bond_create grabs it. */
+
++ rtnl_lock();
++ down_write(&(bonding_rwsem));
++
+ sscanf(buffer, "%16s", command); /* IFNAMSIZ*/
+ ifname = command + 1;
+ if ((strlen(command) <= 1) ||
+@@ -336,12 +329,10 @@ static ssize_t bonding_store_slaves(struct device *d,
+ dev->mtu = bond->dev->mtu;
+ }
+ }
+- rtnl_lock();
+ res = bond_enslave(bond->dev, dev);
+ bond_for_each_slave(bond, slave, i)
+ if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0)
+ slave->original_mtu = original_mtu;
+- rtnl_unlock();
+ if (res) {
+ ret = res;
+ }
+@@ -359,12 +350,10 @@ static ssize_t bonding_store_slaves(struct device *d,
+ if (dev) {
+ printk(KERN_INFO DRV_NAME ": %s: Removing slave %s\n",
+ bond->dev->name, dev->name);
+- rtnl_lock();
+ if (bond->setup_by_slave)
+ res = bond_release_and_destroy(bond->dev, dev);
+ else
+ res = bond_release(bond->dev, dev);
+- rtnl_unlock();
+ if (res) {
+ ret = res;
+ goto out;
+@@ -389,6 +378,8 @@ err_no_cmd:
+ ret = -EPERM;
+
+ out:
++ up_write(&(bonding_rwsem));
++ rtnl_unlock();
+ return ret;
+ }
+
+@@ -423,7 +414,7 @@ static ssize_t bonding_store_mode(struct device *d,
+ goto out;
+ }
+
+- new_value = bond_parse_parm((char *)buf, bond_mode_tbl);
++ new_value = bond_parse_parm(buf, bond_mode_tbl);
+ if (new_value < 0) {
+ printk(KERN_ERR DRV_NAME
+ ": %s: Ignoring invalid mode value %.*s.\n",
+@@ -478,7 +469,7 @@ static ssize_t bonding_store_xmit_hash(struct device *d,
+ goto out;
+ }
+
+- new_value = bond_parse_parm((char *)buf, xmit_hashtype_tbl);
++ new_value = bond_parse_parm(buf, xmit_hashtype_tbl);
+ if (new_value < 0) {
+ printk(KERN_ERR DRV_NAME
+ ": %s: Ignoring invalid xmit hash policy value %.*s.\n",
+@@ -518,7 +509,7 @@ static ssize_t bonding_store_arp_validate(struct device *d,
+ int new_value;
+ struct bonding *bond = to_bond(d);
+
+- new_value = bond_parse_parm((char *)buf, arp_validate_tbl);
++ new_value = bond_parse_parm(buf, arp_validate_tbl);
+ if (new_value < 0) {
+ printk(KERN_ERR DRV_NAME
+ ": %s: Ignoring invalid arp_validate value %s\n",
+@@ -941,7 +932,7 @@ static ssize_t bonding_store_lacp(struct device *d,
+ goto out;
+ }
+
+- new_value = bond_parse_parm((char *)buf, bond_lacp_tbl);
++ new_value = bond_parse_parm(buf, bond_lacp_tbl);
+
+ if ((new_value == 1) || (new_value == 0)) {
+ bond->params.lacp_fast = new_value;
+@@ -1075,7 +1066,10 @@ static ssize_t bonding_store_primary(struct device *d,
+ struct slave *slave;
+ struct bonding *bond = to_bond(d);
+
+- write_lock_bh(&bond->lock);
++ rtnl_lock();
++ read_lock(&bond->lock);
++ write_lock_bh(&bond->curr_slave_lock);
++
+ if (!USES_PRIMARY(bond->params.mode)) {
+ printk(KERN_INFO DRV_NAME
+ ": %s: Unable to set primary slave; %s is in mode %d\n",
+@@ -1109,8 +1103,8 @@ static ssize_t bonding_store_primary(struct device *d,
+ }
+ }
+ out:
+- write_unlock_bh(&bond->lock);
+-
++ write_unlock_bh(&bond->curr_slave_lock);
++ read_unlock(&bond->lock);
+ rtnl_unlock();
+
+ return count;
+@@ -1190,7 +1184,8 @@ static ssize_t bonding_store_active_slave(struct device *d,
+ struct bonding *bond = to_bond(d);
+
+ rtnl_lock();
+- write_lock_bh(&bond->lock);
++ read_lock(&bond->lock);
++ write_lock_bh(&bond->curr_slave_lock);
+
+ if (!USES_PRIMARY(bond->params.mode)) {
+ printk(KERN_INFO DRV_NAME
+@@ -1247,7 +1242,8 @@ static ssize_t bonding_store_active_slave(struct device *d,
+ }
+ }
+ out:
+- write_unlock_bh(&bond->lock);
++ write_unlock_bh(&bond->curr_slave_lock);
++ read_unlock(&bond->lock);
+ rtnl_unlock();
+
+ return count;
+@@ -1418,8 +1414,6 @@ int bond_create_sysfs(void)
+ int ret = 0;
+ struct bonding *firstbond;
+
+- init_rwsem(&bonding_rwsem);
+-
+ /* get the netdev class pointer */
+ firstbond = container_of(bond_dev_list.next, struct bonding, bond_list);
+ if (!firstbond)
+diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
+index e1e4734..6d83be4 100644
+--- a/drivers/net/bonding/bonding.h
++++ b/drivers/net/bonding/bonding.h
+@@ -141,6 +141,8 @@ struct bond_parm_tbl {
+ int mode;
+ };
+
++#define BOND_MAX_MODENAME_LEN 20
++
+ struct vlan_entry {
+ struct list_head vlan_list;
+ __be32 vlan_ip;
+@@ -314,7 +316,7 @@ void bond_mii_monitor(struct work_struct *);
+ void bond_loadbalance_arp_mon(struct work_struct *);
+ void bond_activebackup_arp_mon(struct work_struct *);
+ void bond_set_mode_ops(struct bonding *bond, int mode);
+-int bond_parse_parm(char *mode_arg, struct bond_parm_tbl *tbl);
++int bond_parse_parm(const char *mode_arg, struct bond_parm_tbl *tbl);
+ void bond_select_active_slave(struct bonding *bond);
+ void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
+ void bond_register_arp(struct bonding *);
+diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c
+index 6fd95a2..6e12d48 100644
+--- a/drivers/net/cpmac.c
++++ b/drivers/net/cpmac.c
+@@ -459,7 +459,7 @@ static int cpmac_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ return NETDEV_TX_OK;
+
+ len = max(skb->len, ETH_ZLEN);
+- queue = skb->queue_mapping;
++ queue = skb_get_queue_mapping(skb);
+ #ifdef CONFIG_NETDEVICES_MULTIQUEUE
+ netif_stop_subqueue(dev, queue);
+ #else
+diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c
+index 47cce9c..e233d04 100644
+--- a/drivers/net/dl2k.c
++++ b/drivers/net/dl2k.c
+@@ -1316,9 +1316,10 @@ rio_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
+ ("%02x:cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x",
+ i,
+ (u32) (np->tx_ring_dma + i * sizeof (*desc)),
+- (u32) desc->next_desc,
+- (u32) desc->status, (u32) (desc->fraginfo >> 32),
+- (u32) desc->fraginfo);
++ (u32)le64_to_cpu(desc->next_desc),
++ (u32)le64_to_cpu(desc->status),
++ (u32)(le64_to_cpu(desc->fraginfo) >> 32),
++ (u32)le64_to_cpu(desc->fraginfo));
+ printk ("\n");
+ }
+ printk ("\n");
+@@ -1435,7 +1436,7 @@ mii_write (struct net_device *dev, int phy_addr, int reg_num, u16 data)
+ static int
+ mii_wait_link (struct net_device *dev, int wait)
+ {
+- BMSR_t bmsr;
++ __u16 bmsr;
+ int phy_addr;
+ struct netdev_private *np;
+
+@@ -1443,8 +1444,8 @@ mii_wait_link (struct net_device *dev, int wait)
+ phy_addr = np->phy_addr;
+
+ do {
+- bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
+- if (bmsr.bits.link_status)
++ bmsr = mii_read (dev, phy_addr, MII_BMSR);
++ if (bmsr & MII_BMSR_LINK_STATUS)
+ return 0;
+ mdelay (1);
+ } while (--wait > 0);
+@@ -1453,70 +1454,72 @@ mii_wait_link (struct net_device *dev, int wait)
+ static int
+ mii_get_media (struct net_device *dev)
+ {
+- ANAR_t negotiate;
+- BMSR_t bmsr;
+- BMCR_t bmcr;
+- MSCR_t mscr;
+- MSSR_t mssr;
++ __u16 negotiate;
++ __u16 bmsr;
++ __u16 mscr;
++ __u16 mssr;
+ int phy_addr;
+ struct netdev_private *np;
+
+ np = netdev_priv(dev);
+ phy_addr = np->phy_addr;
+
+- bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
++ bmsr = mii_read (dev, phy_addr, MII_BMSR);
+ if (np->an_enable) {
+- if (!bmsr.bits.an_complete) {
++ if (!(bmsr & MII_BMSR_AN_COMPLETE)) {
+ /* Auto-Negotiation not completed */
+ return -1;
+ }
+- negotiate.image = mii_read (dev, phy_addr, MII_ANAR) &
++ negotiate = mii_read (dev, phy_addr, MII_ANAR) &
+ mii_read (dev, phy_addr, MII_ANLPAR);
+- mscr.image = mii_read (dev, phy_addr, MII_MSCR);
+- mssr.image = mii_read (dev, phy_addr, MII_MSSR);
+- if (mscr.bits.media_1000BT_FD & mssr.bits.lp_1000BT_FD) {
++ mscr = mii_read (dev, phy_addr, MII_MSCR);
++ mssr = mii_read (dev, phy_addr, MII_MSSR);
++ if (mscr & MII_MSCR_1000BT_FD && mssr & MII_MSSR_LP_1000BT_FD) {
+ np->speed = 1000;
+ np->full_duplex = 1;
+ printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n");
+- } else if (mscr.bits.media_1000BT_HD & mssr.bits.lp_1000BT_HD) {
++ } else if (mscr & MII_MSCR_1000BT_HD && mssr & MII_MSSR_LP_1000BT_HD) {
+ np->speed = 1000;
+ np->full_duplex = 0;
+ printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n");
+- } else if (negotiate.bits.media_100BX_FD) {
++ } else if (negotiate & MII_ANAR_100BX_FD) {
+ np->speed = 100;
+ np->full_duplex = 1;
+ printk (KERN_INFO "Auto 100 Mbps, Full duplex\n");
+- } else if (negotiate.bits.media_100BX_HD) {
++ } else if (negotiate & MII_ANAR_100BX_HD) {
+ np->speed = 100;
+ np->full_duplex = 0;
+ printk (KERN_INFO "Auto 100 Mbps, Half duplex\n");
+- } else if (negotiate.bits.media_10BT_FD) {
++ } else if (negotiate & MII_ANAR_10BT_FD) {
+ np->speed = 10;
+ np->full_duplex = 1;
+ printk (KERN_INFO "Auto 10 Mbps, Full duplex\n");
+- } else if (negotiate.bits.media_10BT_HD) {
++ } else if (negotiate & MII_ANAR_10BT_HD) {
+ np->speed = 10;
+ np->full_duplex = 0;
+ printk (KERN_INFO "Auto 10 Mbps, Half duplex\n");
+ }
+- if (negotiate.bits.pause) {
++ if (negotiate & MII_ANAR_PAUSE) {
+ np->tx_flow &= 1;
+ np->rx_flow &= 1;
+- } else if (negotiate.bits.asymmetric) {
++ } else if (negotiate & MII_ANAR_ASYMMETRIC) {
+ np->tx_flow = 0;
+ np->rx_flow &= 1;
+ }
+ /* else tx_flow, rx_flow = user select */
+ } else {
+- bmcr.image = mii_read (dev, phy_addr, MII_BMCR);
+- if (bmcr.bits.speed100 == 1 && bmcr.bits.speed1000 == 0) {
++ __u16 bmcr = mii_read (dev, phy_addr, MII_BMCR);
++ switch (bmcr & (MII_BMCR_SPEED_100 | MII_BMCR_SPEED_1000)) {
++ case MII_BMCR_SPEED_1000:
++ printk (KERN_INFO "Operating at 1000 Mbps, ");
++ break;
++ case MII_BMCR_SPEED_100:
+ printk (KERN_INFO "Operating at 100 Mbps, ");
+- } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 0) {
++ break;
++ case 0:
+ printk (KERN_INFO "Operating at 10 Mbps, ");
+- } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 1) {
+- printk (KERN_INFO "Operating at 1000 Mbps, ");
+ }
+- if (bmcr.bits.duplex_mode) {
++ if (bmcr & MII_BMCR_DUPLEX_MODE) {
+ printk ("Full duplex\n");
+ } else {
+ printk ("Half duplex\n");
+@@ -1537,10 +1540,10 @@ mii_get_media (struct net_device *dev)
+ static int
+ mii_set_media (struct net_device *dev)
+ {
+- PHY_SCR_t pscr;
+- BMCR_t bmcr;
+- BMSR_t bmsr;
+- ANAR_t anar;
++ __u16 pscr;
++ __u16 bmcr;
++ __u16 bmsr;
++ __u16 anar;
+ int phy_addr;
+ struct netdev_private *np;
+ np = netdev_priv(dev);
+@@ -1549,76 +1552,77 @@ mii_set_media (struct net_device *dev)
+ /* Does user set speed? */
+ if (np->an_enable) {
+ /* Advertise capabilities */
+- bmsr.image = mii_read (dev, phy_addr, MII_BMSR);
+- anar.image = mii_read (dev, phy_addr, MII_ANAR);
+- anar.bits.media_100BX_FD = bmsr.bits.media_100BX_FD;
+- anar.bits.media_100BX_HD = bmsr.bits.media_100BX_HD;
+- anar.bits.media_100BT4 = bmsr.bits.media_100BT4;
+- anar.bits.media_10BT_FD = bmsr.bits.media_10BT_FD;
+- anar.bits.media_10BT_HD = bmsr.bits.media_10BT_HD;
+- anar.bits.pause = 1;
+- anar.bits.asymmetric = 1;
+- mii_write (dev, phy_addr, MII_ANAR, anar.image);
++ bmsr = mii_read (dev, phy_addr, MII_BMSR);
++ anar = mii_read (dev, phy_addr, MII_ANAR) &
++ ~MII_ANAR_100BX_FD &
++ ~MII_ANAR_100BX_HD &
++ ~MII_ANAR_100BT4 &
++ ~MII_ANAR_10BT_FD &
++ ~MII_ANAR_10BT_HD;
++ if (bmsr & MII_BMSR_100BX_FD)
++ anar |= MII_ANAR_100BX_FD;
++ if (bmsr & MII_BMSR_100BX_HD)
++ anar |= MII_ANAR_100BX_HD;
++ if (bmsr & MII_BMSR_100BT4)
++ anar |= MII_ANAR_100BT4;
++ if (bmsr & MII_BMSR_10BT_FD)
++ anar |= MII_ANAR_10BT_FD;
++ if (bmsr & MII_BMSR_10BT_HD)
++ anar |= MII_ANAR_10BT_HD;
++ anar |= MII_ANAR_PAUSE | MII_ANAR_ASYMMETRIC;
++ mii_write (dev, phy_addr, MII_ANAR, anar);
+
+ /* Enable Auto crossover */
+- pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR);
+- pscr.bits.mdi_crossover_mode = 3; /* 11'b */
+- mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image);
++ pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
++ pscr |= 3 << 5; /* 11'b */
++ mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
+
+ /* Soft reset PHY */
+ mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET);
+- bmcr.image = 0;
+- bmcr.bits.an_enable = 1;
+- bmcr.bits.restart_an = 1;
+- bmcr.bits.reset = 1;
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN | MII_BMCR_RESET;
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay(1);
+ } else {
+ /* Force speed setting */
+ /* 1) Disable Auto crossover */
+- pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR);
+- pscr.bits.mdi_crossover_mode = 0;
+- mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image);
++ pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
++ pscr &= ~(3 << 5);
++ mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
+
+ /* 2) PHY Reset */
+- bmcr.image = mii_read (dev, phy_addr, MII_BMCR);
+- bmcr.bits.reset = 1;
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ bmcr = mii_read (dev, phy_addr, MII_BMCR);
++ bmcr |= MII_BMCR_RESET;
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+
+ /* 3) Power Down */
+- bmcr.image = 0x1940; /* must be 0x1940 */
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ bmcr = 0x1940; /* must be 0x1940 */
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay (100); /* wait a certain time */
+
+ /* 4) Advertise nothing */
+ mii_write (dev, phy_addr, MII_ANAR, 0);
+
+ /* 5) Set media and Power Up */
+- bmcr.image = 0;
+- bmcr.bits.power_down = 1;
++ bmcr = MII_BMCR_POWER_DOWN;
+ if (np->speed == 100) {
+- bmcr.bits.speed100 = 1;
+- bmcr.bits.speed1000 = 0;
++ bmcr |= MII_BMCR_SPEED_100;
+ printk (KERN_INFO "Manual 100 Mbps, ");
+ } else if (np->speed == 10) {
+- bmcr.bits.speed100 = 0;
+- bmcr.bits.speed1000 = 0;
+ printk (KERN_INFO "Manual 10 Mbps, ");
+ }
+ if (np->full_duplex) {
+- bmcr.bits.duplex_mode = 1;
++ bmcr |= MII_BMCR_DUPLEX_MODE;
+ printk ("Full duplex\n");
+ } else {
+- bmcr.bits.duplex_mode = 0;
+ printk ("Half duplex\n");
+ }
+ #if 0
+ /* Set 1000BaseT Master/Slave setting */
+- mscr.image = mii_read (dev, phy_addr, MII_MSCR);
+- mscr.bits.cfg_enable = 1;
+- mscr.bits.cfg_value = 0;
++ mscr = mii_read (dev, phy_addr, MII_MSCR);
++ mscr |= MII_MSCR_CFG_ENABLE;
++ mscr &= ~MII_MSCR_CFG_VALUE = 0;
+ #endif
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay(10);
+ }
+ return 0;
+@@ -1627,43 +1631,42 @@ mii_set_media (struct net_device *dev)
+ static int
+ mii_get_media_pcs (struct net_device *dev)
+ {
+- ANAR_PCS_t negotiate;
+- BMSR_t bmsr;
+- BMCR_t bmcr;
++ __u16 negotiate;
++ __u16 bmsr;
+ int phy_addr;
+ struct netdev_private *np;
+
+ np = netdev_priv(dev);
+ phy_addr = np->phy_addr;
+
+- bmsr.image = mii_read (dev, phy_addr, PCS_BMSR);
++ bmsr = mii_read (dev, phy_addr, PCS_BMSR);
+ if (np->an_enable) {
+- if (!bmsr.bits.an_complete) {
++ if (!(bmsr & MII_BMSR_AN_COMPLETE)) {
+ /* Auto-Negotiation not completed */
+ return -1;
+ }
+- negotiate.image = mii_read (dev, phy_addr, PCS_ANAR) &
++ negotiate = mii_read (dev, phy_addr, PCS_ANAR) &
+ mii_read (dev, phy_addr, PCS_ANLPAR);
+ np->speed = 1000;
+- if (negotiate.bits.full_duplex) {
++ if (negotiate & PCS_ANAR_FULL_DUPLEX) {
+ printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n");
+ np->full_duplex = 1;
+ } else {
+ printk (KERN_INFO "Auto 1000 Mbps, half duplex\n");
+ np->full_duplex = 0;
+ }
+- if (negotiate.bits.pause) {
++ if (negotiate & PCS_ANAR_PAUSE) {
+ np->tx_flow &= 1;
+ np->rx_flow &= 1;
+- } else if (negotiate.bits.asymmetric) {
++ } else if (negotiate & PCS_ANAR_ASYMMETRIC) {
+ np->tx_flow = 0;
+ np->rx_flow &= 1;
+ }
+ /* else tx_flow, rx_flow = user select */
+ } else {
+- bmcr.image = mii_read (dev, phy_addr, PCS_BMCR);
++ __u16 bmcr = mii_read (dev, phy_addr, PCS_BMCR);
+ printk (KERN_INFO "Operating at 1000 Mbps, ");
+- if (bmcr.bits.duplex_mode) {
++ if (bmcr & MII_BMCR_DUPLEX_MODE) {
+ printk ("Full duplex\n");
+ } else {
+ printk ("Half duplex\n");
+@@ -1684,9 +1687,9 @@ mii_get_media_pcs (struct net_device *dev)
+ static int
+ mii_set_media_pcs (struct net_device *dev)
+ {
+- BMCR_t bmcr;
+- ESR_t esr;
+- ANAR_PCS_t anar;
++ __u16 bmcr;
++ __u16 esr;
++ __u16 anar;
+ int phy_addr;
+ struct netdev_private *np;
+ np = netdev_priv(dev);
+@@ -1695,41 +1698,37 @@ mii_set_media_pcs (struct net_device *dev)
+ /* Auto-Negotiation? */
+ if (np->an_enable) {
+ /* Advertise capabilities */
+- esr.image = mii_read (dev, phy_addr, PCS_ESR);
+- anar.image = mii_read (dev, phy_addr, MII_ANAR);
+- anar.bits.half_duplex =
+- esr.bits.media_1000BT_HD | esr.bits.media_1000BX_HD;
+- anar.bits.full_duplex =
+- esr.bits.media_1000BT_FD | esr.bits.media_1000BX_FD;
+- anar.bits.pause = 1;
+- anar.bits.asymmetric = 1;
+- mii_write (dev, phy_addr, MII_ANAR, anar.image);
++ esr = mii_read (dev, phy_addr, PCS_ESR);
++ anar = mii_read (dev, phy_addr, MII_ANAR) &
++ ~PCS_ANAR_HALF_DUPLEX &
++ ~PCS_ANAR_FULL_DUPLEX;
++ if (esr & (MII_ESR_1000BT_HD | MII_ESR_1000BX_HD))
++ anar |= PCS_ANAR_HALF_DUPLEX;
++ if (esr & (MII_ESR_1000BT_FD | MII_ESR_1000BX_FD))
++ anar |= PCS_ANAR_FULL_DUPLEX;
++ anar |= PCS_ANAR_PAUSE | PCS_ANAR_ASYMMETRIC;
++ mii_write (dev, phy_addr, MII_ANAR, anar);
+
+ /* Soft reset PHY */
+ mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET);
+- bmcr.image = 0;
+- bmcr.bits.an_enable = 1;
+- bmcr.bits.restart_an = 1;
+- bmcr.bits.reset = 1;
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN |
++ MII_BMCR_RESET;
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay(1);
+ } else {
+ /* Force speed setting */
+ /* PHY Reset */
+- bmcr.image = 0;
+- bmcr.bits.reset = 1;
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ bmcr = MII_BMCR_RESET;
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay(10);
+- bmcr.image = 0;
+- bmcr.bits.an_enable = 0;
+ if (np->full_duplex) {
+- bmcr.bits.duplex_mode = 1;
++ bmcr = MII_BMCR_DUPLEX_MODE;
+ printk (KERN_INFO "Manual full duplex\n");
+ } else {
+- bmcr.bits.duplex_mode = 0;
++ bmcr = 0;
+ printk (KERN_INFO "Manual half duplex\n");
+ }
+- mii_write (dev, phy_addr, MII_BMCR, bmcr.image);
++ mii_write (dev, phy_addr, MII_BMCR, bmcr);
+ mdelay(10);
+
+ /* Advertise nothing */
+diff --git a/drivers/net/dl2k.h b/drivers/net/dl2k.h
+index 014b77c..d66c605 100644
+--- a/drivers/net/dl2k.h
++++ b/drivers/net/dl2k.h
+@@ -298,23 +298,6 @@ enum _pcs_reg {
+ };
+
+ /* Basic Mode Control Register */
+-typedef union t_MII_BMCR {
+- u16 image;
+- struct {
+- u16 _bit_5_0:6; // bit 5:0
+- u16 speed1000:1; // bit 6
+- u16 col_test_enable:1; // bit 7
+- u16 duplex_mode:1; // bit 8
+- u16 restart_an:1; // bit 9
+- u16 isolate:1; // bit 10
+- u16 power_down:1; // bit 11
+- u16 an_enable:1; // bit 12
+- u16 speed100:1; // bit 13
+- u16 loopback:1; // bit 14
+- u16 reset:1; // bit 15
+- } bits;
+-} BMCR_t, *PBMCR_t;
+-
+ enum _mii_bmcr {
+ MII_BMCR_RESET = 0x8000,
+ MII_BMCR_LOOP_BACK = 0x4000,
+@@ -333,28 +316,6 @@ enum _mii_bmcr {
+ };
+
+ /* Basic Mode Status Register */
+-typedef union t_MII_BMSR {
+- u16 image;
+- struct {
+- u16 ext_capability:1; // bit 0
+- u16 japper_detect:1; // bit 1
+- u16 link_status:1; // bit 2
+- u16 an_ability:1; // bit 3
+- u16 remote_fault:1; // bit 4
+- u16 an_complete:1; // bit 5
+- u16 preamble_supp:1; // bit 6
+- u16 _bit_7:1; // bit 7
+- u16 ext_status:1; // bit 8
+- u16 media_100BT2_HD:1; // bit 9
+- u16 media_100BT2_FD:1; // bit 10
+- u16 media_10BT_HD:1; // bit 11
+- u16 media_10BT_FD:1; // bit 12
+- u16 media_100BX_HD:1; // bit 13
+- u16 media_100BX_FD:1; // bit 14
+- u16 media_100BT4:1; // bit 15
+- } bits;
+-} BMSR_t, *PBMSR_t;
+-
+ enum _mii_bmsr {
+ MII_BMSR_100BT4 = 0x8000,
+ MII_BMSR_100BX_FD = 0x4000,
+@@ -374,24 +335,6 @@ enum _mii_bmsr {
+ };
+
+ /* ANAR */
+-typedef union t_MII_ANAR {
+- u16 image;
+- struct {
+- u16 selector:5; // bit 4:0
+- u16 media_10BT_HD:1; // bit 5
+- u16 media_10BT_FD:1; // bit 6
+- u16 media_100BX_HD:1; // bit 7
+- u16 media_100BX_FD:1; // bit 8
+- u16 media_100BT4:1; // bit 9
+- u16 pause:1; // bit 10
+- u16 asymmetric:1; // bit 11
+- u16 _bit12:1; // bit 12
+- u16 remote_fault:1; // bit 13
+- u16 _bit14:1; // bit 14
+- u16 next_page:1; // bit 15
+- } bits;
+-} ANAR_t, *PANAR_t;
+-
+ enum _mii_anar {
+ MII_ANAR_NEXT_PAGE = 0x8000,
+ MII_ANAR_REMOTE_FAULT = 0x4000,
+@@ -407,24 +350,6 @@ enum _mii_anar {
+ };
+
+ /* ANLPAR */
+-typedef union t_MII_ANLPAR {
+- u16 image;
+- struct {
+- u16 selector:5; // bit 4:0
+- u16 media_10BT_HD:1; // bit 5
+- u16 media_10BT_FD:1; // bit 6
+- u16 media_100BX_HD:1; // bit 7
+- u16 media_100BX_FD:1; // bit 8
+- u16 media_100BT4:1; // bit 9
+- u16 pause:1; // bit 10
+- u16 asymmetric:1; // bit 11
+- u16 _bit12:1; // bit 12
+- u16 remote_fault:1; // bit 13
+- u16 _bit14:1; // bit 14
+- u16 next_page:1; // bit 15
+- } bits;
+-} ANLPAR_t, *PANLPAR_t;
+-
+ enum _mii_anlpar {
+ MII_ANLPAR_NEXT_PAGE = MII_ANAR_NEXT_PAGE,
+ MII_ANLPAR_REMOTE_FAULT = MII_ANAR_REMOTE_FAULT,
+@@ -439,18 +364,6 @@ enum _mii_anlpar {
+ };
+
+ /* Auto-Negotiation Expansion Register */
+-typedef union t_MII_ANER {
+- u16 image;
+- struct {
+- u16 lp_negotiable:1; // bit 0
+- u16 page_received:1; // bit 1
+- u16 nextpagable:1; // bit 2
+- u16 lp_nextpagable:1; // bit 3
+- u16 pdetect_fault:1; // bit 4
+- u16 _bit15_5:11; // bit 15:5
+- } bits;
+-} ANER_t, *PANER_t;
+-
+ enum _mii_aner {
+ MII_ANER_PAR_DETECT_FAULT = 0x0010,
+ MII_ANER_LP_NEXTPAGABLE = 0x0008,
+@@ -460,19 +373,6 @@ enum _mii_aner {
+ };
+
+ /* MASTER-SLAVE Control Register */
+-typedef union t_MII_MSCR {
+- u16 image;
+- struct {
+- u16 _bit_7_0:8; // bit 7:0
+- u16 media_1000BT_HD:1; // bit 8
+- u16 media_1000BT_FD:1; // bit 9
+- u16 port_type:1; // bit 10
+- u16 cfg_value:1; // bit 11
+- u16 cfg_enable:1; // bit 12
+- u16 test_mode:3; // bit 15:13
+- } bits;
+-} MSCR_t, *PMSCR_t;
+-
+ enum _mii_mscr {
+ MII_MSCR_TEST_MODE = 0xe000,
+ MII_MSCR_CFG_ENABLE = 0x1000,
+@@ -483,20 +383,6 @@ enum _mii_mscr {
+ };
+
+ /* MASTER-SLAVE Status Register */
+-typedef union t_MII_MSSR {
+- u16 image;
+- struct {
+- u16 idle_err_count:8; // bit 7:0
+- u16 _bit_9_8:2; // bit 9:8
+- u16 lp_1000BT_HD:1; // bit 10
+- u16 lp_1000BT_FD:1; // bit 11
+- u16 remote_rcv_status:1; // bit 12
+- u16 local_rcv_status:1; // bit 13
+- u16 cfg_resolution:1; // bit 14
+- u16 cfg_fault:1; // bit 15
+- } bits;
+-} MSSR_t, *PMSSR_t;
+-
+ enum _mii_mssr {
+ MII_MSSR_CFG_FAULT = 0x8000,
+ MII_MSSR_CFG_RES = 0x4000,
+@@ -508,17 +394,6 @@ enum _mii_mssr {
+ };
+
+ /* IEEE Extened Status Register */
+-typedef union t_MII_ESR {
+- u16 image;
+- struct {
+- u16 _bit_11_0:12; // bit 11:0
+- u16 media_1000BT_HD:2; // bit 12
+- u16 media_1000BT_FD:1; // bit 13
+- u16 media_1000BX_HD:1; // bit 14
+- u16 media_1000BX_FD:1; // bit 15
+- } bits;
+-} ESR_t, *PESR_t;
+-
+ enum _mii_esr {
+ MII_ESR_1000BX_FD = 0x8000,
+ MII_ESR_1000BX_HD = 0x4000,
+@@ -526,6 +401,7 @@ enum _mii_esr {
+ MII_ESR_1000BT_HD = 0x1000,
+ };
+ /* PHY Specific Control Register */
++#if 0
+ typedef union t_MII_PHY_SCR {
+ u16 image;
+ struct {
+@@ -543,6 +419,7 @@ typedef union t_MII_PHY_SCR {
+ u16 xmit_fifo_depth:2; // bit 15:14
+ } bits;
+ } PHY_SCR_t, *PPHY_SCR_t;
++#endif
+
+ typedef enum t_MII_ADMIN_STATUS {
+ adm_reset,
+@@ -556,21 +433,6 @@ typedef enum t_MII_ADMIN_STATUS {
+ /* PCS control and status registers bitmap as the same as MII */
+ /* PCS Extended Status register bitmap as the same as MII */
+ /* PCS ANAR */
+-typedef union t_PCS_ANAR {
+- u16 image;
+- struct {
+- u16 _bit_4_0:5; // bit 4:0
+- u16 full_duplex:1; // bit 5
+- u16 half_duplex:1; // bit 6
+- u16 asymmetric:1; // bit 7
+- u16 pause:1; // bit 8
+- u16 _bit_11_9:3; // bit 11:9
+- u16 remote_fault:2; // bit 13:12
+- u16 _bit_14:1; // bit 14
+- u16 next_page:1; // bit 15
+- } bits;
+-} ANAR_PCS_t, *PANAR_PCS_t;
+-
+ enum _pcs_anar {
+ PCS_ANAR_NEXT_PAGE = 0x8000,
+ PCS_ANAR_REMOTE_FAULT = 0x3000,
+@@ -580,21 +442,6 @@ enum _pcs_anar {
+ PCS_ANAR_FULL_DUPLEX = 0x0020,
+ };
+ /* PCS ANLPAR */
+-typedef union t_PCS_ANLPAR {
+- u16 image;
+- struct {
+- u16 _bit_4_0:5; // bit 4:0
+- u16 full_duplex:1; // bit 5
+- u16 half_duplex:1; // bit 6
+- u16 asymmetric:1; // bit 7
+- u16 pause:1; // bit 8
+- u16 _bit_11_9:3; // bit 11:9
+- u16 remote_fault:2; // bit 13:12
+- u16 _bit_14:1; // bit 14
+- u16 next_page:1; // bit 15
+- } bits;
+-} ANLPAR_PCS_t, *PANLPAR_PCS_t;
+-
+ enum _pcs_anlpar {
+ PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
+ PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index 13d57b0..76c0fa6 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -632,6 +632,7 @@ e1000_down(struct e1000_adapter *adapter)
+
+ #ifdef CONFIG_E1000_NAPI
+ napi_disable(&adapter->napi);
++ atomic_set(&adapter->irq_sem, 0);
+ #endif
+ e1000_irq_disable(adapter);
+
+@@ -3919,7 +3920,7 @@ e1000_clean(struct napi_struct *napi, int budget)
+ {
+ struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+ struct net_device *poll_dev = adapter->netdev;
+- int work_done = 0;
++ int tx_cleaned = 0, work_done = 0;
+
+ /* Must NOT use netdev_priv macro here. */
+ adapter = poll_dev->priv;
+@@ -3929,14 +3930,17 @@ e1000_clean(struct napi_struct *napi, int budget)
+ * simultaneously. A failure obtaining the lock means
+ * tx_ring[0] is currently being cleaned anyway. */
+ if (spin_trylock(&adapter->tx_queue_lock)) {
+- e1000_clean_tx_irq(adapter,
+- &adapter->tx_ring[0]);
++ tx_cleaned = e1000_clean_tx_irq(adapter,
++ &adapter->tx_ring[0]);
+ spin_unlock(&adapter->tx_queue_lock);
+ }
+
+ adapter->clean_rx(adapter, &adapter->rx_ring[0],
+ &work_done, budget);
+
++ if (tx_cleaned)
++ work_done = budget;
++
+ /* If budget not fully consumed, exit the polling mode */
+ if (work_done < budget) {
+ if (likely(adapter->itr_setting & 3))
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index 4a6fc74..9cc5a6b 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -1384,7 +1384,7 @@ static int e1000_clean(struct napi_struct *napi, int budget)
+ {
+ struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi);
+ struct net_device *poll_dev = adapter->netdev;
+- int work_done = 0;
++ int tx_cleaned = 0, work_done = 0;
+
+ /* Must NOT use netdev_priv macro here. */
+ adapter = poll_dev->priv;
+@@ -1394,12 +1394,15 @@ static int e1000_clean(struct napi_struct *napi, int budget)
+ * simultaneously. A failure obtaining the lock means
+ * tx_ring is currently being cleaned anyway. */
+ if (spin_trylock(&adapter->tx_queue_lock)) {
+- e1000_clean_tx_irq(adapter);
++ tx_cleaned = e1000_clean_tx_irq(adapter);
+ spin_unlock(&adapter->tx_queue_lock);
+ }
+
+ adapter->clean_rx(adapter, &work_done, budget);
+
++ if (tx_cleaned)
++ work_done = budget;
++
+ /* If budget not fully consumed, exit the polling mode */
+ if (work_done < budget) {
+ if (adapter->itr_setting & 3)
+@@ -2180,6 +2183,7 @@ void e1000e_down(struct e1000_adapter *adapter)
+ msleep(10);
+
+ napi_disable(&adapter->napi);
++ atomic_set(&adapter->irq_sem, 0);
+ e1000_irq_disable(adapter);
+
+ del_timer_sync(&adapter->watchdog_timer);
+diff --git a/drivers/net/ipg.c b/drivers/net/ipg.c
+index dbd23bb..50f0c17 100644
+--- a/drivers/net/ipg.c
++++ b/drivers/net/ipg.c
+@@ -857,21 +857,14 @@ static void init_tfdlist(struct net_device *dev)
+ static void ipg_nic_txfree(struct net_device *dev)
+ {
+ struct ipg_nic_private *sp = netdev_priv(dev);
+- void __iomem *ioaddr = sp->ioaddr;
+- unsigned int curr;
+- u64 txd_map;
+- unsigned int released, pending;
+-
+- txd_map = (u64)sp->txd_map;
+- curr = ipg_r32(TFD_LIST_PTR_0) -
+- do_div(txd_map, sizeof(struct ipg_tx)) - 1;
++ unsigned int released, pending, dirty;
+
+ IPG_DEBUG_MSG("_nic_txfree\n");
+
+ pending = sp->tx_current - sp->tx_dirty;
++ dirty = sp->tx_dirty % IPG_TFDLIST_LENGTH;
+
+ for (released = 0; released < pending; released++) {
+- unsigned int dirty = sp->tx_dirty % IPG_TFDLIST_LENGTH;
+ struct sk_buff *skb = sp->TxBuff[dirty];
+ struct ipg_tx *txfd = sp->txd + dirty;
+
+@@ -882,11 +875,8 @@ static void ipg_nic_txfree(struct net_device *dev)
+ * If the TFDDone bit is set, free the associated
+ * buffer.
+ */
+- if (dirty == curr)
+- break;
+-
+- /* Setup TFDDONE for compatible issue. */
+- txfd->tfc |= cpu_to_le64(IPG_TFC_TFDDONE);
++ if (!(txfd->tfc & cpu_to_le64(IPG_TFC_TFDDONE)))
++ break;
+
+ /* Free the transmit buffer. */
+ if (skb) {
+@@ -898,6 +888,7 @@ static void ipg_nic_txfree(struct net_device *dev)
+
+ sp->TxBuff[dirty] = NULL;
+ }
++ dirty = (dirty + 1) % IPG_TFDLIST_LENGTH;
+ }
+
+ sp->tx_dirty += released;
+@@ -1630,6 +1621,8 @@ static irqreturn_t ipg_interrupt_handler(int irq, void *dev_inst)
+ #ifdef JUMBO_FRAME
+ ipg_nic_rxrestore(dev);
+ #endif
++ spin_lock(&sp->lock);
++
+ /* Get interrupt source information, and acknowledge
+ * some (i.e. TxDMAComplete, RxDMAComplete, RxEarly,
+ * IntRequested, MacControlFrame, LinkEvent) interrupts
+@@ -1647,9 +1640,7 @@ static irqreturn_t ipg_interrupt_handler(int irq, void *dev_inst)
+ handled = 1;
+
+ if (unlikely(!netif_running(dev)))
+- goto out;
+-
+- spin_lock(&sp->lock);
++ goto out_unlock;
+
+ /* If RFDListEnd interrupt, restore all used RFDs. */
+ if (status & IPG_IS_RFD_LIST_END) {
+@@ -1733,9 +1724,9 @@ out_enable:
+ ipg_w16(IPG_IE_TX_DMA_COMPLETE | IPG_IE_RX_DMA_COMPLETE |
+ IPG_IE_HOST_ERROR | IPG_IE_INT_REQUESTED | IPG_IE_TX_COMPLETE |
+ IPG_IE_LINK_EVENT | IPG_IE_UPDATE_STATS, INT_ENABLE);
+-
++out_unlock:
+ spin_unlock(&sp->lock);
+-out:
++
+ return IRQ_RETVAL(handled);
+ }
+
+@@ -1943,10 +1934,7 @@ static int ipg_nic_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ */
+ if (sp->tenmbpsmode)
+ txfd->tfc |= cpu_to_le64(IPG_TFC_TXINDICATE);
+- else if (!((sp->tx_current - sp->tx_dirty + 1) >
+- IPG_FRAMESBETWEENTXDMACOMPLETES)) {
+- txfd->tfc |= cpu_to_le64(IPG_TFC_TXDMAINDICATE);
+- }
++ txfd->tfc |= cpu_to_le64(IPG_TFC_TXDMAINDICATE);
+ /* Based on compilation option, determine if FCS is to be
+ * appended to transmit frame by IPG.
+ */
+@@ -2003,7 +1991,7 @@ static int ipg_nic_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ ipg_w32(IPG_DC_TX_DMA_POLL_NOW, DMA_CTRL);
+
+ if (sp->tx_current == (sp->tx_dirty + IPG_TFDLIST_LENGTH))
+- netif_wake_queue(dev);
++ netif_stop_queue(dev);
+
+ spin_unlock_irqrestore(&sp->lock, flags);
+
+diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
+index d2fb88d..4f63839 100644
+--- a/drivers/net/ixgb/ixgb_main.c
++++ b/drivers/net/ixgb/ixgb_main.c
+@@ -296,6 +296,11 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog)
+ {
+ struct net_device *netdev = adapter->netdev;
+
++#ifdef CONFIG_IXGB_NAPI
++ napi_disable(&adapter->napi);
++ atomic_set(&adapter->irq_sem, 0);
++#endif
++
+ ixgb_irq_disable(adapter);
+ free_irq(adapter->pdev->irq, netdev);
+
+@@ -304,9 +309,7 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog)
+
+ if(kill_watchdog)
+ del_timer_sync(&adapter->watchdog_timer);
+-#ifdef CONFIG_IXGB_NAPI
+- napi_disable(&adapter->napi);
+-#endif
++
+ adapter->link_speed = 0;
+ adapter->link_duplex = 0;
+ netif_carrier_off(netdev);
+diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
+index a564916..a4265bc 100644
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -1409,9 +1409,11 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
+ IXGBE_WRITE_FLUSH(&adapter->hw);
+ msleep(10);
+
++ napi_disable(&adapter->napi);
++ atomic_set(&adapter->irq_sem, 0);
++
+ ixgbe_irq_disable(adapter);
+
+- napi_disable(&adapter->napi);
+ del_timer_sync(&adapter->watchdog_timer);
+
+ netif_carrier_off(netdev);
+@@ -1468,13 +1470,16 @@ static int ixgbe_clean(struct napi_struct *napi, int budget)
+ struct ixgbe_adapter *adapter = container_of(napi,
+ struct ixgbe_adapter, napi);
+ struct net_device *netdev = adapter->netdev;
+- int work_done = 0;
++ int tx_cleaned = 0, work_done = 0;
+
+ /* In non-MSIX case, there is no multi-Tx/Rx queue */
+- ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
++ tx_cleaned = ixgbe_clean_tx_irq(adapter, adapter->tx_ring);
+ ixgbe_clean_rx_irq(adapter, &adapter->rx_ring[0], &work_done,
+ budget);
+
++ if (tx_cleaned)
++ work_done = budget;
++
+ /* If budget not fully consumed, exit the polling mode */
+ if (work_done < budget) {
+ netif_rx_complete(netdev, napi);
+diff --git a/drivers/net/niu.c b/drivers/net/niu.c
+index 3bbcea1..5f6beab 100644
+--- a/drivers/net/niu.c
++++ b/drivers/net/niu.c
+@@ -1319,6 +1319,7 @@ static int link_status_10g(struct niu *np, int *link_up_p)
+
+ static int link_status_1g(struct niu *np, int *link_up_p)
+ {
++ struct niu_link_config *lp = &np->link_config;
+ u16 current_speed, bmsr;
+ unsigned long flags;
+ u8 current_duplex;
+@@ -1386,6 +1387,8 @@ static int link_status_1g(struct niu *np, int *link_up_p)
+ link_up = 0;
+ }
+ }
++ lp->active_speed = current_speed;
++ lp->active_duplex = current_duplex;
+ err = 0;
+
+ out:
+diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
+index 2881777..36a7ba3 100644
+--- a/drivers/net/pcmcia/3c574_cs.c
++++ b/drivers/net/pcmcia/3c574_cs.c
+@@ -187,14 +187,16 @@ enum Window1 {
+ enum Window3 { /* Window 3: MAC/config bits. */
+ Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
+ };
+-union wn3_config {
+- int i;
+- struct w3_config_fields {
+- unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
+- int pad8:8;
+- unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1;
+- int pad24:7;
+- } u;
++enum wn3_config {
++ Ram_size = 7,
++ Ram_width = 8,
++ Ram_speed = 0x30,
++ Rom_size = 0xc0,
++ Ram_split_shift = 16,
++ Ram_split = 3 << Ram_split_shift,
++ Xcvr_shift = 20,
++ Xcvr = 7 << Xcvr_shift,
++ Autoselect = 0x1000000,
+ };
+
+ enum Window4 { /* Window 4: Xcvr/media bits. */
+@@ -342,7 +344,7 @@ static int tc574_config(struct pcmcia_device *link)
+ kio_addr_t ioaddr;
+ __be16 *phys_addr;
+ char *cardname;
+- union wn3_config config;
++ __u32 config;
+ DECLARE_MAC_BUF(mac);
+
+ phys_addr = (__be16 *)dev->dev_addr;
+@@ -401,9 +403,9 @@ static int tc574_config(struct pcmcia_device *link)
+ outw(0<<11, ioaddr + RunnerRdCtrl);
+ printk(KERN_INFO " ASIC rev %d,", mcr>>3);
+ EL3WINDOW(3);
+- config.i = inl(ioaddr + Wn3_Config);
+- lp->default_media = config.u.xcvr;
+- lp->autoselect = config.u.autoselect;
++ config = inl(ioaddr + Wn3_Config);
++ lp->default_media = (config & Xcvr) >> Xcvr_shift;
++ lp->autoselect = config & Autoselect ? 1 : 0;
+ }
+
+ init_timer(&lp->media);
+@@ -464,8 +466,9 @@ static int tc574_config(struct pcmcia_device *link)
+ dev->name, cardname, dev->base_addr, dev->irq,
+ print_mac(mac, dev->dev_addr));
+ printk(" %dK FIFO split %s Rx:Tx, %sMII interface.\n",
+- 8 << config.u.ram_size, ram_split[config.u.ram_split],
+- config.u.autoselect ? "autoselect " : "");
++ 8 << config & Ram_size,
++ ram_split[(config & Ram_split) >> Ram_split_shift],
++ config & Autoselect ? "autoselect " : "");
+
+ return 0;
+
+diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
+index fa57c49..f2ba944 100644
+--- a/drivers/net/s2io.c
++++ b/drivers/net/s2io.c
+@@ -84,7 +84,7 @@
+ #include "s2io.h"
+ #include "s2io-regs.h"
+
+-#define DRV_VERSION "2.0.26.10"
++#define DRV_VERSION "2.0.26.17"
+
+ /* S2io Driver name & version. */
+ static char s2io_driver_name[] = "Neterion";
+@@ -3848,8 +3848,6 @@ static int s2io_open(struct net_device *dev)
+ netif_carrier_off(dev);
+ sp->last_link_state = 0;
+
+- napi_enable(&sp->napi);
+-
+ if (sp->config.intr_type == MSI_X) {
+ int ret = s2io_enable_msi_x(sp);
+
+@@ -3892,7 +3890,6 @@ static int s2io_open(struct net_device *dev)
+ return 0;
+
+ hw_init_failed:
+- napi_disable(&sp->napi);
+ if (sp->config.intr_type == MSI_X) {
+ if (sp->entries) {
+ kfree(sp->entries);
+@@ -3932,7 +3929,6 @@ static int s2io_close(struct net_device *dev)
+ return 0;
+
+ netif_stop_queue(dev);
+- napi_disable(&sp->napi);
+ /* Reset card, kill tasklet and free Tx and Rx buffers. */
+ s2io_card_down(sp);
+
+@@ -6796,6 +6792,8 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io)
+ struct XENA_dev_config __iomem *bar0 = sp->bar0;
+ unsigned long flags;
+ register u64 val64 = 0;
++ struct config_param *config;
++ config = &sp->config;
+
+ if (!is_s2io_card_up(sp))
+ return;
+@@ -6807,6 +6805,10 @@ static void do_s2io_card_down(struct s2io_nic * sp, int do_io)
+ }
+ clear_bit(__S2IO_STATE_CARD_UP, &sp->state);
+
++ /* Disable napi */
++ if (config->napi)
++ napi_disable(&sp->napi);
++
+ /* disable Tx and Rx traffic on the NIC */
+ if (do_io)
+ stop_nic(sp);
+@@ -6900,6 +6902,11 @@ static int s2io_card_up(struct s2io_nic * sp)
+ DBG_PRINT(INFO_DBG, "Buf in ring:%d is %d:\n", i,
+ atomic_read(&sp->rx_bufs_left[i]));
+ }
++
++ /* Initialise napi */
++ if (config->napi)
++ napi_enable(&sp->napi);
++
+ /* Maintain the state prior to the open */
+ if (sp->promisc_flg)
+ sp->promisc_flg = 0;
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index 7023bbe..bc15940 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -3949,7 +3949,7 @@ static __exit void sky2_debug_cleanup(void)
+ /* Initialize network device */
+ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
+ unsigned port,
+- int highmem)
++ int highmem, int wol)
+ {
+ struct sky2_port *sky2;
+ struct net_device *dev = alloc_etherdev(sizeof(*sky2));
+@@ -3989,7 +3989,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
+ sky2->speed = -1;
+ sky2->advertising = sky2_supported_modes(hw);
+ sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
+- sky2->wol = sky2_wol_supported(hw) & WAKE_MAGIC;
++ sky2->wol = wol;
+
+ spin_lock_init(&sky2->phy_lock);
+ sky2->tx_pending = TX_DEF_PENDING;
+@@ -4086,12 +4086,24 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
+ return err;
+ }
+
++static int __devinit pci_wake_enabled(struct pci_dev *dev)
++{
++ int pm = pci_find_capability(dev, PCI_CAP_ID_PM);
++ u16 value;
++
++ if (!pm)
++ return 0;
++ if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value))
++ return 0;
++ return value & PCI_PM_CTRL_PME_ENABLE;
++}
++
+ static int __devinit sky2_probe(struct pci_dev *pdev,
+ const struct pci_device_id *ent)
+ {
+ struct net_device *dev;
+ struct sky2_hw *hw;
+- int err, using_dac = 0;
++ int err, using_dac = 0, wol_default;
+
+ err = pci_enable_device(pdev);
+ if (err) {
+@@ -4124,6 +4136,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+ }
+ }
+
++ wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0;
++
+ err = -ENOMEM;
+ hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+ if (!hw) {
+@@ -4167,7 +4181,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+
+ sky2_reset(hw);
+
+- dev = sky2_init_netdev(hw, 0, using_dac);
++ dev = sky2_init_netdev(hw, 0, using_dac, wol_default);
+ if (!dev) {
+ err = -ENOMEM;
+ goto err_out_free_pci;
+@@ -4204,7 +4218,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+ if (hw->ports > 1) {
+ struct net_device *dev1;
+
+- dev1 = sky2_init_netdev(hw, 1, using_dac);
++ dev1 = sky2_init_netdev(hw, 1, using_dac, wol_default);
+ if (!dev1)
+ dev_warn(&pdev->dev, "allocation for second device failed\n");
+ else if ((err = register_netdev(dev1))) {
+diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c
+index d887c05..370d329 100644
+--- a/drivers/net/tc35815.c
++++ b/drivers/net/tc35815.c
+@@ -611,7 +611,7 @@ static int __devinit tc35815_mac_match(struct device *dev, void *data)
+ {
+ struct platform_device *plat_dev = to_platform_device(dev);
+ struct pci_dev *pci_dev = data;
+- unsigned int id = (pci_dev->bus->number << 8) | pci_dev->devfn;
++ unsigned int id = pci_dev->irq;
+ return !strcmp(plat_dev->name, "tc35815-mac") && plat_dev->id == id;
+ }
+
+diff --git a/drivers/net/veth.c b/drivers/net/veth.c
+index 43af9e9..3f67a29 100644
+--- a/drivers/net/veth.c
++++ b/drivers/net/veth.c
+@@ -459,19 +459,7 @@ static __init int veth_init(void)
+
+ static __exit void veth_exit(void)
+ {
+- struct veth_priv *priv, *next;
+-
+- rtnl_lock();
+- /*
+- * cannot trust __rtnl_link_unregister() to unregister all
+- * devices, as each ->dellink call will remove two devices
+- * from the list at once.
+- */
+- list_for_each_entry_safe(priv, next, &veth_list, list)
+- veth_dellink(priv->dev);
+-
+- __rtnl_link_unregister(&veth_link_ops);
+- rtnl_unlock();
++ rtnl_link_unregister(&veth_link_ops);
+ }
+
+ module_init(veth_init);
+diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c
+index 33dc713..c6f26e2 100644
+--- a/drivers/net/wan/dscc4.c
++++ b/drivers/net/wan/dscc4.c
+@@ -139,19 +139,21 @@ struct thingie {
+ };
+
+ struct TxFD {
+- u32 state;
+- u32 next;
+- u32 data;
+- u32 complete;
++ __le32 state;
++ __le32 next;
++ __le32 data;
++ __le32 complete;
+ u32 jiffies; /* Allows sizeof(TxFD) == sizeof(RxFD) + extra hack */
++ /* FWIW, datasheet calls that "dummy" and says that card
++ * never looks at it; neither does the driver */
+ };
+
+ struct RxFD {
+- u32 state1;
+- u32 next;
+- u32 data;
+- u32 state2;
+- u32 end;
++ __le32 state1;
++ __le32 next;
++ __le32 data;
++ __le32 state2;
++ __le32 end;
+ };
+
+ #define DUMMY_SKB_SIZE 64
+@@ -181,7 +183,7 @@ struct RxFD {
+ #define SCC_REG_START(dpriv) (SCC_START+(dpriv->dev_id)*SCC_OFFSET)
+
+ struct dscc4_pci_priv {
+- u32 *iqcfg;
++ __le32 *iqcfg;
+ int cfg_cur;
+ spinlock_t lock;
+ struct pci_dev *pdev;
+@@ -197,8 +199,8 @@ struct dscc4_dev_priv {
+
+ struct RxFD *rx_fd;
+ struct TxFD *tx_fd;
+- u32 *iqrx;
+- u32 *iqtx;
++ __le32 *iqrx;
++ __le32 *iqtx;
+
+ /* FIXME: check all the volatile are required */
+ volatile u32 tx_current;
+@@ -298,7 +300,7 @@ struct dscc4_dev_priv {
+ #define BrrExpMask 0x00000f00
+ #define BrrMultMask 0x0000003f
+ #define EncodingMask 0x00700000
+-#define Hold 0x40000000
++#define Hold cpu_to_le32(0x40000000)
+ #define SccBusy 0x10000000
+ #define PowerUp 0x80000000
+ #define Vis 0x00001000
+@@ -307,14 +309,14 @@ struct dscc4_dev_priv {
+ #define FrameRdo 0x40
+ #define FrameCrc 0x20
+ #define FrameRab 0x10
+-#define FrameAborted 0x00000200
+-#define FrameEnd 0x80000000
+-#define DataComplete 0x40000000
++#define FrameAborted cpu_to_le32(0x00000200)
++#define FrameEnd cpu_to_le32(0x80000000)
++#define DataComplete cpu_to_le32(0x40000000)
+ #define LengthCheck 0x00008000
+ #define SccEvt 0x02000000
+ #define NoAck 0x00000200
+ #define Action 0x00000001
+-#define HiDesc 0x20000000
++#define HiDesc cpu_to_le32(0x20000000)
+
+ /* SCC events */
+ #define RxEvt 0xf0000000
+@@ -489,8 +491,8 @@ static void dscc4_release_ring(struct dscc4_dev_priv *dpriv)
+ skbuff = dpriv->tx_skbuff;
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ if (*skbuff) {
+- pci_unmap_single(pdev, tx_fd->data, (*skbuff)->len,
+- PCI_DMA_TODEVICE);
++ pci_unmap_single(pdev, le32_to_cpu(tx_fd->data),
++ (*skbuff)->len, PCI_DMA_TODEVICE);
+ dev_kfree_skb(*skbuff);
+ }
+ skbuff++;
+@@ -500,7 +502,7 @@ static void dscc4_release_ring(struct dscc4_dev_priv *dpriv)
+ skbuff = dpriv->rx_skbuff;
+ for (i = 0; i < RX_RING_SIZE; i++) {
+ if (*skbuff) {
+- pci_unmap_single(pdev, rx_fd->data,
++ pci_unmap_single(pdev, le32_to_cpu(rx_fd->data),
+ RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
+ dev_kfree_skb(*skbuff);
+ }
+@@ -522,10 +524,10 @@ static inline int try_get_rx_skb(struct dscc4_dev_priv *dpriv,
+ dpriv->rx_skbuff[dirty] = skb;
+ if (skb) {
+ skb->protocol = hdlc_type_trans(skb, dev);
+- rx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data,
+- len, PCI_DMA_FROMDEVICE);
++ rx_fd->data = cpu_to_le32(pci_map_single(dpriv->pci_priv->pdev,
++ skb->data, len, PCI_DMA_FROMDEVICE));
+ } else {
+- rx_fd->data = (u32) NULL;
++ rx_fd->data = 0;
+ ret = -1;
+ }
+ return ret;
+@@ -587,7 +589,7 @@ static inline int dscc4_xpr_ack(struct dscc4_dev_priv *dpriv)
+
+ do {
+ if (!(dpriv->flags & (NeedIDR | NeedIDT)) ||
+- (dpriv->iqtx[cur] & Xpr))
++ (dpriv->iqtx[cur] & cpu_to_le32(Xpr)))
+ break;
+ smp_rmb();
+ schedule_timeout_uninterruptible(10);
+@@ -650,8 +652,9 @@ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv,
+ printk(KERN_DEBUG "%s: skb=0 (%s)\n", dev->name, __FUNCTION__);
+ goto refill;
+ }
+- pkt_len = TO_SIZE(rx_fd->state2);
+- pci_unmap_single(pdev, rx_fd->data, RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
++ pkt_len = TO_SIZE(le32_to_cpu(rx_fd->state2));
++ pci_unmap_single(pdev, le32_to_cpu(rx_fd->data),
++ RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
+ if ((skb->data[--pkt_len] & FrameOk) == FrameOk) {
+ stats->rx_packets++;
+ stats->rx_bytes += pkt_len;
+@@ -679,7 +682,7 @@ refill:
+ }
+ dscc4_rx_update(dpriv, dev);
+ rx_fd->state2 = 0x00000000;
+- rx_fd->end = 0xbabeface;
++ rx_fd->end = cpu_to_le32(0xbabeface);
+ }
+
+ static void dscc4_free1(struct pci_dev *pdev)
+@@ -772,8 +775,8 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
+ }
+ /* Global interrupt queue */
+ writel((u32)(((IRQ_RING_SIZE >> 5) - 1) << 20), ioaddr + IQLENR1);
+- priv->iqcfg = (u32 *) pci_alloc_consistent(pdev,
+- IRQ_RING_SIZE*sizeof(u32), &priv->iqcfg_dma);
++ priv->iqcfg = (__le32 *) pci_alloc_consistent(pdev,
++ IRQ_RING_SIZE*sizeof(__le32), &priv->iqcfg_dma);
+ if (!priv->iqcfg)
+ goto err_free_irq_5;
+ writel(priv->iqcfg_dma, ioaddr + IQCFG);
+@@ -786,7 +789,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
+ */
+ for (i = 0; i < dev_per_card; i++) {
+ dpriv = priv->root + i;
+- dpriv->iqtx = (u32 *) pci_alloc_consistent(pdev,
++ dpriv->iqtx = (__le32 *) pci_alloc_consistent(pdev,
+ IRQ_RING_SIZE*sizeof(u32), &dpriv->iqtx_dma);
+ if (!dpriv->iqtx)
+ goto err_free_iqtx_6;
+@@ -794,7 +797,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
+ }
+ for (i = 0; i < dev_per_card; i++) {
+ dpriv = priv->root + i;
+- dpriv->iqrx = (u32 *) pci_alloc_consistent(pdev,
++ dpriv->iqrx = (__le32 *) pci_alloc_consistent(pdev,
+ IRQ_RING_SIZE*sizeof(u32), &dpriv->iqrx_dma);
+ if (!dpriv->iqrx)
+ goto err_free_iqrx_7;
+@@ -1156,8 +1159,8 @@ static int dscc4_start_xmit(struct sk_buff *skb, struct net_device *dev)
+ dpriv->tx_skbuff[next] = skb;
+ tx_fd = dpriv->tx_fd + next;
+ tx_fd->state = FrameEnd | TO_STATE_TX(skb->len);
+- tx_fd->data = pci_map_single(ppriv->pdev, skb->data, skb->len,
+- PCI_DMA_TODEVICE);
++ tx_fd->data = cpu_to_le32(pci_map_single(ppriv->pdev, skb->data, skb->len,
++ PCI_DMA_TODEVICE));
+ tx_fd->complete = 0x00000000;
+ tx_fd->jiffies = jiffies;
+ mb();
+@@ -1508,7 +1511,7 @@ static irqreturn_t dscc4_irq(int irq, void *token)
+ if (state & Cfg) {
+ if (debug > 0)
+ printk(KERN_DEBUG "%s: CfgIV\n", DRV_NAME);
+- if (priv->iqcfg[priv->cfg_cur++%IRQ_RING_SIZE] & Arf)
++ if (priv->iqcfg[priv->cfg_cur++%IRQ_RING_SIZE] & cpu_to_le32(Arf))
+ printk(KERN_ERR "%s: %s failed\n", dev->name, "CFG");
+ if (!(state &= ~Cfg))
+ goto out;
+@@ -1541,7 +1544,7 @@ static void dscc4_tx_irq(struct dscc4_pci_priv *ppriv,
+
+ try:
+ cur = dpriv->iqtx_current%IRQ_RING_SIZE;
+- state = dpriv->iqtx[cur];
++ state = le32_to_cpu(dpriv->iqtx[cur]);
+ if (!state) {
+ if (debug > 4)
+ printk(KERN_DEBUG "%s: Tx ISR = 0x%08x\n", dev->name,
+@@ -1580,7 +1583,7 @@ try:
+ tx_fd = dpriv->tx_fd + cur;
+ skb = dpriv->tx_skbuff[cur];
+ if (skb) {
+- pci_unmap_single(ppriv->pdev, tx_fd->data,
++ pci_unmap_single(ppriv->pdev, le32_to_cpu(tx_fd->data),
+ skb->len, PCI_DMA_TODEVICE);
+ if (tx_fd->state & FrameEnd) {
+ stats->tx_packets++;
+@@ -1711,7 +1714,7 @@ static void dscc4_rx_irq(struct dscc4_pci_priv *priv,
+
+ try:
+ cur = dpriv->iqrx_current%IRQ_RING_SIZE;
+- state = dpriv->iqrx[cur];
++ state = le32_to_cpu(dpriv->iqrx[cur]);
+ if (!state)
+ return;
+ dpriv->iqrx[cur] = 0;
+@@ -1755,7 +1758,7 @@ try:
+ goto try;
+ rx_fd->state1 &= ~Hold;
+ rx_fd->state2 = 0x00000000;
+- rx_fd->end = 0xbabeface;
++ rx_fd->end = cpu_to_le32(0xbabeface);
+ //}
+ goto try;
+ }
+@@ -1834,7 +1837,7 @@ try:
+ hdlc_stats(dev)->rx_over_errors++;
+ rx_fd->state1 |= Hold;
+ rx_fd->state2 = 0x00000000;
+- rx_fd->end = 0xbabeface;
++ rx_fd->end = cpu_to_le32(0xbabeface);
+ } else
+ dscc4_rx_skb(dpriv, dev);
+ } while (1);
+@@ -1904,8 +1907,9 @@ static struct sk_buff *dscc4_init_dummy_skb(struct dscc4_dev_priv *dpriv)
+ skb_copy_to_linear_data(skb, version,
+ strlen(version) % DUMMY_SKB_SIZE);
+ tx_fd->state = FrameEnd | TO_STATE_TX(DUMMY_SKB_SIZE);
+- tx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data,
+- DUMMY_SKB_SIZE, PCI_DMA_TODEVICE);
++ tx_fd->data = cpu_to_le32(pci_map_single(dpriv->pci_priv->pdev,
++ skb->data, DUMMY_SKB_SIZE,
++ PCI_DMA_TODEVICE));
+ dpriv->tx_skbuff[last] = skb;
+ }
+ return skb;
+@@ -1937,8 +1941,8 @@ static int dscc4_init_ring(struct net_device *dev)
+ tx_fd->state = FrameEnd | TO_STATE_TX(2*DUMMY_SKB_SIZE);
+ tx_fd->complete = 0x00000000;
+ /* FIXME: NULL should be ok - to be tried */
+- tx_fd->data = dpriv->tx_fd_dma;
+- (tx_fd++)->next = (u32)(dpriv->tx_fd_dma +
++ tx_fd->data = cpu_to_le32(dpriv->tx_fd_dma);
++ (tx_fd++)->next = cpu_to_le32(dpriv->tx_fd_dma +
+ (++i%TX_RING_SIZE)*sizeof(*tx_fd));
+ } while (i < TX_RING_SIZE);
+
+@@ -1951,12 +1955,12 @@ static int dscc4_init_ring(struct net_device *dev)
+ /* size set by the host. Multiple of 4 bytes please */
+ rx_fd->state1 = HiDesc;
+ rx_fd->state2 = 0x00000000;
+- rx_fd->end = 0xbabeface;
++ rx_fd->end = cpu_to_le32(0xbabeface);
+ rx_fd->state1 |= TO_STATE_RX(HDLC_MAX_MRU);
+ // FIXME: return value verifiee mais traitement suspect
+ if (try_get_rx_skb(dpriv, dev) >= 0)
+ dpriv->rx_dirty++;
+- (rx_fd++)->next = (u32)(dpriv->rx_fd_dma +
++ (rx_fd++)->next = cpu_to_le32(dpriv->rx_fd_dma +
+ (++i%RX_RING_SIZE)*sizeof(*rx_fd));
+ } while (i < RX_RING_SIZE);
+
+diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c
+index 574737b..c9c878c 100644
+--- a/drivers/net/wan/lmc/lmc_media.c
++++ b/drivers/net/wan/lmc/lmc_media.c
+@@ -890,16 +890,8 @@ write_av9110 (lmc_softc_t * sc, u_int32_t n, u_int32_t m, u_int32_t v,
+ static void
+ lmc_ssi_watchdog (lmc_softc_t * const sc)
+ {
+- u_int16_t mii17;
+- struct ssicsr2
+- {
+- unsigned short dtr:1, dsr:1, rts:1, cable:3, crc:1, led0:1, led1:1,
+- led2:1, led3:1, fifo:1, ll:1, rl:1, tm:1, loop:1;
+- };
+- struct ssicsr2 *ssicsr;
+- mii17 = lmc_mii_readreg (sc, 0, 17);
+- ssicsr = (struct ssicsr2 *) &mii17;
+- if (ssicsr->cable == 7)
++ u_int16_t mii17 = lmc_mii_readreg (sc, 0, 17);
++ if (((mii17 >> 3) & 7) == 7)
+ {
+ lmc_led_off (sc, LMC_MII16_LED2);
+ }
+diff --git a/drivers/net/wan/sbni.h b/drivers/net/wan/sbni.h
+index 27715e7..8426451 100644
+--- a/drivers/net/wan/sbni.h
++++ b/drivers/net/wan/sbni.h
+@@ -44,9 +44,15 @@ enum {
+ #define PR_RES 0x80
+
+ struct sbni_csr1 {
+- unsigned rxl : 5;
+- unsigned rate : 2;
+- unsigned : 1;
++#ifdef __LITTLE_ENDIAN_BITFIELD
++ u8 rxl : 5;
++ u8 rate : 2;
++ u8 : 1;
++#else
++ u8 : 1;
++ u8 rate : 2;
++ u8 rxl : 5;
++#endif
+ };
+
+ /* fields in frame header */
+diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c
+index 98cf70c..11f53cb 100644
+--- a/drivers/net/wireless/b43/rfkill.c
++++ b/drivers/net/wireless/b43/rfkill.c
+@@ -138,8 +138,11 @@ void b43_rfkill_init(struct b43_wldev *dev)
+ rfk->rfkill->user_claim_unsupported = 1;
+
+ rfk->poll_dev = input_allocate_polled_device();
+- if (!rfk->poll_dev)
+- goto err_free_rfk;
++ if (!rfk->poll_dev) {
++ rfkill_free(rfk->rfkill);
++ goto err_freed_rfk;
++ }
++
+ rfk->poll_dev->private = dev;
+ rfk->poll_dev->poll = b43_rfkill_poll;
+ rfk->poll_dev->poll_interval = 1000; /* msecs */
+@@ -175,8 +178,7 @@ err_unreg_rfk:
+ err_free_polldev:
+ input_free_polled_device(rfk->poll_dev);
+ rfk->poll_dev = NULL;
+-err_free_rfk:
+- rfkill_free(rfk->rfkill);
++err_freed_rfk:
+ rfk->rfkill = NULL;
+ out_error:
+ rfk->registered = 0;
+@@ -195,6 +197,5 @@ void b43_rfkill_exit(struct b43_wldev *dev)
+ rfkill_unregister(rfk->rfkill);
+ input_free_polled_device(rfk->poll_dev);
+ rfk->poll_dev = NULL;
+- rfkill_free(rfk->rfkill);
+ rfk->rfkill = NULL;
+ }
+diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c
+index 040dc3e..cbf15d7 100644
+--- a/drivers/net/wireless/hostap/hostap_plx.c
++++ b/drivers/net/wireless/hostap/hostap_plx.c
+@@ -608,7 +608,7 @@ static void prism2_plx_remove(struct pci_dev *pdev)
+
+ MODULE_DEVICE_TABLE(pci, prism2_plx_id_table);
+
+-static struct pci_driver prism2_plx_drv_id = {
++static struct pci_driver prism2_plx_driver = {
+ .name = "hostap_plx",
+ .id_table = prism2_plx_id_table,
+ .probe = prism2_plx_probe,
+@@ -618,13 +618,13 @@ static struct pci_driver prism2_plx_drv_id = {
+
+ static int __init init_prism2_plx(void)
+ {
+- return pci_register_driver(&prism2_plx_drv_id);
++ return pci_register_driver(&prism2_plx_driver);
+ }
+
+
+ static void __exit exit_prism2_plx(void)
+ {
+- pci_unregister_driver(&prism2_plx_drv_id);
++ pci_unregister_driver(&prism2_plx_driver);
+ }
+
+
+diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
+index 88062c1..003f73f 100644
+--- a/drivers/net/wireless/ipw2200.c
++++ b/drivers/net/wireless/ipw2200.c
+@@ -4935,7 +4935,7 @@ static int ipw_queue_reset(struct ipw_priv *priv)
+ /**
+ * Reclaim Tx queue entries no more used by NIC.
+ *
+- * When FW adwances 'R' index, all entries between old and
++ * When FW advances 'R' index, all entries between old and
+ * new 'R' index need to be reclaimed. As result, some free space
+ * forms. If there is enough free space (> low mark), wake Tx queue.
+ *
+diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
+index b24425f..4f1efb1 100644
+--- a/drivers/net/wireless/libertas/if_sdio.c
++++ b/drivers/net/wireless/libertas/if_sdio.c
+@@ -871,6 +871,10 @@ static int if_sdio_probe(struct sdio_func *func,
+ if (sscanf(func->card->info[i],
+ "ID: %x", &model) == 1)
+ break;
++ if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
++ model = 4;
++ break;
++ }
+ }
+
+ if (i == func->card->num_info) {
+diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
+index 6d5d9ab..04663eb 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
++++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
+@@ -149,7 +149,7 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
+ * The data behind the ieee80211 header must be
+ * aligned on a 4 byte boundary.
+ */
+- align = NET_IP_ALIGN + (2 * (header_size % 4 == 0));
++ align = header_size % 4;
+
+ /*
+ * Allocate the sk_buffer, initialize it and copy
+diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
+index ab4797e..568d738 100644
+--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
++++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
+@@ -245,13 +245,20 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
+ * Allocate a new sk buffer to replace the current one.
+ * If allocation fails, we should drop the current frame
+ * so we can recycle the existing sk buffer for the new frame.
++ * As alignment we use 2 and not NET_IP_ALIGN because we need
++ * to be sure we have 2 bytes room in the head. (NET_IP_ALIGN
++ * can be 0 on some hardware). We use these 2 bytes for frame
++ * alignment later, we assume that the chance that
++ * header_size % 4 == 2 is bigger then header_size % 2 == 0
++ * and thus optimize alignment by reserving the 2 bytes in
++ * advance.
+ */
+ frame_size = entry->ring->data_size + entry->ring->desc_size;
+- skb = dev_alloc_skb(frame_size + NET_IP_ALIGN);
++ skb = dev_alloc_skb(frame_size + 2);
+ if (!skb)
+ goto skip_entry;
+
+- skb_reserve(skb, NET_IP_ALIGN);
++ skb_reserve(skb, 2);
+ skb_put(skb, frame_size);
+
+ /*
+diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
+index f7b8648..6b9840c 100644
+--- a/drivers/pnp/pnpacpi/rsparser.c
++++ b/drivers/pnp/pnpacpi/rsparser.c
+@@ -215,6 +215,7 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_resource_table *res,
+ } else if (!warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of IO "
+ "resources: %d \n", PNP_MAX_PORT);
++ warned = 1;
+ }
+ }
+
+@@ -242,6 +243,7 @@ static void pnpacpi_parse_allocated_memresource(struct pnp_resource_table *res,
+ } else if (!warned) {
+ printk(KERN_ERR "pnpacpi: exceeded the max number of mem "
+ "resources: %d\n", PNP_MAX_MEM);
++ warned = 1;
+ }
+ }
+
+diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
+index feba967..7c069a0 100644
+--- a/drivers/usb/serial/keyspan.c
++++ b/drivers/usb/serial/keyspan.c
+@@ -447,7 +447,7 @@ static void usa26_indat_callback(struct urb *urb)
+
+ port = (struct usb_serial_port *) urb->context;
+ tty = port->tty;
+- if (urb->actual_length) {
++ if (tty && urb->actual_length) {
+ /* 0x80 bit is error flag */
+ if ((data[0] & 0x80) == 0) {
+ /* no errors on individual bytes, only possible overrun err*/
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index 8d81ef0..08d0725 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -259,6 +259,10 @@ static const struct fb_videomode modedb[] = {
+ /* 1366x768, 60 Hz, 47.403 kHz hsync, WXGA 16:9 aspect ratio */
+ NULL, 60, 1366, 768, 13806, 120, 10, 14, 3, 32, 5,
+ 0, FB_VMODE_NONINTERLACED
++ }, {
++ /* 1280x800, 60 Hz, 47.403 kHz hsync, WXGA 16:10 aspect ratio */
++ NULL, 60, 1280, 800, 12048, 200, 64, 24, 1, 136, 3,
++ 0, FB_VMODE_NONINTERLACED
+ },
+ };
+
+diff --git a/drivers/video/s3c2410fb.c b/drivers/video/s3c2410fb.c
+index ad35033..b3c31d9 100644
+--- a/drivers/video/s3c2410fb.c
++++ b/drivers/video/s3c2410fb.c
+@@ -488,7 +488,7 @@ static int s3c2410fb_set_par(struct fb_info *info)
+ break;
+ }
+
+- info->fix.line_length = (var->width * var->bits_per_pixel) / 8;
++ info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8;
+
+ /* activate this new configuration */
+
+diff --git a/drivers/watchdog/w83697hf_wdt.c b/drivers/watchdog/w83697hf_wdt.c
+index 6ea125e..c622a0e 100644
+--- a/drivers/watchdog/w83697hf_wdt.c
++++ b/drivers/watchdog/w83697hf_wdt.c
+@@ -382,10 +382,8 @@ wdt_init(void)
+ /* we will autodetect the W83697HF/HG watchdog */
+ for (i = 0; ((!found) && (w83697hf_ioports[i] != 0)); i++) {
+ wdt_io = w83697hf_ioports[i];
+- if (!w83697hf_check_wdt()) {
++ if (!w83697hf_check_wdt())
+ found++;
+- break;
+- }
+ }
+ } else {
+ if (!w83697hf_check_wdt())
+diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c
+index 31284c7..110dd35 100644
+--- a/fs/hfs/btree.c
++++ b/fs/hfs/btree.c
+@@ -61,7 +61,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
+ mapping = tree->inode->i_mapping;
+ page = read_mapping_page(mapping, 0, NULL);
+ if (IS_ERR(page))
+- goto free_tree;
++ goto free_inode;
+
+ /* Load the header */
+ head = (struct hfs_btree_header_rec *)(kmap(page) + sizeof(struct hfs_bnode_desc));
+@@ -99,11 +99,12 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
+ page_cache_release(page);
+ return tree;
+
+- fail_page:
++fail_page:
+ page_cache_release(page);
+- free_tree:
++free_inode:
+ tree->inode->i_mapping->a_ops = &hfs_aops;
+ iput(tree->inode);
++free_tree:
+ kfree(tree);
+ return NULL;
+ }
+diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c
+index 08ff6c7..038ed74 100644
+--- a/fs/jbd/transaction.c
++++ b/fs/jbd/transaction.c
+@@ -288,10 +288,12 @@ handle_t *journal_start(journal_t *journal, int nblocks)
+ jbd_free_handle(handle);
+ current->journal_info = NULL;
+ handle = ERR_PTR(err);
++ goto out;
+ }
+
+ lock_acquire(&handle->h_lockdep_map, 0, 0, 0, 2, _THIS_IP_);
+
++out:
+ return handle;
+ }
+
+diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
+index 3371629..f281cc6 100644
+--- a/fs/sysfs/dir.c
++++ b/fs/sysfs/dir.c
+@@ -678,8 +678,10 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
+ sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);
+
+ /* no such entry */
+- if (!sd)
++ if (!sd) {
++ ret = ERR_PTR(-ENOENT);
+ goto out_unlock;
++ }
+
+ /* attach dentry and inode */
+ inode = sysfs_get_inode(sd);
+@@ -781,6 +783,7 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
+ old_dentry = sysfs_get_dentry(sd);
+ if (IS_ERR(old_dentry)) {
+ error = PTR_ERR(old_dentry);
++ old_dentry = NULL;
+ goto out;
+ }
+
+@@ -848,6 +851,7 @@ int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
+ old_dentry = sysfs_get_dentry(sd);
+ if (IS_ERR(old_dentry)) {
+ error = PTR_ERR(old_dentry);
++ old_dentry = NULL;
+ goto out;
+ }
+ old_parent = old_dentry->d_parent;
+@@ -855,6 +859,7 @@ int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
+ new_parent = sysfs_get_dentry(new_parent_sd);
+ if (IS_ERR(new_parent)) {
+ error = PTR_ERR(new_parent);
++ new_parent = NULL;
+ goto out;
+ }
+
+@@ -878,7 +883,6 @@ again:
+ error = 0;
+ d_add(new_dentry, NULL);
+ d_move(old_dentry, new_dentry);
+- dput(new_dentry);
+
+ /* Remove from old parent's list and insert into new parent's list. */
+ sysfs_unlink_sibling(sd);
+diff --git a/include/asm-cris/page.h b/include/asm-cris/page.h
+index 0648e31..b84353e 100644
+--- a/include/asm-cris/page.h
++++ b/include/asm-cris/page.h
+@@ -4,14 +4,11 @@
+ #ifdef __KERNEL__
+
+ #include <asm/arch/page.h>
++#include <linux/const.h>
+
+ /* PAGE_SHIFT determines the page size */
+ #define PAGE_SHIFT 13
+-#ifndef __ASSEMBLY__
+-#define PAGE_SIZE (1UL << PAGE_SHIFT)
+-#else
+-#define PAGE_SIZE (1 << PAGE_SHIFT)
+-#endif
++#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
+ #define PAGE_MASK (~(PAGE_SIZE-1))
+
+ #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
+diff --git a/include/asm-mips/smtc_ipi.h b/include/asm-mips/smtc_ipi.h
+index e09131a..8ce5175 100644
+--- a/include/asm-mips/smtc_ipi.h
++++ b/include/asm-mips/smtc_ipi.h
+@@ -49,7 +49,7 @@ struct smtc_ipi_q {
+
+ static inline void smtc_ipi_nq(struct smtc_ipi_q *q, struct smtc_ipi *p)
+ {
+- long flags;
++ unsigned long flags;
+
+ spin_lock_irqsave(&q->lock, flags);
+ if (q->head == NULL)
+@@ -98,7 +98,7 @@ static inline struct smtc_ipi *smtc_ipi_dq(struct smtc_ipi_q *q)
+
+ static inline void smtc_ipi_req(struct smtc_ipi_q *q, struct smtc_ipi *p)
+ {
+- long flags;
++ unsigned long flags;
+
+ spin_lock_irqsave(&q->lock, flags);
+ if (q->head == NULL) {
+@@ -114,7 +114,7 @@ static inline void smtc_ipi_req(struct smtc_ipi_q *q, struct smtc_ipi *p)
+
+ static inline int smtc_ipi_qdepth(struct smtc_ipi_q *q)
+ {
+- long flags;
++ unsigned long flags;
+ int retval;
+
+ spin_lock_irqsave(&q->lock, flags);
+diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
+index 7daafdc..7f28c32 100644
+--- a/include/linux/workqueue.h
++++ b/include/linux/workqueue.h
+@@ -149,19 +149,27 @@ struct execute_work {
+
+ extern struct workqueue_struct *
+ __create_workqueue_key(const char *name, int singlethread,
+- int freezeable, struct lock_class_key *key);
++ int freezeable, struct lock_class_key *key,
++ const char *lock_name);
+
+ #ifdef CONFIG_LOCKDEP
+ #define __create_workqueue(name, singlethread, freezeable) \
+ ({ \
+ static struct lock_class_key __key; \
++ const char *__lock_name; \
++ \
++ if (__builtin_constant_p(name)) \
++ __lock_name = (name); \
++ else \
++ __lock_name = #name; \
+ \
+ __create_workqueue_key((name), (singlethread), \
+- (freezeable), &__key); \
++ (freezeable), &__key, \
++ __lock_name); \
+ })
+ #else
+ #define __create_workqueue(name, singlethread, freezeable) \
+- __create_workqueue_key((name), (singlethread), (freezeable), NULL)
++ __create_workqueue_key((name), (singlethread), (freezeable), NULL, NULL)
+ #endif
+
+ #define create_workqueue(name) __create_workqueue((name), 0, 0)
+diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
+index e65dd0b..f994bb8 100644
+--- a/kernel/hrtimer.c
++++ b/kernel/hrtimer.c
+@@ -1378,7 +1378,7 @@ sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
+ /*
+ * Functions related to boot-time initialization:
+ */
+-static void __devinit init_hrtimers_cpu(int cpu)
++static void __cpuinit init_hrtimers_cpu(int cpu)
+ {
+ struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu);
+ int i;
+diff --git a/kernel/kmod.c b/kernel/kmod.c
+index c6a4f8a..bb7df2a 100644
+--- a/kernel/kmod.c
++++ b/kernel/kmod.c
+@@ -451,13 +451,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
+ enum umh_wait wait)
+ {
+ DECLARE_COMPLETION_ONSTACK(done);
+- int retval;
++ int retval = 0;
+
+ helper_lock();
+- if (sub_info->path[0] == '\0') {
+- retval = 0;
++ if (sub_info->path[0] == '\0')
+ goto out;
+- }
+
+ if (!khelper_wq || usermodehelper_disabled) {
+ retval = -EBUSY;
+@@ -468,13 +466,14 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
+ sub_info->wait = wait;
+
+ queue_work(khelper_wq, &sub_info->work);
+- if (wait == UMH_NO_WAIT) /* task has freed sub_info */
+- return 0;
++ if (wait == UMH_NO_WAIT) /* task has freed sub_info */
++ goto unlock;
+ wait_for_completion(&done);
+ retval = sub_info->retval;
+
+- out:
++out:
+ call_usermodehelper_freeinfo(sub_info);
++unlock:
+ helper_unlock();
+ return retval;
+ }
+diff --git a/kernel/lockdep.c b/kernel/lockdep.c
+index 723bd9f..4335f12 100644
+--- a/kernel/lockdep.c
++++ b/kernel/lockdep.c
+@@ -2943,9 +2943,10 @@ void lockdep_free_key_range(void *start, unsigned long size)
+ struct list_head *head;
+ unsigned long flags;
+ int i;
++ int locked;
+
+ raw_local_irq_save(flags);
+- graph_lock();
++ locked = graph_lock();
+
+ /*
+ * Unhash all classes that were created by this module:
+@@ -2959,7 +2960,8 @@ void lockdep_free_key_range(void *start, unsigned long size)
+ zap_class(class);
+ }
+
+- graph_unlock();
++ if (locked)
++ graph_unlock();
+ raw_local_irq_restore(flags);
+ }
+
+@@ -2969,6 +2971,7 @@ void lockdep_reset_lock(struct lockdep_map *lock)
+ struct list_head *head;
+ unsigned long flags;
+ int i, j;
++ int locked;
+
+ raw_local_irq_save(flags);
+
+@@ -2987,7 +2990,7 @@ void lockdep_reset_lock(struct lockdep_map *lock)
+ * Debug check: in the end all mapped classes should
+ * be gone.
+ */
+- graph_lock();
++ locked = graph_lock();
+ for (i = 0; i < CLASSHASH_SIZE; i++) {
+ head = classhash_table + i;
+ if (list_empty(head))
+@@ -3000,7 +3003,8 @@ void lockdep_reset_lock(struct lockdep_map *lock)
+ }
+ }
+ }
+- graph_unlock();
++ if (locked)
++ graph_unlock();
+
+ out_restore:
+ raw_local_irq_restore(flags);
+diff --git a/kernel/timer.c b/kernel/timer.c
+index 26671f4..2a00c22 100644
+--- a/kernel/timer.c
++++ b/kernel/timer.c
+@@ -1289,7 +1289,7 @@ static void migrate_timer_list(tvec_base_t *new_base, struct list_head *head)
+ }
+ }
+
+-static void __devinit migrate_timers(int cpu)
++static void __cpuinit migrate_timers(int cpu)
+ {
+ tvec_base_t *old_base;
+ tvec_base_t *new_base;
+diff --git a/kernel/workqueue.c b/kernel/workqueue.c
+index 52d5e7c..8db0b59 100644
+--- a/kernel/workqueue.c
++++ b/kernel/workqueue.c
+@@ -722,7 +722,8 @@ static void start_workqueue_thread(struct cpu_workqueue_struct *cwq, int cpu)
+ struct workqueue_struct *__create_workqueue_key(const char *name,
+ int singlethread,
+ int freezeable,
+- struct lock_class_key *key)
++ struct lock_class_key *key,
++ const char *lock_name)
+ {
+ struct workqueue_struct *wq;
+ struct cpu_workqueue_struct *cwq;
+@@ -739,7 +740,7 @@ struct workqueue_struct *__create_workqueue_key(const char *name,
+ }
+
+ wq->name = name;
+- lockdep_init_map(&wq->lockdep_map, name, key, 0);
++ lockdep_init_map(&wq->lockdep_map, lock_name, key, 0);
+ wq->singlethread = singlethread;
+ wq->freezeable = freezeable;
+ INIT_LIST_HEAD(&wq->list);
+diff --git a/mm/memory.c b/mm/memory.c
+index 4bf0b6d..6dd1cd8 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -392,6 +392,7 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, pte_
+ return NULL;
+ }
+
++#ifdef CONFIG_DEBUG_VM
+ /*
+ * Add some anal sanity checks for now. Eventually,
+ * we should just do "return pfn_to_page(pfn)", but
+@@ -402,6 +403,7 @@ struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, pte_
+ print_bad_pte(vma, pte, addr);
+ return NULL;
+ }
++#endif
+
+ /*
+ * NOTE! We still have PageReserved() pages in the page
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index e1028fa..b2838c2 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -2566,7 +2566,7 @@ static void __meminit zone_init_free_lists(struct pglist_data *pgdat,
+ memmap_init_zone((size), (nid), (zone), (start_pfn), MEMMAP_EARLY)
+ #endif
+
+-static int __devinit zone_batchsize(struct zone *zone)
++static int zone_batchsize(struct zone *zone)
+ {
+ int batch;
+
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index 5d8b939..9f78a69 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -142,6 +142,23 @@ static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
+ return skb->nf_bridge;
+ }
+
++static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
++{
++ struct nf_bridge_info *nf_bridge = skb->nf_bridge;
++
++ if (atomic_read(&nf_bridge->use) > 1) {
++ struct nf_bridge_info *tmp = nf_bridge_alloc(skb);
++
++ if (tmp) {
++ memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info));
++ atomic_set(&tmp->use, 1);
++ nf_bridge_put(nf_bridge);
++ }
++ nf_bridge = tmp;
++ }
++ return nf_bridge;
++}
++
+ static inline void nf_bridge_push_encap_header(struct sk_buff *skb)
+ {
+ unsigned int len = nf_bridge_encap_header_len(skb);
+@@ -637,6 +654,11 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb,
+ if (!skb->nf_bridge)
+ return NF_ACCEPT;
+
++ /* Need exclusive nf_bridge_info since we might have multiple
++ * different physoutdevs. */
++ if (!nf_bridge_unshare(skb))
++ return NF_DROP;
++
+ parent = bridge_parent(out);
+ if (!parent)
+ return NF_DROP;
+@@ -718,6 +740,11 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff *skb,
+ if (!skb->nf_bridge)
+ return NF_ACCEPT;
+
++ /* Need exclusive nf_bridge_info since we might have multiple
++ * different physoutdevs. */
++ if (!nf_bridge_unshare(skb))
++ return NF_DROP;
++
+ nf_bridge = skb->nf_bridge;
+ if (!(nf_bridge->mask & BRNF_BRIDGED_DNAT))
+ return NF_ACCEPT;
+diff --git a/net/core/neighbour.c b/net/core/neighbour.c
+index cc8a2f1..29b8ee4 100644
+--- a/net/core/neighbour.c
++++ b/net/core/neighbour.c
+@@ -1316,6 +1316,8 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
+ *p = parms->next;
+ parms->dead = 1;
+ write_unlock_bh(&tbl->lock);
++ if (parms->dev)
++ dev_put(parms->dev);
+ call_rcu(&parms->rcu_head, neigh_rcu_free_parms);
+ return;
+ }
+@@ -1326,8 +1328,6 @@ void neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms)
+
+ void neigh_parms_destroy(struct neigh_parms *parms)
+ {
+- if (parms->dev)
+- dev_put(parms->dev);
+ kfree(parms);
+ }
+
+diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
+index e1ba26f..fed95a3 100644
+--- a/net/core/rtnetlink.c
++++ b/net/core/rtnetlink.c
+@@ -308,9 +308,12 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops)
+ struct net *net;
+
+ for_each_net(net) {
++restart:
+ for_each_netdev_safe(net, dev, n) {
+- if (dev->rtnl_link_ops == ops)
++ if (dev->rtnl_link_ops == ops) {
+ ops->dellink(dev);
++ goto restart;
++ }
+ }
+ }
+ list_del(&ops->list);
+diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c
+index 527a6e0..0dfee27 100644
+--- a/net/ipv4/fib_hash.c
++++ b/net/ipv4/fib_hash.c
+@@ -444,6 +444,9 @@ static int fn_hash_insert(struct fib_table *tb, struct fib_config *cfg)
+ struct fib_info *fi_drop;
+ u8 state;
+
++ if (fi->fib_treeref > 1)
++ goto out;
++
+ write_lock_bh(&fib_hash_lock);
+ fi_drop = fa->fa_info;
+ fa->fa_info = fi;
+@@ -718,19 +721,18 @@ fn_hash_dump_zone(struct sk_buff *skb, struct netlink_callback *cb,
+ {
+ int h, s_h;
+
++ if (fz->fz_hash == NULL)
++ return skb->len;
+ s_h = cb->args[3];
+- for (h=0; h < fz->fz_divisor; h++) {
+- if (h < s_h) continue;
+- if (h > s_h)
+- memset(&cb->args[4], 0,
+- sizeof(cb->args) - 4*sizeof(cb->args[0]));
+- if (fz->fz_hash == NULL ||
+- hlist_empty(&fz->fz_hash[h]))
++ for (h = s_h; h < fz->fz_divisor; h++) {
++ if (hlist_empty(&fz->fz_hash[h]))
+ continue;
+- if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h])<0) {
++ if (fn_hash_dump_bucket(skb, cb, tb, fz, &fz->fz_hash[h]) < 0) {
+ cb->args[3] = h;
+ return -1;
+ }
++ memset(&cb->args[4], 0,
++ sizeof(cb->args) - 4*sizeof(cb->args[0]));
+ }
+ cb->args[3] = h;
+ return skb->len;
+@@ -746,14 +748,13 @@ static int fn_hash_dump(struct fib_table *tb, struct sk_buff *skb, struct netlin
+ read_lock(&fib_hash_lock);
+ for (fz = table->fn_zone_list, m=0; fz; fz = fz->fz_next, m++) {
+ if (m < s_m) continue;
+- if (m > s_m)
+- memset(&cb->args[3], 0,
+- sizeof(cb->args) - 3*sizeof(cb->args[0]));
+ if (fn_hash_dump_zone(skb, cb, tb, fz) < 0) {
+ cb->args[2] = m;
+ read_unlock(&fib_hash_lock);
+ return -1;
+ }
++ memset(&cb->args[3], 0,
++ sizeof(cb->args) - 3*sizeof(cb->args[0]));
+ }
+ read_unlock(&fib_hash_lock);
+ cb->args[2] = m;
+diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
+index 8d8c291..1010b46 100644
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -1214,6 +1214,9 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg)
+ struct fib_info *fi_drop;
+ u8 state;
+
++ if (fi->fib_treeref > 1)
++ goto out;
++
+ err = -ENOBUFS;
+ new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
+ if (new_fa == NULL)
+diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
+index 233de06..82baea0 100644
+--- a/net/ipv4/icmp.c
++++ b/net/ipv4/icmp.c
+@@ -540,7 +540,6 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
+ icmp_param.data.icmph.checksum = 0;
+ icmp_param.skb = skb_in;
+ icmp_param.offset = skb_network_offset(skb_in);
+- icmp_out_count(icmp_param.data.icmph.type);
+ inet_sk(icmp_socket->sk)->tos = tos;
+ ipc.addr = iph->saddr;
+ ipc.opt = &icmp_param.replyopts;
+diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
+index 9bb031f..f124068 100644
+--- a/net/ipv6/icmp.c
++++ b/net/ipv6/icmp.c
+@@ -458,8 +458,6 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
+ }
+ err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, len + sizeof(struct icmp6hdr));
+
+- ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS);
+-
+ out_put:
+ if (likely(idev != NULL))
+ in6_dev_put(idev);
+diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
+index adc73ad..0765d8b 100644
+--- a/net/ipv6/inet6_hashtables.c
++++ b/net/ipv6/inet6_hashtables.c
+@@ -193,7 +193,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
+ sk2->sk_family == PF_INET6 &&
+ ipv6_addr_equal(&tw6->tw_v6_daddr, saddr) &&
+ ipv6_addr_equal(&tw6->tw_v6_rcv_saddr, daddr) &&
+- sk2->sk_bound_dev_if == sk->sk_bound_dev_if) {
++ (!sk2->sk_bound_dev_if || sk2->sk_bound_dev_if == dif)) {
+ if (twsk_unique(sk, sk2, twp))
+ goto unique;
+ else
+diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
+index 8631ed7..4493761 100644
+--- a/net/ipv6/proc.c
++++ b/net/ipv6/proc.c
+@@ -88,7 +88,7 @@ static char *icmp6type2name[256] = {
+ [ICMPV6_PKT_TOOBIG] = "PktTooBigs",
+ [ICMPV6_TIME_EXCEED] = "TimeExcds",
+ [ICMPV6_PARAMPROB] = "ParmProblems",
+- [ICMPV6_ECHO_REQUEST] = "EchoRequest",
++ [ICMPV6_ECHO_REQUEST] = "Echos",
+ [ICMPV6_ECHO_REPLY] = "EchoReplies",
+ [ICMPV6_MGM_QUERY] = "GroupMembQueries",
+ [ICMPV6_MGM_REPORT] = "GroupMembResponses",
+@@ -98,7 +98,7 @@ static char *icmp6type2name[256] = {
+ [NDISC_ROUTER_SOLICITATION] = "RouterSolicits",
+ [NDISC_NEIGHBOUR_ADVERTISEMENT] = "NeighborAdvertisements",
+ [NDISC_NEIGHBOUR_SOLICITATION] = "NeighborSolicits",
+- [NDISC_REDIRECT] = "NeighborRedirects",
++ [NDISC_REDIRECT] = "Redirects",
+ };
+
+
+diff --git a/net/ipv6/route.c b/net/ipv6/route.c
+index 6ecb5e6..20083e0 100644
+--- a/net/ipv6/route.c
++++ b/net/ipv6/route.c
+@@ -329,7 +329,7 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif)
+ static inline int rt6_check_neigh(struct rt6_info *rt)
+ {
+ struct neighbour *neigh = rt->rt6i_nexthop;
+- int m = 0;
++ int m;
+ if (rt->rt6i_flags & RTF_NONEXTHOP ||
+ !(rt->rt6i_flags & RTF_GATEWAY))
+ m = 1;
+@@ -337,10 +337,15 @@ static inline int rt6_check_neigh(struct rt6_info *rt)
+ read_lock_bh(&neigh->lock);
+ if (neigh->nud_state & NUD_VALID)
+ m = 2;
+- else if (!(neigh->nud_state & NUD_FAILED))
++#ifdef CONFIG_IPV6_ROUTER_PREF
++ else if (neigh->nud_state & NUD_FAILED)
++ m = 0;
++#endif
++ else
+ m = 1;
+ read_unlock_bh(&neigh->lock);
+- }
++ } else
++ m = 0;
+ return m;
+ }
+
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
+index d5e4dd7..07dfa7f 100644
+--- a/net/irda/af_irda.c
++++ b/net/irda/af_irda.c
+@@ -802,12 +802,18 @@ static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+ }
+ #endif /* CONFIG_IRDA_ULTRA */
+
++ self->ias_obj = irias_new_object(addr->sir_name, jiffies);
++ if (self->ias_obj == NULL)
++ return -ENOMEM;
++
+ err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name);
+- if (err < 0)
++ if (err < 0) {
++ kfree(self->ias_obj->name);
++ kfree(self->ias_obj);
+ return err;
++ }
+
+ /* Register with LM-IAS */
+- self->ias_obj = irias_new_object(addr->sir_name, jiffies);
+ irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel",
+ self->stsap_sel, IAS_KERNEL_ATTR);
+ irias_insert_object(self->ias_obj);
+@@ -1825,7 +1831,7 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
+ struct irda_ias_set *ias_opt;
+ struct ias_object *ias_obj;
+ struct ias_attrib * ias_attr; /* Attribute in IAS object */
+- int opt;
++ int opt, free_ias = 0;
+
+ IRDA_DEBUG(2, "%s(%p)\n", __FUNCTION__, self);
+
+@@ -1881,11 +1887,20 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
+ /* Create a new object */
+ ias_obj = irias_new_object(ias_opt->irda_class_name,
+ jiffies);
++ if (ias_obj == NULL) {
++ kfree(ias_opt);
++ return -ENOMEM;
++ }
++ free_ias = 1;
+ }
+
+ /* Do we have the attribute already ? */
+ if(irias_find_attrib(ias_obj, ias_opt->irda_attrib_name)) {
+ kfree(ias_opt);
++ if (free_ias) {
++ kfree(ias_obj->name);
++ kfree(ias_obj);
++ }
+ return -EINVAL;
+ }
+
+@@ -1904,6 +1919,11 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
+ if(ias_opt->attribute.irda_attrib_octet_seq.len >
+ IAS_MAX_OCTET_STRING) {
+ kfree(ias_opt);
++ if (free_ias) {
++ kfree(ias_obj->name);
++ kfree(ias_obj);
++ }
++
+ return -EINVAL;
+ }
+ /* Add an octet sequence attribute */
+@@ -1932,6 +1952,10 @@ static int irda_setsockopt(struct socket *sock, int level, int optname,
+ break;
+ default :
+ kfree(ias_opt);
++ if (free_ias) {
++ kfree(ias_obj->name);
++ kfree(ias_obj);
++ }
+ return -EINVAL;
+ }
+ irias_insert_object(ias_obj);
+diff --git a/net/key/af_key.c b/net/key/af_key.c
+index 26d5e63..76dcd88 100644
+--- a/net/key/af_key.c
++++ b/net/key/af_key.c
+@@ -3593,27 +3593,29 @@ static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
+ /* old ipsecrequest */
+ int mode = pfkey_mode_from_xfrm(mp->mode);
+ if (mode < 0)
+- return -EINVAL;
++ goto err;
+ if (set_ipsecrequest(skb, mp->proto, mode,
+ (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
+ mp->reqid, mp->old_family,
+- &mp->old_saddr, &mp->old_daddr) < 0) {
+- return -EINVAL;
+- }
++ &mp->old_saddr, &mp->old_daddr) < 0)
++ goto err;
+
+ /* new ipsecrequest */
+ if (set_ipsecrequest(skb, mp->proto, mode,
+ (mp->reqid ? IPSEC_LEVEL_UNIQUE : IPSEC_LEVEL_REQUIRE),
+ mp->reqid, mp->new_family,
+- &mp->new_saddr, &mp->new_daddr) < 0) {
+- return -EINVAL;
+- }
++ &mp->new_saddr, &mp->new_daddr) < 0)
++ goto err;
+ }
+
+ /* broadcast migrate message to sockets */
+ pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL);
+
+ return 0;
++
++err:
++ kfree_skb(skb);
++ return -EINVAL;
+ }
+ #else
+ static int pfkey_send_migrate(struct xfrm_selector *sel, u8 dir, u8 type,
+diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
+index 4469a7b..d06d338 100644
+--- a/net/rfkill/rfkill.c
++++ b/net/rfkill/rfkill.c
+@@ -392,11 +392,14 @@ int rfkill_register(struct rfkill *rfkill)
+ rfkill_led_trigger_register(rfkill);
+
+ error = rfkill_add_switch(rfkill);
+- if (error)
++ if (error) {
++ rfkill_led_trigger_unregister(rfkill);
+ return error;
++ }
+
+ error = device_add(dev);
+ if (error) {
++ rfkill_led_trigger_unregister(rfkill);
+ rfkill_remove_switch(rfkill);
+ return error;
+ }
+diff --git a/security/commoncap.c b/security/commoncap.c
+index 5bc1895..ea61bc7 100644
+--- a/security/commoncap.c
++++ b/security/commoncap.c
+@@ -59,6 +59,12 @@ int cap_netlink_recv(struct sk_buff *skb, int cap)
+
+ EXPORT_SYMBOL(cap_netlink_recv);
+
++/*
++ * NOTE WELL: cap_capable() cannot be used like the kernel's capable()
++ * function. That is, it has the reverse semantics: cap_capable()
++ * returns 0 when a task has a capability, but the kernel's capable()
++ * returns 1 for this case.
++ */
+ int cap_capable (struct task_struct *tsk, int cap)
+ {
+ /* Derived from include/linux/sched.h:capable. */
+@@ -107,10 +113,11 @@ static inline int cap_block_setpcap(struct task_struct *target)
+ static inline int cap_inh_is_capped(void)
+ {
+ /*
+- * return 1 if changes to the inheritable set are limited
+- * to the old permitted set.
++ * Return 1 if changes to the inheritable set are limited
++ * to the old permitted set. That is, if the current task
++ * does *not* possess the CAP_SETPCAP capability.
+ */
+- return !cap_capable(current, CAP_SETPCAP);
++ return (cap_capable(current, CAP_SETPCAP) != 0);
+ }
+
+ #else /* ie., ndef CONFIG_SECURITY_FILE_CAPABILITIES */
+diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c
+index d243ddc..66e013d 100644
+--- a/security/selinux/netlabel.c
++++ b/security/selinux/netlabel.c
+@@ -53,10 +53,11 @@ static int selinux_netlbl_sock_setsid(struct sock *sk, u32 sid)
+ struct sk_security_struct *sksec = sk->sk_security;
+ struct netlbl_lsm_secattr secattr;
+
++ netlbl_secattr_init(&secattr);
++
+ rc = security_netlbl_sid_to_secattr(sid, &secattr);
+ if (rc != 0)
+- return rc;
+-
++ goto sock_setsid_return;
+ rc = netlbl_sock_setattr(sk, &secattr);
+ if (rc == 0) {
+ spin_lock_bh(&sksec->nlbl_lock);
+@@ -64,6 +65,8 @@ static int selinux_netlbl_sock_setsid(struct sock *sk, u32 sid)
+ spin_unlock_bh(&sksec->nlbl_lock);
+ }
+
++sock_setsid_return:
++ netlbl_secattr_destroy(&secattr);
+ return rc;
+ }
+
+diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
+index d572dc9..f83b19d 100644
+--- a/security/selinux/ss/services.c
++++ b/security/selinux/ss/services.c
+@@ -2606,8 +2606,6 @@ int security_netlbl_sid_to_secattr(u32 sid, struct netlbl_lsm_secattr *secattr)
+ int rc = -ENOENT;
+ struct context *ctx;
+
+- netlbl_secattr_init(secattr);
+-
+ if (!ss_initialized)
+ return 0;
+
Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.2
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.2 (original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.2 Tue Jan 22 19:18:32 2008
@@ -1 +1,2 @@
+ bugfix/arm/disable-ath5k.patch
++ bugfix/all/patch-2.6.24-rc8-git5
More information about the Kernel-svn-changes
mailing list