Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 21 Apr 2008 22:50:49 +0000 (15:50 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 21 Apr 2008 22:50:49 +0000 (15:50 -0700)
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (202 commits)
  [POWERPC] Fix compile breakage for 64-bit UP configs
  [POWERPC] Define copy_siginfo_from_user32
  [POWERPC] Add compat handler for PTRACE_GETSIGINFO
  [POWERPC] i2c: Fix build breakage introduced by OF helpers
  [POWERPC] Optimize fls64() on 64-bit processors
  [POWERPC] irqtrace support for 64-bit powerpc
  [POWERPC] Stacktrace support for lockdep
  [POWERPC] Move stackframe definitions to common header
  [POWERPC] Fix device-tree locking vs. interrupts
  [POWERPC] Make pci_bus_to_host()'s struct pci_bus * argument const
  [POWERPC] Remove unused __max_memory variable
  [POWERPC] Simplify xics direct/lpar irq_host setup
  [POWERPC] Use pseries_setup_i8259_cascade() in pseries_mpic_init_IRQ()
  [POWERPC] Turn xics_setup_8259_cascade() into a generic pseries_setup_i8259_cascade()
  [POWERPC] Move xics_setup_8259_cascade() into platforms/pseries/setup.c
  [POWERPC] Use asm-generic/bitops/find.h in bitops.h
  [POWERPC] 83xx: mpc8315 - fix USB UTMI Host setup
  [POWERPC] 85xx: Fix the size of qe muram for MPC8568E
  [POWERPC] 86xx: mpc86xx_hpcn - Temporarily accept old dts node identifier.
  [POWERPC] 86xx: mark functions static, other minor cleanups
  ...

15 files changed:
1  2 
Documentation/kernel-parameters.txt
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/rtas.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/sys_ppc32.c
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/sysdev/fsl_soc.c
arch/ppc/platforms/radstone_ppc7d.c
drivers/net/Makefile
drivers/net/pasemi_mac.c
drivers/net/ucc_geth.c
drivers/net/ucc_geth_mii.c
lib/Makefile

index f4839606988beb27b95ac651eb6d12d71bd13279,4f82c856667f80116c70d0683563cedd9677544a..dfb5bef240132dbb2caccd67da5b65652caef537
@@@ -366,12 -366,6 +366,12 @@@ and is between 256 and 4096 characters
                        possible to determine what the correct size should be.
                        This option provides an override for these situations.
  
 +      security=       [SECURITY] Choose a security module to enable at boot.
 +                      If this boot parameter is not specified, only the first
 +                      security module asking for security registration will be
 +                      loaded. An invalid security module name will be treated
 +                      as if no module has been chosen.
 +
        capability.disable=
                        [SECURITY] Disable capabilities.  This would normally
                        be used only if an alternative security model is to be
                        Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]]
  
        ide=            [HW] (E)IDE subsystem
 -                      Format: ide=nodma or ide=doubler or ide=reverse
 +                      Format: ide=nodma or ide=doubler
                        See Documentation/ide/ide.txt.
  
        ide?=           [HW] (E)IDE subsystem
 -                      Format: ide?=noprobe or chipset specific parameters.
 +                      Format: ide?=ata66 or chipset specific parameters.
                        See Documentation/ide/ide.txt.
  
        idebus=         [HW] (E)IDE subsystem - VLB/PCI bus speed
  
        inttest=        [IA64]
  
 +      iommu=          [x86]
 +              off
 +              force
 +              noforce
 +              biomerge
 +              panic
 +              nopanic
 +              merge
 +              nomerge
 +              forcesac
 +              soft
 +
 +
        intel_iommu=    [DMAR] Intel IOMMU driver (DMAR) option
                off
                        Disable intel iommu driver.
        kstack=N        [X86-32,X86-64] Print N words from the kernel stack
                        in oops dumps.
  
 +      kgdboc=         [HW] kgdb over consoles.
 +                      Requires a tty driver that supports console polling.
 +                      (only serial suported for now)
 +                      Format: <serial_device>[,baud]
 +
        l2cr=           [PPC]
  
+       l3cr=           [PPC]
        lapic           [X86-32,APIC] Enable the local APIC even if BIOS
                        disabled it.
  
                                 or
                                 memmap=0x10000$0x18690000
  
 +      memtest=        [KNL,X86_64] Enable memtest
 +                      Format: <integer>
 +                      range: 0,4 : pattern number
 +                      default : 0 <disable>
 +
        meye.*=         [HW] Set MotionEye Camera parameters
                        See Documentation/video4linux/meye.txt.
  
        noexec          [IA-64]
  
        noexec          [X86-32,X86-64]
 +                      On X86-32 available only on PAE configured kernels.
                        noexec=on: enable non-executable mappings (default)
 -                      noexec=off: disable nn-executable mappings
 +                      noexec=off: disable non-executable mappings
 +
 +      noexec32        [X86-64]
 +                      This affects only 32-bit executables.
 +                      noexec32=on: enable non-executable mappings (default)
 +                              read doesn't imply executable mappings
 +                      noexec32=off: disable non-executable mappings
 +                              read implies executable mappings
  
        nofxsr          [BUGS=X86-32] Disables x86 floating point extended
                        register save and restore. The kernel will only save
  
        nowb            [ARM]
  
 +      nptcg=          [IA64] Override max number of concurrent global TLB
 +                      purges which is reported from either PAL_VM_SUMMARY or
 +                      SAL PALO.
 +
        numa_zonelist_order= [KNL, BOOT] Select zonelist order for NUMA.
                        one of ['zone', 'node', 'default'] can be specified
                        This can be set from sysctl after boot.
index b9dbfff9afe9359ec188b86733fdc9cf1aaa04e7,5183a9012a08ae45f637c8b6a183f6eed1733635..ce1e8d24e747c3ee56c19793700a5721df64c8b0
@@@ -12,7 -12,7 +12,7 @@@ CFLAGS_prom_init.o      += -fPI
  CFLAGS_btext.o                += -fPIC
  endif
  
 -obj-y                         := semaphore.o cputable.o ptrace.o syscalls.o \
 +obj-y                         := cputable.o ptrace.o syscalls.o \
                                   irq.o align.o signal_32.o pmc.o vdso.o \
                                   init_task.o process.o systbl.o idle.o \
                                   signal.o
@@@ -67,6 -67,7 +67,7 @@@ obj-$(CONFIG_BOOTX_TEXT)      += btext.
  obj-$(CONFIG_SMP)             += smp.o
  obj-$(CONFIG_KPROBES)         += kprobes.o
  obj-$(CONFIG_PPC_UDBG_16550)  += legacy_serial.o udbg_16550.o
+ obj-$(CONFIG_STACKTRACE)      += stacktrace.o
  
  pci64-$(CONFIG_PPC64)         += pci_dn.o isa-bridge.o
  obj-$(CONFIG_PCI)             += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
index 65d14e6ddc3cacc68f8fb2fde2b88a0d51c6faa0,b9b765c7d1a7607bc3bc8b450faf70c335e91b35..09fcb50c45aec30647df4eb6650b4ec380f43d2a
@@@ -15,6 -15,7 +15,6 @@@
  #include <linux/bitops.h>
  
  #include <asm/page.h>
 -#include <asm/semaphore.h>
  #include <asm/processor.h>
  #include <asm/cacheflush.h>
  #include <asm/uaccess.h>
  #include <asm/signal.h>
  #include <asm/dcr.h>
  
- #ifdef CONFIG_PPC64
- EXPORT_SYMBOL(local_irq_restore);
- #endif
  #ifdef CONFIG_PPC32
  extern void transfer_to_handler(void);
  extern void do_IRQ(struct pt_regs *regs);
@@@ -57,7 -54,6 +53,6 @@@ extern void program_check_exception(str
  extern void single_step_exception(struct pt_regs *regs);
  extern int sys_sigreturn(struct pt_regs *regs);
  
- EXPORT_SYMBOL(empty_zero_page);
  EXPORT_SYMBOL(clear_pages);
  EXPORT_SYMBOL(copy_page);
  EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
@@@ -78,6 -74,7 +73,7 @@@ EXPORT_SYMBOL(strncpy)
  EXPORT_SYMBOL(strcat);
  EXPORT_SYMBOL(strlen);
  EXPORT_SYMBOL(strcmp);
+ EXPORT_SYMBOL(strncmp);
  
  EXPORT_SYMBOL(csum_partial);
  EXPORT_SYMBOL(csum_partial_copy_generic);
@@@ -191,3 -188,4 +187,4 @@@ EXPORT_SYMBOL(intercept_table)
  EXPORT_SYMBOL(__mtdcr);
  EXPORT_SYMBOL(__mfdcr);
  #endif
+ EXPORT_SYMBOL(empty_zero_page);
index fe8d951468936c32b8c61f70add77642b45f7c15,eb3beea4536ea9f4799201d9ba9f95c2a5ecd1bb..34843c318419012e73195b8837345b232e4dca85
  #include <linux/smp.h>
  #include <linux/completion.h>
  #include <linux/cpumask.h>
+ #include <linux/lmb.h>
  
  #include <asm/prom.h>
  #include <asm/rtas.h>
  #include <asm/hvcall.h>
 -#include <asm/semaphore.h>
  #include <asm/machdep.h>
  #include <asm/firmware.h>
  #include <asm/page.h>
@@@ -33,7 -35,6 +34,6 @@@
  #include <asm/system.h>
  #include <asm/delay.h>
  #include <asm/uaccess.h>
- #include <asm/lmb.h>
  #include <asm/udbg.h>
  #include <asm/syscalls.h>
  #include <asm/smp.h>
@@@ -506,7 -507,7 +506,7 @@@ int rtas_error_rc(int rtas_rc
                        break;
                default:
                        printk(KERN_ERR "%s: unexpected RTAS error %d\n",
-                                       __FUNCTION__, rtas_rc);
+                                       __func__, rtas_rc);
                        rc = -ERANGE;
                        break;
        }
index 06d918d94dd1e2455de4dd224627f5fe309cbe38,d813c394f0ff829f24b026d75334444e7d25838e..36f6779c88d4e3b9d61a6d6896958b8706299c58
@@@ -10,6 -10,9 +10,6 @@@
  #include <linux/reboot.h>
  #include <linux/delay.h>
  #include <linux/initrd.h>
 -#if defined(CONFIG_IDE) || defined(CONFIG_IDE_MODULE)
 -#include <linux/ide.h>
 -#endif
  #include <linux/tty.h>
  #include <linux/bootmem.h>
  #include <linux/seq_file.h>
  
  extern void bootx_init(unsigned long r4, unsigned long phys);
  
 -#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
 -struct ide_machdep_calls ppc_ide_md;
 -EXPORT_SYMBOL(ppc_ide_md);
 -#endif
 -
  int boot_cpuid;
  EXPORT_SYMBOL_GPL(boot_cpuid);
  int boot_cpuid_phys;
@@@ -164,6 -172,18 +164,18 @@@ int __init ppc_setup_l2cr(char *str
  }
  __setup("l2cr=", ppc_setup_l2cr);
  
+ /* Checks "l3cr=xxxx" command-line option */
+ int __init ppc_setup_l3cr(char *str)
+ {
+       if (cpu_has_feature(CPU_FTR_L3CR)) {
+               unsigned long val = simple_strtoul(str, NULL, 0);
+               printk(KERN_INFO "l3cr set to %lx\n", val);
+               _set_L3CR(val);         /* and enable it */
+       }
+       return 1;
+ }
+ __setup("l3cr=", ppc_setup_l3cr);
  #ifdef CONFIG_GENERIC_NVRAM
  
  /* Generic nvram hooks used by drivers/char/gen_nvram.c */
@@@ -269,7 -289,7 +281,7 @@@ void __init setup_arch(char **cmdline_p
        if (ppc_md.panic)
                setup_panic();
  
-       init_mm.start_code = PAGE_OFFSET;
+       init_mm.start_code = (unsigned long)_stext;
        init_mm.end_code = (unsigned long) _etext;
        init_mm.end_data = (unsigned long) _edata;
        init_mm.brk = klimit;
index fee9ee2260b1dc84377ab1ffba4bca3b632a8ad1,9c3371e6958ee888d77dbc5c44814f89d42f66b2..709f8cb8bfca1475e2157420bc3092d8d2893186
@@@ -47,6 -47,7 +47,6 @@@
  #include <asm/types.h>
  #include <asm/uaccess.h>
  #include <asm/unistd.h>
 -#include <asm/semaphore.h>
  #include <asm/time.h>
  #include <asm/mmu_context.h>
  #include <asm/ppc-pci.h>
@@@ -367,11 -368,6 +367,6 @@@ long compat_sys_execve(unsigned long a0
  
        error = compat_do_execve(filename, compat_ptr(a1), compat_ptr(a2), regs);
  
-       if (error == 0) {
-               task_lock(current);
-               current->ptrace &= ~PT_DTRACE;
-               task_unlock(current);
-       }
        putname(filename);
  
  out:
index c7df0a6cfa1bd5828a94f0a29f3a1fb54cf7599a,ba791e931bd645f427cc108c8628be0ee00949a5..08f44d1971ac42cd952f055c6d9f4c96779c5883
@@@ -32,6 -32,7 +32,6 @@@
  #include <linux/marker.h>
  
  #include <asm/io.h>
 -#include <asm/semaphore.h>
  #include <asm/spu.h>
  #include <asm/spu_info.h>
  #include <asm/uaccess.h>
@@@ -1336,7 -1337,7 +1336,7 @@@ static u64 spufs_signal1_type_get(struc
        return ctx->ops->signal1_type_get(ctx);
  }
  DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_type, spufs_signal1_type_get,
-                      spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
+                      spufs_signal1_type_set, "%llu\n", SPU_ATTR_ACQUIRE);
  
  
  static int spufs_signal2_type_set(void *data, u64 val)
@@@ -1358,7 -1359,7 +1358,7 @@@ static u64 spufs_signal2_type_get(struc
        return ctx->ops->signal2_type_get(ctx);
  }
  DEFINE_SPUFS_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
-                      spufs_signal2_type_set, "%llu", SPU_ATTR_ACQUIRE);
+                      spufs_signal2_type_set, "%llu\n", SPU_ATTR_ACQUIRE);
  
  #if SPUFS_MMAP_4K
  static unsigned long spufs_mss_mmap_nopfn(struct vm_area_struct *vma,
@@@ -1555,7 -1556,7 +1555,7 @@@ void spufs_mfc_callback(struct spu *spu
  
        wake_up_all(&ctx->mfc_wq);
  
-       pr_debug("%s %s\n", __FUNCTION__, spu->name);
+       pr_debug("%s %s\n", __func__, spu->name);
        if (ctx->mfc_fasync) {
                u32 free_elements, tagstatus;
                unsigned int mask;
@@@ -1789,7 -1790,7 +1789,7 @@@ static unsigned int spufs_mfc_poll(stru
        if (tagstatus & ctx->tagwait)
                mask |= POLLIN | POLLRDNORM;
  
-       pr_debug("%s: free %d tagstatus %d tagwait %d\n", __FUNCTION__,
+       pr_debug("%s: free %d tagstatus %d tagwait %d\n", __func__,
                free_elements, tagstatus, ctx->tagwait);
  
        return mask;
index 2693fc371eab10e86a7b01f0a34291aa20ef89c4,59404baf911fa144baba6325c57765f141120d1d..bf44c5441a365a0a148bdac23dd255c5a5b747b1
@@@ -53,6 -53,7 +53,7 @@@
  #include <linux/suspend.h>
  #include <linux/of_device.h>
  #include <linux/of_platform.h>
+ #include <linux/lmb.h>
  
  #include <asm/reg.h>
  #include <asm/sections.h>
@@@ -74,7 -75,6 +75,6 @@@
  #include <asm/iommu.h>
  #include <asm/smu.h>
  #include <asm/pmc.h>
- #include <asm/lmb.h>
  #include <asm/udbg.h>
  
  #include "pmac.h"
@@@ -574,6 -574,14 +574,6 @@@ static int __init pmac_probe(void
        ISA_DMA_THRESHOLD = ~0L;
        DMA_MODE_READ = 1;
        DMA_MODE_WRITE = 2;
 -
 -#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
 -#ifdef CONFIG_BLK_DEV_IDE_PMAC
 -        ppc_ide_md.ide_init_hwif      = pmac_ide_init_hwif_ports;
 -        ppc_ide_md.default_io_base    = pmac_ide_get_base;
 -#endif /* CONFIG_BLK_DEV_IDE_PMAC */
 -#endif /* defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE) */
 -
  #endif /* CONFIG_PPC32 */
  
  #ifdef CONFIG_PMAC_SMU
index 3581416905eaca520485af0cdd13e5b8b7c6935d,b6d6bdae95f25ffdd1019ad9b844760b5f054959..5c1b246aacccbd37d55027b1087150bdc8f2f9ec
@@@ -75,6 -75,33 +75,33 @@@ phys_addr_t get_immrbase(void
  
  EXPORT_SYMBOL(get_immrbase);
  
+ static u32 sysfreq = -1;
+ u32 fsl_get_sys_freq(void)
+ {
+       struct device_node *soc;
+       const u32 *prop;
+       int size;
+       if (sysfreq != -1)
+               return sysfreq;
+       soc = of_find_node_by_type(NULL, "soc");
+       if (!soc)
+               return -1;
+       prop = of_get_property(soc, "clock-frequency", &size);
+       if (!prop || size != sizeof(*prop) || *prop == 0)
+               prop = of_get_property(soc, "bus-frequency", &size);
+       if (prop && size == sizeof(*prop))
+               sysfreq = *prop;
+       of_node_put(soc);
+       return sysfreq;
+ }
+ EXPORT_SYMBOL(fsl_get_sys_freq);
  #if defined(CONFIG_CPM2) || defined(CONFIG_QUICC_ENGINE) || defined(CONFIG_8xx)
  
  static u32 brgfreq = -1;
@@@ -341,7 -368,7 +368,7 @@@ static int __init gfar_of_init(void
                                goto unreg;
                        }
  
 -                      gfar_data.bus_id = 0;
 +                      snprintf(gfar_data.bus_id, MII_BUS_ID_SIZE, "0");
                        gfar_data.phy_id = fixed_link[0];
                } else {
                        phy = of_find_node_by_phandle(*ph);
                        }
  
                        gfar_data.phy_id = *id;
 -                      gfar_data.bus_id = res.start;
 +                      snprintf(gfar_data.bus_id, MII_BUS_ID_SIZE, "%x",
 +                                      res.start);
  
                        of_node_put(phy);
                        of_node_put(mdio);
@@@ -517,9 -543,9 +544,9 @@@ arch_initcall(fsl_i2c_of_init)
  static int __init mpc83xx_wdt_init(void)
  {
        struct resource r;
-       struct device_node *soc, *np;
+       struct device_node *np;
        struct platform_device *dev;
-       const unsigned int *freq;
+       u32 freq = fsl_get_sys_freq();
        int ret;
  
        np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt");
                goto nodev;
        }
  
-       soc = of_find_node_by_type(NULL, "soc");
-       if (!soc) {
-               ret = -ENODEV;
-               goto nosoc;
-       }
-       freq = of_get_property(soc, "bus-frequency", NULL);
-       if (!freq) {
-               ret = -ENODEV;
-               goto err;
-       }
        memset(&r, 0, sizeof(r));
  
        ret = of_address_to_resource(np, 0, &r);
                goto err;
        }
  
-       ret = platform_device_add_data(dev, freq, sizeof(int));
+       ret = platform_device_add_data(dev, &freq, sizeof(freq));
        if (ret)
                goto unreg;
  
-       of_node_put(soc);
        of_node_put(np);
        return 0;
  
  unreg:
        platform_device_unregister(dev);
  err:
-       of_node_put(soc);
- nosoc:
        of_node_put(np);
  nodev:
        return ret;
@@@ -736,547 -745,6 +746,6 @@@ err
  
  arch_initcall(fsl_usb_of_init);
  
- #ifndef CONFIG_PPC_CPM_NEW_BINDING
- #ifdef CONFIG_CPM2
- extern void init_scc_ioports(struct fs_uart_platform_info*);
- static const char fcc_regs[] = "fcc_regs";
- static const char fcc_regs_c[] = "fcc_regs_c";
- static const char fcc_pram[] = "fcc_pram";
- static char bus_id[9][BUS_ID_SIZE];
- static int __init fs_enet_of_init(void)
- {
-       struct device_node *np;
-       unsigned int i;
-       struct platform_device *fs_enet_dev;
-       struct resource res;
-       int ret;
-       for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;
-            i++) {
-               struct resource r[4];
-               struct device_node *phy, *mdio;
-               struct fs_platform_info fs_enet_data;
-               const unsigned int *id, *phy_addr, *phy_irq;
-               const void *mac_addr;
-               const phandle *ph;
-               const char *model;
-               memset(r, 0, sizeof(r));
-               memset(&fs_enet_data, 0, sizeof(fs_enet_data));
-               ret = of_address_to_resource(np, 0, &r[0]);
-               if (ret)
-                       goto err;
-               r[0].name = fcc_regs;
-               ret = of_address_to_resource(np, 1, &r[1]);
-               if (ret)
-                       goto err;
-               r[1].name = fcc_pram;
-               ret = of_address_to_resource(np, 2, &r[2]);
-               if (ret)
-                       goto err;
-               r[2].name = fcc_regs_c;
-               fs_enet_data.fcc_regs_c = r[2].start;
-               of_irq_to_resource(np, 0, &r[3]);
-               fs_enet_dev =
-                   platform_device_register_simple("fsl-cpm-fcc", i, &r[0], 4);
-               if (IS_ERR(fs_enet_dev)) {
-                       ret = PTR_ERR(fs_enet_dev);
-                       goto err;
-               }
-               model = of_get_property(np, "model", NULL);
-               if (model == NULL) {
-                       ret = -ENODEV;
-                       goto unreg;
-               }
-               mac_addr = of_get_mac_address(np);
-               if (mac_addr)
-                       memcpy(fs_enet_data.macaddr, mac_addr, 6);
-               ph = of_get_property(np, "phy-handle", NULL);
-               phy = of_find_node_by_phandle(*ph);
-               if (phy == NULL) {
-                       ret = -ENODEV;
-                       goto unreg;
-               }
-               phy_addr = of_get_property(phy, "reg", NULL);
-               fs_enet_data.phy_addr = *phy_addr;
-               phy_irq = of_get_property(phy, "interrupts", NULL);
-               id = of_get_property(np, "device-id", NULL);
-               fs_enet_data.fs_no = *id;
-               strcpy(fs_enet_data.fs_type, model);
-               mdio = of_get_parent(phy);
-                 ret = of_address_to_resource(mdio, 0, &res);
-                 if (ret) {
-                         of_node_put(phy);
-                         of_node_put(mdio);
-                         goto unreg;
-                 }
-               fs_enet_data.clk_rx = *((u32 *)of_get_property(np,
-                                               "rx-clock", NULL));
-               fs_enet_data.clk_tx = *((u32 *)of_get_property(np,
-                                               "tx-clock", NULL));
-               if (strstr(model, "FCC")) {
-                       int fcc_index = *id - 1;
-                       const unsigned char *mdio_bb_prop;
-                       fs_enet_data.dpram_offset = (u32)cpm_dpram_addr(0);
-                       fs_enet_data.rx_ring = 32;
-                       fs_enet_data.tx_ring = 32;
-                       fs_enet_data.rx_copybreak = 240;
-                       fs_enet_data.use_napi = 0;
-                       fs_enet_data.napi_weight = 17;
-                       fs_enet_data.mem_offset = FCC_MEM_OFFSET(fcc_index);
-                       fs_enet_data.cp_page = CPM_CR_FCC_PAGE(fcc_index);
-                       fs_enet_data.cp_block = CPM_CR_FCC_SBLOCK(fcc_index);
-                       snprintf((char*)&bus_id[(*id)], BUS_ID_SIZE, "%x:%02x",
-                                                       (u32)res.start, fs_enet_data.phy_addr);
-                       fs_enet_data.bus_id = (char*)&bus_id[(*id)];
-                       fs_enet_data.init_ioports = init_fcc_ioports;
-                       mdio_bb_prop = of_get_property(phy, "bitbang", NULL);
-                       if (mdio_bb_prop) {
-                               struct platform_device *fs_enet_mdio_bb_dev;
-                               struct fs_mii_bb_platform_info fs_enet_mdio_bb_data;
-                               fs_enet_mdio_bb_dev =
-                                       platform_device_register_simple("fsl-bb-mdio",
-                                                       i, NULL, 0);
-                               memset(&fs_enet_mdio_bb_data, 0,
-                                               sizeof(struct fs_mii_bb_platform_info));
-                               fs_enet_mdio_bb_data.mdio_dat.bit =
-                                       mdio_bb_prop[0];
-                               fs_enet_mdio_bb_data.mdio_dir.bit =
-                                       mdio_bb_prop[1];
-                               fs_enet_mdio_bb_data.mdc_dat.bit =
-                                       mdio_bb_prop[2];
-                               fs_enet_mdio_bb_data.mdio_port =
-                                       mdio_bb_prop[3];
-                               fs_enet_mdio_bb_data.mdc_port =
-                                       mdio_bb_prop[4];
-                               fs_enet_mdio_bb_data.delay =
-                                       mdio_bb_prop[5];
-                               fs_enet_mdio_bb_data.irq[0] = phy_irq[0];
-                               fs_enet_mdio_bb_data.irq[1] = -1;
-                               fs_enet_mdio_bb_data.irq[2] = -1;
-                               fs_enet_mdio_bb_data.irq[3] = phy_irq[0];
-                               fs_enet_mdio_bb_data.irq[31] = -1;
-                               fs_enet_mdio_bb_data.mdio_dat.offset =
-                                       (u32)&cpm2_immr->im_ioport.iop_pdatc;
-                               fs_enet_mdio_bb_data.mdio_dir.offset =
-                                       (u32)&cpm2_immr->im_ioport.iop_pdirc;
-                               fs_enet_mdio_bb_data.mdc_dat.offset =
-                                       (u32)&cpm2_immr->im_ioport.iop_pdatc;
-                               ret = platform_device_add_data(
-                                               fs_enet_mdio_bb_dev,
-                                               &fs_enet_mdio_bb_data,
-                                               sizeof(struct fs_mii_bb_platform_info));
-                               if (ret)
-                                       goto unreg;
-                       }
-                       of_node_put(phy);
-                       of_node_put(mdio);
-                       ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
-                                                    sizeof(struct
-                                                           fs_platform_info));
-                       if (ret)
-                               goto unreg;
-               }
-       }
-       return 0;
- unreg:
-       platform_device_unregister(fs_enet_dev);
- err:
-       return ret;
- }
- arch_initcall(fs_enet_of_init);
- static const char scc_regs[] = "regs";
- static const char scc_pram[] = "pram";
- static int __init cpm_uart_of_init(void)
- {
-       struct device_node *np;
-       unsigned int i;
-       struct platform_device *cpm_uart_dev;
-       int ret;
-       for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;
-            i++) {
-               struct resource r[3];
-               struct fs_uart_platform_info cpm_uart_data;
-               const int *id;
-               const char *model;
-               memset(r, 0, sizeof(r));
-               memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));
-               ret = of_address_to_resource(np, 0, &r[0]);
-               if (ret)
-                       goto err;
-               r[0].name = scc_regs;
-               ret = of_address_to_resource(np, 1, &r[1]);
-               if (ret)
-                       goto err;
-               r[1].name = scc_pram;
-               of_irq_to_resource(np, 0, &r[2]);
-               cpm_uart_dev =
-                   platform_device_register_simple("fsl-cpm-scc:uart", i, &r[0], 3);
-               if (IS_ERR(cpm_uart_dev)) {
-                       ret = PTR_ERR(cpm_uart_dev);
-                       goto err;
-               }
-               id = of_get_property(np, "device-id", NULL);
-               cpm_uart_data.fs_no = *id;
-               model = of_get_property(np, "model", NULL);
-               strcpy(cpm_uart_data.fs_type, model);
-               cpm_uart_data.uart_clk = ppc_proc_freq;
-               cpm_uart_data.tx_num_fifo = 4;
-               cpm_uart_data.tx_buf_size = 32;
-               cpm_uart_data.rx_num_fifo = 4;
-               cpm_uart_data.rx_buf_size = 32;
-               cpm_uart_data.clk_rx = *((u32 *)of_get_property(np,
-                                               "rx-clock", NULL));
-               cpm_uart_data.clk_tx = *((u32 *)of_get_property(np,
-                                               "tx-clock", NULL));
-               ret =
-                   platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
-                                            sizeof(struct
-                                                   fs_uart_platform_info));
-               if (ret)
-                       goto unreg;
-       }
-       return 0;
- unreg:
-       platform_device_unregister(cpm_uart_dev);
- err:
-       return ret;
- }
- arch_initcall(cpm_uart_of_init);
- #endif /* CONFIG_CPM2 */
- #ifdef CONFIG_8xx
- extern void init_scc_ioports(struct fs_platform_info*);
- extern int platform_device_skip(const char *model, int id);
- static int __init fs_enet_mdio_of_init(void)
- {
-       struct device_node *np;
-       unsigned int i;
-       struct platform_device *mdio_dev;
-       struct resource res;
-       int ret;
-       for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "mdio", "fs_enet")) != NULL;
-            i++) {
-               struct fs_mii_fec_platform_info mdio_data;
-               memset(&res, 0, sizeof(res));
-               memset(&mdio_data, 0, sizeof(mdio_data));
-               ret = of_address_to_resource(np, 0, &res);
-               if (ret)
-                       goto err;
-               mdio_dev =
-                   platform_device_register_simple("fsl-cpm-fec-mdio",
-                                                   res.start, &res, 1);
-               if (IS_ERR(mdio_dev)) {
-                       ret = PTR_ERR(mdio_dev);
-                       goto err;
-               }
-               mdio_data.mii_speed = ((((ppc_proc_freq + 4999999) / 2500000) / 2) & 0x3F) << 1;
-               ret =
-                   platform_device_add_data(mdio_dev, &mdio_data,
-                                            sizeof(struct fs_mii_fec_platform_info));
-               if (ret)
-                       goto unreg;
-       }
-       return 0;
- unreg:
-       platform_device_unregister(mdio_dev);
- err:
-       return ret;
- }
- arch_initcall(fs_enet_mdio_of_init);
- static const char *enet_regs = "regs";
- static const char *enet_pram = "pram";
- static const char *enet_irq = "interrupt";
- static char bus_id[9][BUS_ID_SIZE];
- static int __init fs_enet_of_init(void)
- {
-       struct device_node *np;
-       unsigned int i;
-       struct platform_device *fs_enet_dev = NULL;
-       struct resource res;
-       int ret;
-       for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "network", "fs_enet")) != NULL;
-            i++) {
-               struct resource r[4];
-               struct device_node *phy = NULL, *mdio = NULL;
-               struct fs_platform_info fs_enet_data;
-               const unsigned int *id;
-               const unsigned int *phy_addr;
-               const void *mac_addr;
-               const phandle *ph;
-               const char *model;
-               memset(r, 0, sizeof(r));
-               memset(&fs_enet_data, 0, sizeof(fs_enet_data));
-               model = of_get_property(np, "model", NULL);
-               if (model == NULL) {
-                       ret = -ENODEV;
-                       goto unreg;
-               }
-               id = of_get_property(np, "device-id", NULL);
-               fs_enet_data.fs_no = *id;
-               if (platform_device_skip(model, *id))
-                       continue;
-               ret = of_address_to_resource(np, 0, &r[0]);
-               if (ret)
-                       goto err;
-               r[0].name = enet_regs;
-               mac_addr = of_get_mac_address(np);
-               if (mac_addr)
-                       memcpy(fs_enet_data.macaddr, mac_addr, 6);
-               ph = of_get_property(np, "phy-handle", NULL);
-               if (ph != NULL)
-                       phy = of_find_node_by_phandle(*ph);
-               if (phy != NULL) {
-                       phy_addr = of_get_property(phy, "reg", NULL);
-                       fs_enet_data.phy_addr = *phy_addr;
-                       fs_enet_data.has_phy = 1;
-                       mdio = of_get_parent(phy);
-                       ret = of_address_to_resource(mdio, 0, &res);
-                       if (ret) {
-                               of_node_put(phy);
-                               of_node_put(mdio);
-                                 goto unreg;
-                       }
-               }
-               model = of_get_property(np, "model", NULL);
-               strcpy(fs_enet_data.fs_type, model);
-               if (strstr(model, "FEC")) {
-                       r[1].start = r[1].end = irq_of_parse_and_map(np, 0);
-                       r[1].flags = IORESOURCE_IRQ;
-                       r[1].name = enet_irq;
-                       fs_enet_dev =
-                                   platform_device_register_simple("fsl-cpm-fec", i, &r[0], 2);
-                       if (IS_ERR(fs_enet_dev)) {
-                               ret = PTR_ERR(fs_enet_dev);
-                               goto err;
-                       }
-                       fs_enet_data.rx_ring = 128;
-                       fs_enet_data.tx_ring = 16;
-                       fs_enet_data.rx_copybreak = 240;
-                       fs_enet_data.use_napi = 1;
-                       fs_enet_data.napi_weight = 17;
-                       snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%x:%02x",
-                                                       (u32)res.start, fs_enet_data.phy_addr);
-                       fs_enet_data.bus_id = (char*)&bus_id[i];
-                       fs_enet_data.init_ioports = init_fec_ioports;
-               }
-               if (strstr(model, "SCC")) {
-                       ret = of_address_to_resource(np, 1, &r[1]);
-                       if (ret)
-                               goto err;
-                       r[1].name = enet_pram;
-                       r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
-                       r[2].flags = IORESOURCE_IRQ;
-                       r[2].name = enet_irq;
-                       fs_enet_dev =
-                                   platform_device_register_simple("fsl-cpm-scc", i, &r[0], 3);
-                       if (IS_ERR(fs_enet_dev)) {
-                               ret = PTR_ERR(fs_enet_dev);
-                               goto err;
-                       }
-                       fs_enet_data.rx_ring = 64;
-                       fs_enet_data.tx_ring = 8;
-                       fs_enet_data.rx_copybreak = 240;
-                       fs_enet_data.use_napi = 1;
-                       fs_enet_data.napi_weight = 17;
-                       snprintf((char*)&bus_id[i], BUS_ID_SIZE, "%s", "fixed@10:1");
-                         fs_enet_data.bus_id = (char*)&bus_id[i];
-                       fs_enet_data.init_ioports = init_scc_ioports;
-               }
-               of_node_put(phy);
-               of_node_put(mdio);
-               ret = platform_device_add_data(fs_enet_dev, &fs_enet_data,
-                                            sizeof(struct
-                                                   fs_platform_info));
-               if (ret)
-                       goto unreg;
-       }
-       return 0;
- unreg:
-       platform_device_unregister(fs_enet_dev);
- err:
-       return ret;
- }
- arch_initcall(fs_enet_of_init);
- static int __init fsl_pcmcia_of_init(void)
- {
-       struct device_node *np;
-       /*
-        * Register all the devices which type is "pcmcia"
-        */
-       for_each_compatible_node(np, "pcmcia", "fsl,pq-pcmcia")
-               of_platform_device_create(np, "m8xx-pcmcia", NULL);
-       return 0;
- }
- arch_initcall(fsl_pcmcia_of_init);
- static const char *smc_regs = "regs";
- static const char *smc_pram = "pram";
- static int __init cpm_smc_uart_of_init(void)
- {
-       struct device_node *np;
-       unsigned int i;
-       struct platform_device *cpm_uart_dev;
-       int ret;
-       for (np = NULL, i = 0;
-            (np = of_find_compatible_node(np, "serial", "cpm_uart")) != NULL;
-            i++) {
-               struct resource r[3];
-               struct fs_uart_platform_info cpm_uart_data;
-               const int *id;
-               const char *model;
-               memset(r, 0, sizeof(r));
-               memset(&cpm_uart_data, 0, sizeof(cpm_uart_data));
-               ret = of_address_to_resource(np, 0, &r[0]);
-               if (ret)
-                       goto err;
-               r[0].name = smc_regs;
-               ret = of_address_to_resource(np, 1, &r[1]);
-               if (ret)
-                       goto err;
-               r[1].name = smc_pram;
-               r[2].start = r[2].end = irq_of_parse_and_map(np, 0);
-               r[2].flags = IORESOURCE_IRQ;
-               cpm_uart_dev =
-                   platform_device_register_simple("fsl-cpm-smc:uart", i, &r[0], 3);
-               if (IS_ERR(cpm_uart_dev)) {
-                       ret = PTR_ERR(cpm_uart_dev);
-                       goto err;
-               }
-               model = of_get_property(np, "model", NULL);
-               strcpy(cpm_uart_data.fs_type, model);
-               id = of_get_property(np, "device-id", NULL);
-               cpm_uart_data.fs_no = *id;
-               cpm_uart_data.uart_clk = ppc_proc_freq;
-               cpm_uart_data.tx_num_fifo = 4;
-               cpm_uart_data.tx_buf_size = 32;
-               cpm_uart_data.rx_num_fifo = 4;
-               cpm_uart_data.rx_buf_size = 32;
-               ret =
-                   platform_device_add_data(cpm_uart_dev, &cpm_uart_data,
-                                            sizeof(struct
-                                                   fs_uart_platform_info));
-               if (ret)
-                       goto unreg;
-       }
-       return 0;
- unreg:
-       platform_device_unregister(cpm_uart_dev);
- err:
-       return ret;
- }
- arch_initcall(cpm_smc_uart_of_init);
- #endif /* CONFIG_8xx */
- #endif /* CONFIG_PPC_CPM_NEW_BINDING */
  static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
                                   struct spi_board_info *board_infos,
                                   unsigned int num_board_infos,
@@@ -1372,25 -840,9 +841,9 @@@ int __init fsl_spi_init(struct spi_boar
        sysclk = get_brgfreq();
  #endif
        if (sysclk == -1) {
-               struct device_node *np;
-               const u32 *freq;
-               int size;
-               np = of_find_node_by_type(NULL, "soc");
-               if (!np)
+               sysclk = fsl_get_sys_freq();
+               if (sysclk == -1)
                        return -ENODEV;
-               freq = of_get_property(np, "clock-frequency", &size);
-               if (!freq || size != sizeof(*freq) || *freq == 0) {
-                       freq = of_get_property(np, "bus-frequency", &size);
-                       if (!freq || size != sizeof(*freq) || *freq == 0) {
-                               of_node_put(np);
-                               return -ENODEV;
-                       }
-               }
-               sysclk = *freq;
-               of_node_put(np);
        }
  
        ret = of_fsl_spi_probe(NULL, "fsl,spi", sysclk, board_infos,
index 179b4a99b5b54780baa0c8ce50d243911b7dc9f2,fc928a26609bb0d3e39765f61cd6c6da91cb78f2..f1dee1e878096b2a80f80c36cfe64fcf91a0606b
@@@ -29,6 -29,7 +29,6 @@@
  #include <linux/initrd.h>
  #include <linux/console.h>
  #include <linux/delay.h>
 -#include <linux/ide.h>
  #include <linux/seq_file.h>
  #include <linux/root_dev.h>
  #include <linux/serial.h>
@@@ -511,7 -512,7 +511,7 @@@ static void __init ppc7d_init_irq(void
  {
        int irq;
  
-       pr_debug("%s\n", __FUNCTION__);
+       pr_debug("%s\n", __func__);
        i8259_init(0, 0);
        mv64360_init_irq();
  
@@@ -568,7 -569,7 +568,7 @@@ static int __init ppc7d_map_irq(struct 
        };
        const long min_idsel = 10, max_idsel = 14, irqs_per_slot = 4;
  
-       pr_debug("%s: %04x/%04x/%x: idsel=%hx pin=%hu\n", __FUNCTION__,
+       pr_debug("%s: %04x/%04x/%x: idsel=%hx pin=%hu\n", __func__,
                 dev->vendor, dev->device, PCI_FUNC(dev->devfn), idsel, pin);
  
        return PCI_IRQ_TABLE_LOOKUP;
@@@ -1299,7 -1300,7 +1299,7 @@@ static void ppc7d_init2(void
        u32 data;
        u8 data8;
  
-       pr_debug("%s: enter\n", __FUNCTION__);
+       pr_debug("%s: enter\n", __func__);
  
        /* Wait for debugger? */
        if (ppc7d_wait_debugger) {
          ppc_md.set_rtc_time = ppc7d_set_rtc_time;
          ppc_md.get_rtc_time = ppc7d_get_rtc_time;
  
-       pr_debug("%s: exit\n", __FUNCTION__);
+       pr_debug("%s: exit\n", __func__);
  }
  
  /* Called from machine_init(), early, before any of the __init functions
diff --combined drivers/net/Makefile
index 4d71729e85e51bbfb285407bca388e988239b448,4b442739e7bfbff595c147c39b7c7ff05dc2d4ff..2f1f3f2739fdf32dc088a883775491da4f3c161e
@@@ -15,7 -15,7 +15,7 @@@ obj-$(CONFIG_CHELSIO_T3) += cxgb3
  obj-$(CONFIG_EHEA) += ehea/
  obj-$(CONFIG_CAN) += can/
  obj-$(CONFIG_BONDING) += bonding/
 -obj-$(CONFIG_ATL1) += atl1/
 +obj-$(CONFIG_ATL1) += atlx/
  obj-$(CONFIG_GIANFAR) += gianfar_driver.o
  obj-$(CONFIG_TEHUTI) += tehuti.o
  
@@@ -75,6 -75,7 +75,6 @@@ ps3_gelic-objs += ps3_gelic_net.o $(gel
  obj-$(CONFIG_TC35815) += tc35815.o
  obj-$(CONFIG_SKGE) += skge.o
  obj-$(CONFIG_SKY2) += sky2.o
 -obj-$(CONFIG_SK98LIN) += sk98lin/
  obj-$(CONFIG_SKFP) += skfp/
  obj-$(CONFIG_VIA_RHINE) += via-rhine.o
  obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o
@@@ -190,7 -191,6 +190,7 @@@ obj-$(CONFIG_ZORRO8390) += zorro8390.
  obj-$(CONFIG_HPLANCE) += hplance.o 7990.o
  obj-$(CONFIG_MVME147_NET) += mvme147.o 7990.o
  obj-$(CONFIG_EQUALIZER) += eql.o
 +obj-$(CONFIG_KORINA) += korina.o
  obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o
  obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o
  obj-$(CONFIG_MIPS_SIM_NET) += mipsnet.o
@@@ -218,7 -218,8 +218,8 @@@ obj-$(CONFIG_SMC911X) += smc911x.
  obj-$(CONFIG_BFIN_MAC) += bfin_mac.o
  obj-$(CONFIG_DM9000) += dm9000.o
  obj-$(CONFIG_FEC_8XX) += fec_8xx/
- obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o
+ obj-$(CONFIG_PASEMI_MAC) += pasemi_mac_driver.o
+ pasemi_mac_driver-objs := pasemi_mac.o pasemi_mac_ethtool.o
  obj-$(CONFIG_MLX4_CORE) += mlx4/
  obj-$(CONFIG_ENC28J60) += enc28j60.o
  
diff --combined drivers/net/pasemi_mac.c
index bcd7f9814ed825a6699cfe8e6b7f509218dc48ae,965f2e4b3452ac21ef1760e236b4c2a7ee9b78d4..3b2a6c5980883b6d86e46542910586b29cb8d220
   * - Multiqueue RX/TX
   */
  
- /* Must be a power of two */
- #define RX_RING_SIZE 2048
- #define TX_RING_SIZE 4096
  #define LRO_MAX_AGGR 64
  
  #define PE_MIN_MTU    64
- #define PE_MAX_MTU    1500
+ #define PE_MAX_MTU    9000
  #define PE_DEF_MTU    ETH_DATA_LEN
  
  #define DEFAULT_MSG_ENABLE      \
         NETIF_MSG_RX_ERR       | \
         NETIF_MSG_TX_ERR)
  
- #define TX_DESC(tx, num)      ((tx)->chan.ring_virt[(num) & (TX_RING_SIZE-1)])
- #define TX_DESC_INFO(tx, num) ((tx)->ring_info[(num) & (TX_RING_SIZE-1)])
- #define RX_DESC(rx, num)      ((rx)->chan.ring_virt[(num) & (RX_RING_SIZE-1)])
- #define RX_DESC_INFO(rx, num) ((rx)->ring_info[(num) & (RX_RING_SIZE-1)])
- #define RX_BUFF(rx, num)      ((rx)->buffers[(num) & (RX_RING_SIZE-1)])
- #define RING_USED(ring)               (((ring)->next_to_fill - (ring)->next_to_clean) \
-                                & ((ring)->size - 1))
- #define RING_AVAIL(ring)      ((ring->size) - RING_USED(ring))
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
  MODULE_DESCRIPTION("PA Semi PWRficient Ethernet driver");
@@@ -94,6 -79,8 +79,8 @@@ static int debug = -1;        /* -1 == use DEF
  module_param(debug, int, 0);
  MODULE_PARM_DESC(debug, "PA Semi MAC bitmapped debugging message enable value");
  
+ extern const struct ethtool_ops pasemi_mac_ethtool_ops;
  static int translation_enabled(void)
  {
  #if defined(CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE)
@@@ -322,6 -309,104 +309,104 @@@ static int pasemi_mac_unmap_tx_skb(stru
        return (nfrags + 3) & ~1;
  }
  
+ static struct pasemi_mac_csring *pasemi_mac_setup_csring(struct pasemi_mac *mac)
+ {
+       struct pasemi_mac_csring *ring;
+       u32 val;
+       unsigned int cfg;
+       int chno;
+       ring = pasemi_dma_alloc_chan(TXCHAN, sizeof(struct pasemi_mac_csring),
+                                      offsetof(struct pasemi_mac_csring, chan));
+       if (!ring) {
+               dev_err(&mac->pdev->dev, "Can't allocate checksum channel\n");
+               goto out_chan;
+       }
+       chno = ring->chan.chno;
+       ring->size = CS_RING_SIZE;
+       ring->next_to_fill = 0;
+       /* Allocate descriptors */
+       if (pasemi_dma_alloc_ring(&ring->chan, CS_RING_SIZE))
+               goto out_ring_desc;
+       write_dma_reg(PAS_DMA_TXCHAN_BASEL(chno),
+                     PAS_DMA_TXCHAN_BASEL_BRBL(ring->chan.ring_dma));
+       val = PAS_DMA_TXCHAN_BASEU_BRBH(ring->chan.ring_dma >> 32);
+       val |= PAS_DMA_TXCHAN_BASEU_SIZ(CS_RING_SIZE >> 3);
+       write_dma_reg(PAS_DMA_TXCHAN_BASEU(chno), val);
+       ring->events[0] = pasemi_dma_alloc_flag();
+       ring->events[1] = pasemi_dma_alloc_flag();
+       if (ring->events[0] < 0 || ring->events[1] < 0)
+               goto out_flags;
+       pasemi_dma_clear_flag(ring->events[0]);
+       pasemi_dma_clear_flag(ring->events[1]);
+       ring->fun = pasemi_dma_alloc_fun();
+       if (ring->fun < 0)
+               goto out_fun;
+       cfg = PAS_DMA_TXCHAN_CFG_TY_FUNC | PAS_DMA_TXCHAN_CFG_UP |
+             PAS_DMA_TXCHAN_CFG_TATTR(ring->fun) |
+             PAS_DMA_TXCHAN_CFG_LPSQ | PAS_DMA_TXCHAN_CFG_LPDQ;
+       if (translation_enabled())
+               cfg |= PAS_DMA_TXCHAN_CFG_TRD | PAS_DMA_TXCHAN_CFG_TRR;
+       write_dma_reg(PAS_DMA_TXCHAN_CFG(chno), cfg);
+       /* enable channel */
+       pasemi_dma_start_chan(&ring->chan, PAS_DMA_TXCHAN_TCMDSTA_SZ |
+                                          PAS_DMA_TXCHAN_TCMDSTA_DB |
+                                          PAS_DMA_TXCHAN_TCMDSTA_DE |
+                                          PAS_DMA_TXCHAN_TCMDSTA_DA);
+       return ring;
+ out_fun:
+ out_flags:
+       if (ring->events[0] >= 0)
+               pasemi_dma_free_flag(ring->events[0]);
+       if (ring->events[1] >= 0)
+               pasemi_dma_free_flag(ring->events[1]);
+       pasemi_dma_free_ring(&ring->chan);
+ out_ring_desc:
+       pasemi_dma_free_chan(&ring->chan);
+ out_chan:
+       return NULL;
+ }
+ static void pasemi_mac_setup_csrings(struct pasemi_mac *mac)
+ {
+       int i;
+       mac->cs[0] = pasemi_mac_setup_csring(mac);
+       if (mac->type == MAC_TYPE_XAUI)
+               mac->cs[1] = pasemi_mac_setup_csring(mac);
+       else
+               mac->cs[1] = 0;
+       for (i = 0; i < MAX_CS; i++)
+               if (mac->cs[i])
+                       mac->num_cs++;
+ }
+ static void pasemi_mac_free_csring(struct pasemi_mac_csring *csring)
+ {
+       pasemi_dma_stop_chan(&csring->chan);
+       pasemi_dma_free_flag(csring->events[0]);
+       pasemi_dma_free_flag(csring->events[1]);
+       pasemi_dma_free_ring(&csring->chan);
+       pasemi_dma_free_chan(&csring->chan);
+       pasemi_dma_free_fun(csring->fun);
+ }
  static int pasemi_mac_setup_rx_resources(const struct net_device *dev)
  {
        struct pasemi_mac_rxring *ring;
@@@ -445,7 -530,7 +530,7 @@@ pasemi_mac_setup_tx_resources(const str
        cfg = PAS_DMA_TXCHAN_CFG_TY_IFACE |
              PAS_DMA_TXCHAN_CFG_TATTR(mac->dma_if) |
              PAS_DMA_TXCHAN_CFG_UP |
-             PAS_DMA_TXCHAN_CFG_WT(2);
+             PAS_DMA_TXCHAN_CFG_WT(4);
  
        if (translation_enabled())
                cfg |= PAS_DMA_TXCHAN_CFG_TRD | PAS_DMA_TXCHAN_CFG_TRR;
@@@ -810,13 -895,21 +895,21 @@@ restart
                u64 mactx = TX_DESC(txring, i);
                struct sk_buff *skb;
  
-               skb = TX_DESC_INFO(txring, i+1).skb;
-               nr_frags = TX_DESC_INFO(txring, i).dma;
                if ((mactx  & XCT_MACTX_E) ||
                    (*chan->status & PAS_STATUS_ERROR))
                        pasemi_mac_tx_error(mac, mactx);
  
+               /* Skip over control descriptors */
+               if (!(mactx & XCT_MACTX_LLEN_M)) {
+                       TX_DESC(txring, i) = 0;
+                       TX_DESC(txring, i+1) = 0;
+                       buf_count = 2;
+                       continue;
+               }
+               skb = TX_DESC_INFO(txring, i+1).skb;
+               nr_frags = TX_DESC_INFO(txring, i).dma;
                if (unlikely(mactx & XCT_MACTX_O))
                        /* Not yet transmitted */
                        break;
@@@ -1012,7 -1105,7 +1105,7 @@@ static int pasemi_mac_phy_init(struct n
                goto err;
  
        phy_id = *prop;
 -      snprintf(mac->phy_id, BUS_ID_SIZE, PHY_ID_FMT, (int)r.start, phy_id);
 +      snprintf(mac->phy_id, BUS_ID_SIZE, "%x:%02x", (int)r.start, phy_id);
  
        of_node_put(phy_dn);
  
@@@ -1041,13 -1134,7 +1134,7 @@@ static int pasemi_mac_open(struct net_d
  {
        struct pasemi_mac *mac = netdev_priv(dev);
        unsigned int flags;
-       int ret;
-       /* enable rx section */
-       write_dma_reg(PAS_DMA_COM_RXCMD, PAS_DMA_COM_RXCMD_EN);
-       /* enable tx section */
-       write_dma_reg(PAS_DMA_COM_TXCMD, PAS_DMA_COM_TXCMD_EN);
+       int i, ret;
  
        flags = PAS_MAC_CFG_TXP_FCE | PAS_MAC_CFG_TXP_FPC(3) |
                PAS_MAC_CFG_TXP_SL(3) | PAS_MAC_CFG_TXP_COB(0xf) |
        if (!mac->tx)
                goto out_tx_ring;
  
+       /* We might already have allocated rings in case mtu was changed
+        * before interface was brought up.
+        */
+       if (dev->mtu > 1500 && !mac->num_cs) {
+               pasemi_mac_setup_csrings(mac);
+               if (!mac->num_cs)
+                       goto out_tx_ring;
+       }
+       /* Zero out rmon counters */
+       for (i = 0; i < 32; i++)
+               write_mac_reg(mac, PAS_MAC_RMON(i), 0);
        /* 0x3ff with 33MHz clock is about 31us */
        write_iob_reg(PAS_IOB_DMA_COM_TIMEOUTCFG,
                      PAS_IOB_DMA_COM_TIMEOUTCFG_TCNT(0x3ff));
@@@ -1247,7 -1347,7 +1347,7 @@@ static int pasemi_mac_close(struct net_
  {
        struct pasemi_mac *mac = netdev_priv(dev);
        unsigned int sta;
-       int rxch, txch;
+       int rxch, txch, i;
  
        rxch = rx_ring(mac)->chan.chno;
        txch = tx_ring(mac)->chan.chno;
        free_irq(mac->tx->chan.irq, mac->tx);
        free_irq(mac->rx->chan.irq, mac->rx);
  
+       for (i = 0; i < mac->num_cs; i++) {
+               pasemi_mac_free_csring(mac->cs[i]);
+               mac->cs[i] = NULL;
+       }
+       mac->num_cs = 0;
        /* Free resources */
        pasemi_mac_free_rx_resources(mac);
        pasemi_mac_free_tx_resources(mac);
        return 0;
  }
  
+ static void pasemi_mac_queue_csdesc(const struct sk_buff *skb,
+                                   const dma_addr_t *map,
+                                   const unsigned int *map_size,
+                                   struct pasemi_mac_txring *txring,
+                                   struct pasemi_mac_csring *csring)
+ {
+       u64 fund;
+       dma_addr_t cs_dest;
+       const int nh_off = skb_network_offset(skb);
+       const int nh_len = skb_network_header_len(skb);
+       const int nfrags = skb_shinfo(skb)->nr_frags;
+       int cs_size, i, fill, hdr, cpyhdr, evt;
+       dma_addr_t csdma;
+       fund = XCT_FUN_ST | XCT_FUN_RR_8BRES |
+              XCT_FUN_O | XCT_FUN_FUN(csring->fun) |
+              XCT_FUN_CRM_SIG | XCT_FUN_LLEN(skb->len - nh_off) |
+              XCT_FUN_SHL(nh_len >> 2) | XCT_FUN_SE;
+       switch (ip_hdr(skb)->protocol) {
+       case IPPROTO_TCP:
+               fund |= XCT_FUN_SIG_TCP4;
+               /* TCP checksum is 16 bytes into the header */
+               cs_dest = map[0] + skb_transport_offset(skb) + 16;
+               break;
+       case IPPROTO_UDP:
+               fund |= XCT_FUN_SIG_UDP4;
+               /* UDP checksum is 6 bytes into the header */
+               cs_dest = map[0] + skb_transport_offset(skb) + 6;
+               break;
+       default:
+               BUG();
+       }
+       /* Do the checksum offloaded */
+       fill = csring->next_to_fill;
+       hdr = fill;
+       CS_DESC(csring, fill++) = fund;
+       /* Room for 8BRES. Checksum result is really 2 bytes into it */
+       csdma = csring->chan.ring_dma + (fill & (CS_RING_SIZE-1)) * 8 + 2;
+       CS_DESC(csring, fill++) = 0;
+       CS_DESC(csring, fill) = XCT_PTR_LEN(map_size[0]-nh_off) | XCT_PTR_ADDR(map[0]+nh_off);
+       for (i = 1; i <= nfrags; i++)
+               CS_DESC(csring, fill+i) = XCT_PTR_LEN(map_size[i]) | XCT_PTR_ADDR(map[i]);
+       fill += i;
+       if (fill & 1)
+               fill++;
+       /* Copy the result into the TCP packet */
+       cpyhdr = fill;
+       CS_DESC(csring, fill++) = XCT_FUN_O | XCT_FUN_FUN(csring->fun) |
+                                 XCT_FUN_LLEN(2) | XCT_FUN_SE;
+       CS_DESC(csring, fill++) = XCT_PTR_LEN(2) | XCT_PTR_ADDR(cs_dest) | XCT_PTR_T;
+       CS_DESC(csring, fill++) = XCT_PTR_LEN(2) | XCT_PTR_ADDR(csdma);
+       fill++;
+       evt = !csring->last_event;
+       csring->last_event = evt;
+       /* Event handshaking with MAC TX */
+       CS_DESC(csring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
+                                 CTRL_CMD_ETYPE_SET | CTRL_CMD_REG(csring->events[evt]);
+       CS_DESC(csring, fill++) = 0;
+       CS_DESC(csring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
+                                 CTRL_CMD_ETYPE_WCLR | CTRL_CMD_REG(csring->events[!evt]);
+       CS_DESC(csring, fill++) = 0;
+       csring->next_to_fill = fill & (CS_RING_SIZE-1);
+       cs_size = fill - hdr;
+       write_dma_reg(PAS_DMA_TXCHAN_INCR(csring->chan.chno), (cs_size) >> 1);
+       /* TX-side event handshaking */
+       fill = txring->next_to_fill;
+       TX_DESC(txring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
+                                 CTRL_CMD_ETYPE_WSET | CTRL_CMD_REG(csring->events[evt]);
+       TX_DESC(txring, fill++) = 0;
+       TX_DESC(txring, fill++) = CTRL_CMD_T | CTRL_CMD_META_EVT | CTRL_CMD_O |
+                                 CTRL_CMD_ETYPE_CLR | CTRL_CMD_REG(csring->events[!evt]);
+       TX_DESC(txring, fill++) = 0;
+       txring->next_to_fill = fill;
+       write_dma_reg(PAS_DMA_TXCHAN_INCR(txring->chan.chno), 2);
+       return;
+ }
  static int pasemi_mac_start_tx(struct sk_buff *skb, struct net_device *dev)
  {
-       struct pasemi_mac *mac = netdev_priv(dev);
-       struct pasemi_mac_txring *txring;
-       u64 dflags, mactx;
+       struct pasemi_mac * const mac = netdev_priv(dev);
+       struct pasemi_mac_txring * const txring = tx_ring(mac);
+       struct pasemi_mac_csring *csring;
+       u64 dflags = 0;
+       u64 mactx;
        dma_addr_t map[MAX_SKB_FRAGS+1];
        unsigned int map_size[MAX_SKB_FRAGS+1];
        unsigned long flags;
        int i, nfrags;
        int fill;
+       const int nh_off = skb_network_offset(skb);
+       const int nh_len = skb_network_header_len(skb);
  
-       dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_CRC_PAD;
-       if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               const unsigned char *nh = skb_network_header(skb);
+       prefetch(&txring->ring_info);
  
-               switch (ip_hdr(skb)->protocol) {
-               case IPPROTO_TCP:
-                       dflags |= XCT_MACTX_CSUM_TCP;
-                       dflags |= XCT_MACTX_IPH(skb_network_header_len(skb) >> 2);
-                       dflags |= XCT_MACTX_IPO(nh - skb->data);
-                       break;
-               case IPPROTO_UDP:
-                       dflags |= XCT_MACTX_CSUM_UDP;
-                       dflags |= XCT_MACTX_IPH(skb_network_header_len(skb) >> 2);
-                       dflags |= XCT_MACTX_IPO(nh - skb->data);
-                       break;
-               }
-       }
+       dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_CRC_PAD;
  
        nfrags = skb_shinfo(skb)->nr_frags;
  
                }
        }
  
-       mactx = dflags | XCT_MACTX_LLEN(skb->len);
+       if (skb->ip_summed == CHECKSUM_PARTIAL && skb->len <= 1540) {
+               switch (ip_hdr(skb)->protocol) {
+               case IPPROTO_TCP:
+                       dflags |= XCT_MACTX_CSUM_TCP;
+                       dflags |= XCT_MACTX_IPH(nh_len >> 2);
+                       dflags |= XCT_MACTX_IPO(nh_off);
+                       break;
+               case IPPROTO_UDP:
+                       dflags |= XCT_MACTX_CSUM_UDP;
+                       dflags |= XCT_MACTX_IPH(nh_len >> 2);
+                       dflags |= XCT_MACTX_IPO(nh_off);
+                       break;
+               default:
+                       WARN_ON(1);
+               }
+       }
  
-       txring = tx_ring(mac);
+       mactx = dflags | XCT_MACTX_LLEN(skb->len);
  
        spin_lock_irqsave(&txring->lock, flags);
  
-       fill = txring->next_to_fill;
        /* Avoid stepping on the same cache line that the DMA controller
         * is currently about to send, so leave at least 8 words available.
         * Total free space needed is mactx + fragments + 8
         */
-       if (RING_AVAIL(txring) < nfrags + 10) {
+       if (RING_AVAIL(txring) < nfrags + 14) {
                /* no room -- stop the queue and wait for tx intr */
                netif_stop_queue(dev);
                goto out_err;
        }
  
+       /* Queue up checksum + event descriptors, if needed */
+       if (mac->num_cs && skb->ip_summed == CHECKSUM_PARTIAL && skb->len > 1540) {
+               csring = mac->cs[mac->last_cs];
+               mac->last_cs = (mac->last_cs + 1) % mac->num_cs;
+               pasemi_mac_queue_csdesc(skb, map, map_size, txring, csring);
+       }
+       fill = txring->next_to_fill;
        TX_DESC(txring, fill) = mactx;
        TX_DESC_INFO(txring, fill).dma = nfrags;
        fill++;
@@@ -1441,12 -1648,33 +1648,33 @@@ static int pasemi_mac_poll(struct napi_
        return pkts;
  }
  
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+ /*
+  * Polling 'interrupt' - used by things like netconsole to send skbs
+  * without having to re-enable interrupts. It's not called while
+  * the interrupt routine is executing.
+  */
+ static void pasemi_mac_netpoll(struct net_device *dev)
+ {
+       const struct pasemi_mac *mac = netdev_priv(dev);
+       disable_irq(mac->tx->chan.irq);
+       pasemi_mac_tx_intr(mac->tx->chan.irq, mac->tx);
+       enable_irq(mac->tx->chan.irq);
+       disable_irq(mac->rx->chan.irq);
+       pasemi_mac_rx_intr(mac->rx->chan.irq, mac->rx);
+       enable_irq(mac->rx->chan.irq);
+ }
+ #endif
  static int pasemi_mac_change_mtu(struct net_device *dev, int new_mtu)
  {
        struct pasemi_mac *mac = netdev_priv(dev);
        unsigned int reg;
-       unsigned int rcmdsta;
+       unsigned int rcmdsta = 0;
        int running;
+       int ret = 0;
  
        if (new_mtu < PE_MIN_MTU || new_mtu > PE_MAX_MTU)
                return -EINVAL;
                pasemi_mac_pause_rxint(mac);
                pasemi_mac_clean_rx(rx_ring(mac), RX_RING_SIZE);
                pasemi_mac_free_rx_buffers(mac);
+       }
+       /* Setup checksum channels if large MTU and none already allocated */
+       if (new_mtu > 1500 && !mac->num_cs) {
+               pasemi_mac_setup_csrings(mac);
+               if (!mac->num_cs) {
+                       ret = -ENOMEM;
+                       goto out;
+               }
        }
  
        /* Change maxf, i.e. what size frames are accepted.
        /* MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
        mac->bufsz = new_mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
  
+ out:
        if (running) {
                write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
                              rcmdsta | PAS_DMA_RXINT_RCMDSTA_EN);
                pasemi_mac_intf_enable(mac);
        }
  
-       return 0;
+       return ret;
  }
  
  static int __devinit
@@@ -1528,7 -1767,7 +1767,7 @@@ pasemi_mac_probe(struct pci_dev *pdev, 
        netif_napi_add(dev, &mac->napi, pasemi_mac_poll, 64);
  
        dev->features = NETIF_F_IP_CSUM | NETIF_F_LLTX | NETIF_F_SG |
-                       NETIF_F_HIGHDMA;
+                       NETIF_F_HIGHDMA | NETIF_F_GSO;
  
        mac->lro_mgr.max_aggr = LRO_MAX_AGGR;
        mac->lro_mgr.max_desc = MAX_LRO_DESCRIPTORS;
        dev->mtu = PE_DEF_MTU;
        /* 1500 MTU + ETH_HLEN + VLAN_HLEN + 2 64B cachelines */
        mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
+ #ifdef CONFIG_NET_POLL_CONTROLLER
+       dev->poll_controller = pasemi_mac_netpoll;
+ #endif
  
        dev->change_mtu = pasemi_mac_change_mtu;
+       dev->ethtool_ops = &pasemi_mac_ethtool_ops;
  
        if (err)
                goto out;
diff --combined drivers/net/ucc_geth.c
index 29a4d650e8a8efcc1057ebad77746928a5f08157,ed84182c682808f70236fbae94e683740d3b96a1..2f11254bcc077fa22f506a1481221150429d3bee
@@@ -3833,7 -3833,6 +3833,7 @@@ static int ucc_geth_probe(struct of_dev
        struct device_node *phy;
        int err, ucc_num, max_speed = 0;
        const phandle *ph;
 +      const u32 *fixed_link;
        const unsigned int *prop;
        const char *sprop;
        const void *mac_addr;
  
        ugeth_vdbg("%s: IN", __FUNCTION__);
  
-       prop = of_get_property(np, "device-id", NULL);
+       prop = of_get_property(np, "cell-index", NULL);
+       if (!prop) {
+               prop = of_get_property(np, "device-id", NULL);
+               if (!prop)
+                       return -ENODEV;
+       }
        ucc_num = *prop - 1;
        if ((ucc_num < 0) || (ucc_num > 7))
                return -ENODEV;
  
        ug_info->uf_info.regs = res.start;
        ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
 +      fixed_link = of_get_property(np, "fixed-link", NULL);
 +      if (fixed_link) {
 +              ug_info->mdio_bus = 0;
 +              ug_info->phy_address = fixed_link[0];
 +              phy = NULL;
 +      } else {
 +              ph = of_get_property(np, "phy-handle", NULL);
 +              phy = of_find_node_by_phandle(*ph);
 +
 +              if (phy == NULL)
 +                      return -ENODEV;
  
 -      ph = of_get_property(np, "phy-handle", NULL);
 -      phy = of_find_node_by_phandle(*ph);
 +              /* set the PHY address */
 +              prop = of_get_property(phy, "reg", NULL);
 +              if (prop == NULL)
 +                      return -1;
 +              ug_info->phy_address = *prop;
  
 -      if (phy == NULL)
 -              return -ENODEV;
 +              /* Set the bus id */
 +              mdio = of_get_parent(phy);
 +
 +              if (mdio == NULL)
 +                      return -1;
 +
 +              err = of_address_to_resource(mdio, 0, &res);
 +              of_node_put(mdio);
 +
 +              if (err)
 +                      return -1;
  
 -      /* set the PHY address */
 -      prop = of_get_property(phy, "reg", NULL);
 -      if (prop == NULL)
 -              return -1;
 -      ug_info->phy_address = *prop;
 +              snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", res.start);
 +      }
  
        /* get the phy interface type, or default to MII */
        prop = of_get_property(np, "phy-connection-type", NULL);
                ug_info->numThreadsRx = UCC_GETH_NUM_OF_THREADS_4;
        }
  
 -      /* Set the bus id */
 -      mdio = of_get_parent(phy);
 -
 -      if (mdio == NULL)
 -              return -1;
 -
 -      err = of_address_to_resource(mdio, 0, &res);
 -      of_node_put(mdio);
 -
 -      if (err)
 -              return -1;
 -
 -      ug_info->mdio_bus = res.start;
 -
        if (netif_msg_probe(&debug))
                printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n",
                        ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs,
index e4d3f330bac341941023a7131bb2c0e39dc86f24,8a48ddb1e866d9062b0e7c09224546f3ee13fcc9..2af490781005d63dbfe5eb1322ab7142c9c178ea
@@@ -157,7 -157,7 +157,7 @@@ static int uec_mdio_probe(struct of_dev
        if (err)
                goto reg_map_fail;
  
 -      new_bus->id = res.start;
 +      snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start);
  
        new_bus->irq = kmalloc(32 * sizeof(int), GFP_KERNEL);
  
                if ((res.start >= tempres.start) &&
                    (res.end <= tempres.end)) {
                        /* set this UCC to be the MII master */
-                       const u32 *id = of_get_property(tempnp, "device-id", NULL);
-                       if (id == NULL)
-                               goto bus_register_fail;
+                       const u32 *id;
+                       id = of_get_property(tempnp, "cell-index", NULL);
+                       if (!id) {
+                               id = of_get_property(tempnp, "device-id", NULL);
+                               if (!id)
+                                       goto bus_register_fail;
+                       }
  
                        ucc_set_qe_mux_mii_mng(*id - 1);
  
diff --combined lib/Makefile
index 4d7649c326f63d0ebab7932c15659ea899154036,61bba16a0a2fb85ab34b7f1c96faac5115d37cb4..bf8000fc7d48e771eb560f10fde894c64bffbb63
@@@ -29,6 -29,7 +29,6 @@@ obj-$(CONFIG_DEBUG_LOCKING_API_SELFTEST
  obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
  lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
  lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
 -lib-$(CONFIG_SEMAPHORE_SLEEPERS) += semaphore-sleepers.o
  lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
  obj-$(CONFIG_GENERIC_HWEIGHT) += hweight.o
  obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o
@@@ -60,6 -61,7 +60,6 @@@ obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.
  obj-$(CONFIG_TEXTSEARCH_BM) += ts_bm.o
  obj-$(CONFIG_TEXTSEARCH_FSM) += ts_fsm.o
  obj-$(CONFIG_SMP) += percpu_counter.o
 -obj-$(CONFIG_SMP) += pcounter.o
  obj-$(CONFIG_AUDIT_GENERIC) += audit.o
  
  obj-$(CONFIG_SWIOTLB) += swiotlb.o
@@@ -68,6 -70,8 +68,8 @@@ obj-$(CONFIG_FAULT_INJECTION) += fault-
  
  lib-$(CONFIG_GENERIC_BUG) += bug.o
  
+ obj-$(CONFIG_HAVE_LMB) += lmb.o
  hostprogs-y   := gen_crc32table
  clean-files   := crc32table.h