Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@g5.osdl.org>
Mon, 31 Jul 2006 20:39:52 +0000 (13:39 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 31 Jul 2006 20:39:52 +0000 (13:39 -0700)
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc:
  [POWERPC] Minor comment fix for misc_64.S
  [POWERPC] Use H_CEDE on non-SMT
  [POWERPC] force 64bit mode in fwnmi handlers to workaround firmware bugs
  [POWERPC] PMAC_APM_EMU should depend on ADB_PMU
  [POWERPC] Fix new interrupt code (MPIC detection)
  [POWERPC] Fix new interrupt code (MPIC endianness)
  [POWERPC] Add cpufreq support for Xserve G5
  [POWERPC] Xserve G5 thermal control fixes
  [POWERPC] Fix mem= handling when the memory limit is > RMO size
  [POWERPC] More offb/bootx fixes
  [POWERPC] Fix legacy_serial.c error handling on 32 bits
  [POWERPC] Fix default clock for udbg_16550
  [POWERPC] Fix non-MPIC CHRPs with CONFIG_SMP set
  [POWERPC] Fix 32 bits warning in prom_init.c
  [POWERPC] Workaround Pegasos incorrect ISA "ranges"
  [POWERPC] fix up front-LED Kconfig

220 files changed:
Documentation/DocBook/kernel-api.tmpl
Documentation/SubmittingPatches
Documentation/accounting/delay-accounting.txt
Documentation/cpu-hotplug.txt
Documentation/devices.txt
Documentation/feature-removal-schedule.txt
Documentation/initrd.txt
Documentation/kbuild/makefiles.txt
Documentation/kernel-parameters.txt
Documentation/x86_64/boot-options.txt
MAINTAINERS
Makefile
arch/alpha/kernel/err_ev7.c
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/setup.c
arch/alpha/kernel/sys_ruffian.c
arch/alpha/kernel/time.c
arch/arm/configs/ep93xx_defconfig
arch/arm/kernel/head.S
arch/arm/kernel/traps.c
arch/arm/mach-footbridge/cats-hw.c
arch/arm/mach-s3c2410/mach-anubis.c
arch/arm/mach-s3c2410/mach-osiris.c
arch/arm/mm/ioremap.c
arch/arm/mm/proc-syms.c
arch/arm/mm/proc-xscale.S
arch/i386/Kconfig
arch/i386/kernel/Makefile
arch/i386/kernel/cpu/intel_cacheinfo.c
arch/i386/kernel/cpu/mcheck/mce.h
arch/i386/kernel/entry.S
arch/i386/kernel/kprobes.c
arch/i386/kernel/machine_kexec.c
arch/i386/kernel/nmi.c
arch/i386/kernel/process.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/time.c
arch/i386/kernel/traps.c
arch/i386/kernel/vsyscall.lds.S
arch/ia64/configs/sn2_defconfig
arch/ia64/defconfig
arch/ia64/kernel/Makefile
arch/ia64/kernel/gate.lds.S
arch/ia64/kernel/kprobes.c
arch/ia64/kernel/palinfo.c
arch/ia64/kernel/topology.c
arch/ia64/kernel/traps.c
arch/parisc/kernel/vmlinux.lds.S
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/vdso32/Makefile
arch/powerpc/kernel/vdso32/vdso32.lds.S
arch/powerpc/kernel/vdso64/Makefile
arch/powerpc/kernel/vdso64/vdso64.lds.S
arch/powerpc/platforms/powermac/backlight.c
arch/ppc/kernel/vmlinux.lds.S
arch/s390/appldata/appldata_base.c
arch/s390/defconfig
arch/sparc/kernel/time.c
arch/sparc64/mm/fault.c
arch/um/kernel/dyn.lds.S
arch/v850/kernel/setup.c
arch/v850/kernel/v850_ksyms.c
arch/x86_64/defconfig
arch/x86_64/ia32/Makefile
arch/x86_64/ia32/ia32entry.S
arch/x86_64/ia32/vsyscall.lds
arch/x86_64/kernel/machine_kexec.c
arch/x86_64/kernel/mce.c
arch/x86_64/kernel/mce_amd.c
arch/x86_64/kernel/pci-calgary.c
arch/x86_64/kernel/pci-swiotlb.c
arch/x86_64/kernel/tce.c
arch/x86_64/kernel/time.c
arch/x86_64/kernel/traps.c
arch/x86_64/pci/k8-bus.c
arch/xtensa/kernel/traps.c
block/blktrace.c
block/cfq-iosched.c
drivers/base/topology.c
drivers/block/cciss.c
drivers/block/nbd.c
drivers/block/pktcdvd.c
drivers/char/hw_random/geode-rng.c
drivers/char/hw_random/intel-rng.c
drivers/char/pc8736x_gpio.c
drivers/connector/cn_proc.c
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/cpufreq/cpufreq_userspace.c
drivers/ide/Kconfig
drivers/ide/ide-disk.c
drivers/ide/ide-dma.c
drivers/ide/ide-iops.c
drivers/ide/ide.c
drivers/ide/pci/it821x.c
drivers/macintosh/Kconfig
drivers/macintosh/adbhid.c
drivers/macintosh/via-pmu-backlight.c
drivers/macintosh/via-pmu.c
drivers/net/myri10ge/myri10ge.c
drivers/net/skge.c
drivers/net/sunlance.c
drivers/net/tg3.c
drivers/net/via-velocity.c
drivers/net/wireless/Kconfig
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/orinoco.c
drivers/net/wireless/zd1201.c
drivers/pci/search.c
drivers/pcmcia/pcmcia_ioctl.c
drivers/pcmcia/pcmcia_resource.c
drivers/pnp/pnpbios/core.c
drivers/s390/cio/ccwgroup.c
drivers/s390/cio/device_fsm.c
drivers/scsi/NCR53C9x.c
drivers/scsi/arm/fas216.c
drivers/scsi/esp.c
drivers/scsi/libata-eh.c
drivers/scsi/sata_promise.c
drivers/scsi/scsi_ioctl.c
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/aty/aty128fb.c
drivers/video/aty/atyfb_base.c
drivers/video/aty/radeon_base.c
drivers/video/aty/radeon_pm.c
drivers/video/aty/radeonfb.h
drivers/video/backlight/Kconfig
drivers/video/console/mdacon.c
drivers/video/fb_notify.c [new file with mode: 0644]
drivers/video/fbmem.c
drivers/video/nvidia/nvidia.c
drivers/video/riva/fbdev.c
fs/9p/conv.c
fs/9p/vfs_inode.c
fs/buffer.c
fs/coda/file.c
fs/efs/symlink.c
fs/ext3/inode.c
fs/ext3/namei.c
fs/freevxfs/vxfs_lookup.c
fs/fuse/control.c
fs/fuse/dir.c
fs/fuse/fuse_i.h
fs/fuse/inode.c
fs/inotify_user.c
fs/nfsd/nfsfh.c
fs/partitions/Kconfig
fs/ufs/namei.c
fs/xfs/linux-2.6/xfs_buf.h
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/quota/xfs_qm_bhv.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_log.c
fs/xfs/xfs_vfsops.c
include/asm-arm/arch-iop3xx/iop331-irqs.h
include/asm-i386/kprobes.h
include/asm-ia64/kprobes.h
include/asm-powerpc/backlight.h
include/asm-powerpc/kprobes.h
include/asm-sparc/signal.h
include/asm-sparc64/kprobes.h
include/asm-sparc64/pgtable.h
include/asm-sparc64/sfp-machine.h
include/asm-x86_64/calgary.h
include/asm-x86_64/kprobes.h
include/asm-x86_64/page.h
include/asm-x86_64/swiotlb.h
include/linux/cn_proc.h
include/linux/cpufreq.h
include/linux/delayacct.h
include/linux/ext3_fs.h
include/linux/fb.h
include/linux/futex.h
include/linux/ide.h
include/linux/irq.h
include/linux/jiffies.h
include/linux/libata.h
include/linux/netfilter_bridge.h
include/linux/pmu.h
ipc/msg.c
kernel/delayacct.c
kernel/futex.c
kernel/futex_compat.c
kernel/hrtimer.c
kernel/irq/manage.c
kernel/kprobes.c
kernel/rcupdate.c
kernel/rtmutex.c
kernel/sched.c
kernel/softirq.c
kernel/softlockup.c
kernel/taskstats.c
kernel/timer.c
kernel/workqueue.c
lib/zlib_inflate/inflate.c
mm/filemap.c
mm/slab.c
net/bridge/br_netfilter.c
net/ieee80211/Kconfig
net/ieee80211/softmac/ieee80211softmac_auth.c
net/ipv4/ip_input.c
net/ipv4/ipmr.c
net/ipv4/netfilter/ip_conntrack_helper_h323.c
net/ipv4/netfilter/ip_conntrack_standalone.c
net/ipv4/netfilter/ip_nat_snmp_basic.c
net/ipv4/raw.c
net/ipv6/ip6_input.c
net/ipv6/raw.c
net/netfilter/Kconfig
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nf_queue.c
net/netfilter/xt_physdev.c
net/netfilter/xt_pkttype.c
scripts/Kbuild.include
scripts/kernel-doc
security/selinux/ss/policydb.c
security/selinux/ss/services.c

index 1ae4dc0fd8564db5801951997946603f0ce4a79d..f8fe882e33dccfc50f6e5add6ca89a53389d649f 100644 (file)
@@ -58,6 +58,9 @@
 !Iinclude/linux/ktime.h
 !Iinclude/linux/hrtimer.h
 !Ekernel/hrtimer.c
+     </sect1>
+     <sect1><title>Workqueues and Kevents</title>
+!Ekernel/workqueue.c
      </sect1>
      <sect1><title>Internal Functions</title>
 !Ikernel/exit.c
@@ -300,7 +303,7 @@ X!Ekernel/module.c
      </sect1>
 
      <sect1><title>Resources Management</title>
-!Ekernel/resource.c
+!Ikernel/resource.c
      </sect1>
 
      <sect1><title>MTRR Handling</title>
@@ -312,9 +315,7 @@ X!Ekernel/module.c
 !Edrivers/pci/pci-driver.c
 !Edrivers/pci/remove.c
 !Edrivers/pci/pci-acpi.c
-<!-- kerneldoc does not understand __devinit
-X!Edrivers/pci/search.c
- -->
+!Edrivers/pci/search.c
 !Edrivers/pci/msi.c
 !Edrivers/pci/bus.c
 <!-- FIXME: Removed for now since no structured comments in source
index c2c85bcb3d438b983ccc1535acbbd185867e26c3..2cd7f02ffd0b3bc874f20a99e15a82edb694c646 100644 (file)
@@ -10,7 +10,9 @@ kernel, the process can sometimes be daunting if you're not familiar
 with "the system."  This text is a collection of suggestions which
 can greatly increase the chances of your change being accepted.
 
-If you are submitting a driver, also read Documentation/SubmittingDrivers.
+Read Documentation/SubmitChecklist for a list of items to check
+before submitting code.  If you are submitting a driver, also read
+Documentation/SubmittingDrivers.
 
 
 
@@ -74,9 +76,6 @@ There are a number of scripts which can aid in this:
 Quilt:
 http://savannah.nongnu.org/projects/quilt
 
-Randy Dunlap's patch scripts:
-http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz
-
 Andrew Morton's patch scripts:
 http://www.zip.com.au/~akpm/linux/patches/
 Instead of these scripts, quilt is the recommended patch management
@@ -484,7 +483,7 @@ Greg Kroah-Hartman "How to piss off a kernel subsystem maintainer".
   <http://www.kroah.com/log/2005/10/19/>
   <http://www.kroah.com/log/2006/01/11/>
 
-NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!.
+NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
   <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
 
 Kernel Documentation/CodingStyle
@@ -493,4 +492,3 @@ Kernel Documentation/CodingStyle
 Linus Torvald's mail on the canonical patch format:
   <http://lkml.org/lkml/2005/4/7/183>
 --
-Last updated on 17 Nov 2005.
index be215e58423b8068ac79b7f44561222195b8a3a0..1443cd71d2631241f13286e544296ef286d91c90 100644 (file)
@@ -64,11 +64,13 @@ Compile the kernel with
        CONFIG_TASK_DELAY_ACCT=y
        CONFIG_TASKSTATS=y
 
-Enable the accounting at boot time by adding
-the following to the kernel boot options
-       delayacct
+Delay accounting is enabled by default at boot up.
+To disable, add
+   nodelayacct
+to the kernel boot options. The rest of the instructions
+below assume this has not been done.
 
-and after the system has booted up, use a utility
+After the system has booted up, use a utility
 similar to  getdelays.c to access the delays
 seen by a given task or a task group (tgid).
 The utility also allows a given command to be
index 1bcf69996c9df74fba87c25949c05285ff604d3b..bc107cb157a8bba060ce65bb9ded734bfbdd15a8 100644 (file)
@@ -251,16 +251,24 @@ A: This is what you would need in your kernel code to receive notifications.
                return NOTIFY_OK;
        }
 
-       static struct notifier_block foobar_cpu_notifer =
+       static struct notifier_block __cpuinitdata foobar_cpu_notifer =
        {
           .notifier_call = foobar_cpu_callback,
        };
 
+You need to call register_cpu_notifier() from your init function.
+Init functions could be of two types:
+1. early init (init function called when only the boot processor is online).
+2. late init (init function called _after_ all the CPUs are online).
 
-In your init function,
+For the first case, you should add the following to your init function
 
        register_cpu_notifier(&foobar_cpu_notifier);
 
+For the second case, you should add the following to your init function
+
+       register_hotcpu_notifier(&foobar_cpu_notifier);
+
 You can fail PREPARE notifiers if something doesn't work to prepare resources.
 This will stop the activity and send a following CANCELED event back.
 
index 4aaf68fafebe78fe67933fffab7fe96bfb5a8bfe..66c725f530f38b2c836f52ced2fa898c640f8db1 100644 (file)
@@ -2565,10 +2565,10 @@ Your cooperation is appreciated.
                243 = /dev/usb/dabusb3  Fourth dabusb device
 
 180 block      USB block devices
-               0 = /dev/uba            First USB block device
-               8 = /dev/ubb            Second USB block device
-               16 = /dev/ubc           Thrid USB block device
-               ...
+                 0 = /dev/uba          First USB block device
+                 8 = /dev/ubb          Second USB block device
+                16 = /dev/ubc          Third USB block device
+                   ...
 
 181 char       Conrad Electronic parallel port radio clocks
                  0 = /dev/pcfclock0    First Conrad radio clock
index 9d3a0775a11df394f3504dbd13ee60af75db4c3b..87851efb02285658f55031c390258c10c490d170 100644 (file)
@@ -258,3 +258,19 @@ Why:       These drivers never compiled since they were added to the kernel
 Who:   Jean Delvare <khali@linux-fr.org>
 
 ---------------------------
+
+What:  Bridge netfilter deferred IPv4/IPv6 output hook calling
+When:  January 2007
+Why:   The deferred output hooks are a layering violation causing unusual
+       and broken behaviour on bridge devices. Examples of things they
+       break include QoS classifation using the MARK or CLASSIFY targets,
+       the IPsec policy match and connection tracking with VLANs on a
+       bridge. Their only use is to enable bridge output port filtering
+       within iptables with the physdev match, which can also be done by
+       combining iptables and ebtables using netfilter marks. Until it
+       will get removed the hook deferral is disabled by default and is
+       only enabled when needed.
+
+Who:   Patrick McHardy <kaber@trash.net>
+
+---------------------------
index b1b6440237a6ef82fa367fdc4560e7b6d3590eb2..15f1b35deb3410932fcf5d9ef7fad28f69080408 100644 (file)
@@ -72,6 +72,22 @@ initrd adds the following new options:
     initrd is mounted as root, and the normal boot procedure is followed,
     with the RAM disk still mounted as root.
 
+Compressed cpio images
+----------------------
+
+Recent kernels have support for populating a ramdisk from a compressed cpio
+archive, on such systems, the creation of a ramdisk image doesn't need to
+involve special block devices or loopbacks, you merely create a directory on
+disk with the desired initrd content, cd to that directory, and run (as an
+example):
+
+find . | cpio --quiet -c -o | gzip -9 -n > /boot/imagefile.img
+
+Examining the contents of an existing image file is just as simple:
+
+mkdir /tmp/imagefile
+cd /tmp/imagefile
+gzip -cd /boot/imagefile.img | cpio -imd --quiet
 
 Installation
 ------------
index 14ef3868a328d5080b8748507a8e8be576c936cd..0706699c9da91c7814449f41714ee883017e0a66 100644 (file)
@@ -407,6 +407,20 @@ more details, with real examples.
        The second argument is optional, and if supplied will be used
        if first argument is not supported.
 
+    ld-option
+       ld-option is used to check if $(CC) when used to link object files
+       supports the given option.  An optional second option may be
+       specified if first option are not supported.
+
+       Example:
+               #arch/i386/kernel/Makefile
+               vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv)
+
+       In the above example vsyscall-flags will be assigned the option
+       -Wl$(comma)--hash-style=sysv if it is supported by $(CC).
+       The second argument is optional, and if supplied will be used
+       if first argument is not supported.
+
     cc-option
        cc-option is used to check if $(CC) support a given option, and not
        supported to use an optional second option.
index e11f7728ec6f0691b940daa3d2ec5c7b182417fc..b50595a0550f7d45d46358c2156e10154e9ed67c 100644 (file)
@@ -448,8 +448,6 @@ running once the system is up.
                        Format: <area>[,<node>]
                        See also Documentation/networking/decnet.txt.
 
-       delayacct       [KNL] Enable per-task delay accounting
-
        dhash_entries=  [KNL]
                        Set number of hash buckets for dentry cache.
 
@@ -1031,6 +1029,8 @@ running once the system is up.
 
        nocache         [ARM]
 
+       nodelayacct     [KNL] Disable per-task delay accounting
+
        nodisconnect    [HW,SCSI,M68K] Disables SCSI disconnects.
 
        noexec          [IA-64]
index 6887d44d266188c9d5d17fc267b2441cc82d8e39..6da24e7a56cba01c9b7af0a0e1c894667a614d75 100644 (file)
@@ -238,6 +238,13 @@ Debugging
   pagefaulttrace Dump all page faults. Only useful for extreme debugging
                and will create a lot of output.
 
+  call_trace=[old|both|newfallback|new]
+               old: use old inexact backtracer
+               new: use new exact dwarf2 unwinder
+               both: print entries from both
+               newfallback: use new unwinder but fall back to old if it gets
+                       stuck (default)
+
 Misc
 
   noreplacement  Don't replace instructions with more appropriate ones
index b2afc7ae965bde912209daaceaff89ed6f1c7bb2..32aa30d1504a48936e7721f72402e37fcab1456a 100644 (file)
@@ -968,6 +968,10 @@ P: Andrey V. Savochkin
 M:     saw@saw.sw.com.sg
 S:     Maintained
 
+EFS FILESYSTEM
+W:     http://aeschi.ch.eu.org/efs/
+S:     Orphan
+
 EMU10K1 SOUND DRIVER
 P:     James Courtier-Dutton
 M:     James@superbug.demon.co.uk
@@ -1598,7 +1602,7 @@ W:        http://jfs.sourceforge.net/
 T:     git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
 S:     Supported
 
-JOURNALLING LAYER FOR BLOCK DEVICS (JBD)
+JOURNALLING LAYER FOR BLOCK DEVICES (JBD)
 P:     Stephen Tweedie, Andrew Morton
 M:     sct@redhat.com, akpm@osdl.org
 L:     ext2-devel@lists.sourceforge.net
@@ -1642,9 +1646,8 @@ S:        Maintained
 
 KERNEL JANITORS
 P:     Several
-L:     kernel-janitors@osdl.org
+L:     kernel-janitors@lists.osdl.org
 W:     http://www.kerneljanitors.org/
-W:     http://sf.net/projects/kernel-janitor/
 S:     Maintained
 
 KERNEL NFSD
@@ -1882,6 +1885,12 @@ S:     linux-scsi@vger.kernel.org
 W:     http://megaraid.lsilogic.com
 S:     Maintained
 
+MEMORY MANAGEMENT
+L:     linux-mm@kvack.org
+L:     linux-kernel@vger.kernel.org
+W:     http://www.linux-mm.org
+S:     Maintained
+
 MEMORY TECHNOLOGY DEVICES (MTD)
 P:     David Woodhouse
 M:     dwmw2@infradead.org
index 1dd58d35d72c53dc8e33623f1793bb7f58ed5401..c9b7dbb64c7199196e57f81485231720af071936 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 18
-EXTRAVERSION = -rc2
+EXTRAVERSION = -rc3
 NAME=Crazed Snow-Weasel
 
 # *DOCUMENTATION*
index bf52ba691957625305fec2b274d37110e98c265b..fed6b3d1b80364675b65c3b8220a834801868828 100644 (file)
@@ -274,16 +274,14 @@ ev7_process_pal_subpacket(struct el_subpacket *header)
 struct el_subpacket_handler ev7_pal_subpacket_handler =
        SUBPACKET_HANDLER_INIT(EL_CLASS__PAL, ev7_process_pal_subpacket);
 
-void 
+void
 ev7_register_error_handlers(void)
 {
        int i;
 
-       for(i = 0;
-           i<sizeof(el_ev7_pal_annotations)/sizeof(el_ev7_pal_annotations[1]);
-           i++) {
+       for (i = 0; i < ARRAY_SIZE(el_ev7_pal_annotations); i++)
                cdl_register_subpacket_annotation(&el_ev7_pal_annotations[i]);
-       }       
+
        cdl_register_subpacket_handler(&ev7_pal_subpacket_handler);
 }
 
index e15dcf4f3dcd91937bac42d364b39f742d54fce0..73c7622b529755d2d42def44da80ee335c631df7 100644 (file)
@@ -623,12 +623,12 @@ osf_sysinfo(int command, char __user *buf, long count)
        long len, err = -EINVAL;
 
        offset = command-1;
-       if (offset >= sizeof(sysinfo_table)/sizeof(char *)) {
+       if (offset >= ARRAY_SIZE(sysinfo_table)) {
                /* Digital UNIX has a few unpublished interfaces here */
                printk("sysinfo(%d)", command);
                goto out;
        }
-       
+
        down_read(&uts_sem);
        res = sysinfo_table[offset];
        len = strlen(res)+1;
index 2cb9c4380113e92e1eaa181558b105fe38a1f4eb..fd4a8fa0c93d70ac5092778fecbf32f9b16d8e6e 100644 (file)
@@ -114,8 +114,6 @@ struct alpha_machine_vector alpha_mv;
 int alpha_using_srm;
 #endif
 
-#define N(a) (sizeof(a)/sizeof(a[0]))
-
 static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long,
                                               unsigned long);
 static struct alpha_machine_vector *get_sysvec_byname(const char *);
@@ -240,7 +238,7 @@ reserve_std_resources(void)
        standard_io_resources[0].start = RTC_PORT(0);
        standard_io_resources[0].end = RTC_PORT(0) + 0x10;
 
-       for (i = 0; i < N(standard_io_resources); ++i)
+       for (i = 0; i < ARRAY_SIZE(standard_io_resources); ++i)
                request_resource(io, standard_io_resources+i);
 }
 
@@ -918,13 +916,13 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
 
        /* Search the system tables first... */
        vec = NULL;
-       if (type < N(systype_vecs)) {
+       if (type < ARRAY_SIZE(systype_vecs)) {
                vec = systype_vecs[type];
        } else if ((type > ST_API_BIAS) &&
-                  (type - ST_API_BIAS) < N(api_vecs)) {
+                  (type - ST_API_BIAS) < ARRAY_SIZE(api_vecs)) {
                vec = api_vecs[type - ST_API_BIAS];
        } else if ((type > ST_UNOFFICIAL_BIAS) &&
-                  (type - ST_UNOFFICIAL_BIAS) < N(unofficial_vecs)) {
+                  (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_vecs)) {
                vec = unofficial_vecs[type - ST_UNOFFICIAL_BIAS];
        }
 
@@ -938,11 +936,11 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
 
                switch (type) {
                case ST_DEC_ALCOR:
-                       if (member < N(alcor_indices))
+                       if (member < ARRAY_SIZE(alcor_indices))
                                vec = alcor_vecs[alcor_indices[member]];
                        break;
                case ST_DEC_EB164:
-                       if (member < N(eb164_indices))
+                       if (member < ARRAY_SIZE(eb164_indices))
                                vec = eb164_vecs[eb164_indices[member]];
                        /* PC164 may show as EB164 variation with EV56 CPU,
                           but, since no true EB164 had anything but EV5... */
@@ -950,24 +948,24 @@ get_sysvec(unsigned long type, unsigned long variation, unsigned long cpu)
                                vec = &pc164_mv;
                        break;
                case ST_DEC_EB64P:
-                       if (member < N(eb64p_indices))
+                       if (member < ARRAY_SIZE(eb64p_indices))
                                vec = eb64p_vecs[eb64p_indices[member]];
                        break;
                case ST_DEC_EB66:
-                       if (member < N(eb66_indices))
+                       if (member < ARRAY_SIZE(eb66_indices))
                                vec = eb66_vecs[eb66_indices[member]];
                        break;
                case ST_DEC_MARVEL:
-                       if (member < N(marvel_indices))
+                       if (member < ARRAY_SIZE(marvel_indices))
                                vec = marvel_vecs[marvel_indices[member]];
                        break;
                case ST_DEC_TITAN:
                        vec = titan_vecs[0];    /* default */
-                       if (member < N(titan_indices))
+                       if (member < ARRAY_SIZE(titan_indices))
                                vec = titan_vecs[titan_indices[member]];
                        break;
                case ST_DEC_TSUNAMI:
-                       if (member < N(tsunami_indices))
+                       if (member < ARRAY_SIZE(tsunami_indices))
                                vec = tsunami_vecs[tsunami_indices[member]];
                        break;
                case ST_DEC_1000:
@@ -1039,7 +1037,7 @@ get_sysvec_byname(const char *name)
 
        size_t i;
 
-       for (i = 0; i < N(all_vecs); ++i) {
+       for (i = 0; i < ARRAY_SIZE(all_vecs); ++i) {
                struct alpha_machine_vector *mv = all_vecs[i];
                if (strcasecmp(mv->vector_name, name) == 0)
                        return mv;
@@ -1055,13 +1053,13 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
 
        /* If not in the tables, make it UNKNOWN,
           else set type name to family */
-       if (type < N(systype_names)) {
+       if (type < ARRAY_SIZE(systype_names)) {
                *type_name = systype_names[type];
        } else if ((type > ST_API_BIAS) &&
-                  (type - ST_API_BIAS) < N(api_names)) {
+                  (type - ST_API_BIAS) < ARRAY_SIZE(api_names)) {
                *type_name = api_names[type - ST_API_BIAS];
        } else if ((type > ST_UNOFFICIAL_BIAS) &&
-                  (type - ST_UNOFFICIAL_BIAS) < N(unofficial_names)) {
+                  (type - ST_UNOFFICIAL_BIAS) < ARRAY_SIZE(unofficial_names)) {
                *type_name = unofficial_names[type - ST_UNOFFICIAL_BIAS];
        } else {
                *type_name = sys_unknown;
@@ -1083,7 +1081,7 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
        default: /* default to variation "0" for now */
                break;
        case ST_DEC_EB164:
-               if (member < N(eb164_indices))
+               if (member < ARRAY_SIZE(eb164_indices))
                        *variation_name = eb164_names[eb164_indices[member]];
                /* PC164 may show as EB164 variation, but with EV56 CPU,
                   so, since no true EB164 had anything but EV5... */
@@ -1091,32 +1089,32 @@ get_sysnames(unsigned long type, unsigned long variation, unsigned long cpu,
                        *variation_name = eb164_names[1]; /* make it PC164 */
                break;
        case ST_DEC_ALCOR:
-               if (member < N(alcor_indices))
+               if (member < ARRAY_SIZE(alcor_indices))
                        *variation_name = alcor_names[alcor_indices[member]];
                break;
        case ST_DEC_EB64P:
-               if (member < N(eb64p_indices))
+               if (member < ARRAY_SIZE(eb64p_indices))
                        *variation_name = eb64p_names[eb64p_indices[member]];
                break;
        case ST_DEC_EB66:
-               if (member < N(eb66_indices))
+               if (member < ARRAY_SIZE(eb66_indices))
                        *variation_name = eb66_names[eb66_indices[member]];
                break;
        case ST_DEC_MARVEL:
-               if (member < N(marvel_indices))
+               if (member < ARRAY_SIZE(marvel_indices))
                        *variation_name = marvel_names[marvel_indices[member]];
                break;
        case ST_DEC_RAWHIDE:
-               if (member < N(rawhide_indices))
+               if (member < ARRAY_SIZE(rawhide_indices))
                        *variation_name = rawhide_names[rawhide_indices[member]];
                break;
        case ST_DEC_TITAN:
                *variation_name = titan_names[0];       /* default */
-               if (member < N(titan_indices))
+               if (member < ARRAY_SIZE(titan_indices))
                        *variation_name = titan_names[titan_indices[member]];
                break;
        case ST_DEC_TSUNAMI:
-               if (member < N(tsunami_indices))
+               if (member < ARRAY_SIZE(tsunami_indices))
                        *variation_name = tsunami_names[tsunami_indices[member]];
                break;
        }
@@ -1211,7 +1209,7 @@ show_cpuinfo(struct seq_file *f, void *slot)
 
        cpu_index = (unsigned) (cpu->type - 1);
        cpu_name = "Unknown";
-       if (cpu_index < N(cpu_names))
+       if (cpu_index < ARRAY_SIZE(cpu_names))
                cpu_name = cpu_names[cpu_index];
 
        get_sysnames(hwrpb->sys_type, hwrpb->sys_variation,
index 78c30decf3ff421844939caf51270dff81dda592..5b99cf3cd69cb3be72cf733d10f14885feb74f66 100644 (file)
@@ -182,16 +182,16 @@ static unsigned long __init
 ruffian_get_bank_size(unsigned long offset)
 {
        unsigned long bank_addr, bank, ret = 0;
-  
+
        /* Valid offsets are: 0x800, 0x840 and 0x880
           since Ruffian only uses three banks.  */
        bank_addr = (unsigned long)PYXIS_MCR + offset;
        bank = *(vulp)bank_addr;
-    
+
        /* Check BANK_ENABLE */
        if (bank & 0x01) {
                static unsigned long size[] __initdata = {
-                       0x40000000UL, /* 0x00,   1G */ 
+                       0x40000000UL, /* 0x00,   1G */
                        0x20000000UL, /* 0x02, 512M */
                        0x10000000UL, /* 0x04, 256M */
                        0x08000000UL, /* 0x06, 128M */
@@ -203,7 +203,7 @@ ruffian_get_bank_size(unsigned long offset)
                };
 
                bank = (bank & 0x1e) >> 1;
-               if (bank < sizeof(size)/sizeof(*size))
+               if (bank < ARRAY_SIZE(size))
                        ret = size[bank];
        }
 
index 50eccde2dcd8dc0ac9a00f495a454171be7faa4b..b191cc75973751d5bdfe6137596a051a1c821b13 100644 (file)
@@ -233,7 +233,7 @@ validate_cc_value(unsigned long cc)
        index = cpu->type & 0xffffffff;
 
        /* If index out of bounds, no way to validate.  */
-       if (index >= sizeof(cpu_hz)/sizeof(cpu_hz[0]))
+       if (index >= ARRAY_SIZE(cpu_hz))
                return cc;
 
        /* If index contains no data, no way to validate.  */
index c0de6fcd488a85d22566a7241669f67ef59f0ca0..2948b4589a8b4bc8bfea4ebb09d9c191c6a01e73 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18-rc1
-# Sun Jul  9 15:21:30 2006
+# Linux kernel version: 2.6.18-rc1-git9
+# Sat Jul 15 15:08:10 2006
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -30,6 +30,7 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
@@ -749,7 +750,7 @@ CONFIG_VIDEO_V4L2=y
 # USB support
 #
 CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI is not set
+CONFIG_USB_ARCH_HAS_OHCI=y
 # CONFIG_USB_ARCH_HAS_EHCI is not set
 CONFIG_USB=y
 CONFIG_USB_DEBUG=y
@@ -766,6 +767,9 @@ CONFIG_USB_DYNAMIC_MINORS=y
 # USB Host Controller Drivers
 #
 # CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # CONFIG_USB_SL811_HCD is not set
 
 #
@@ -855,6 +859,7 @@ CONFIG_USB_SERIAL_CONSOLE=y
 CONFIG_USB_SERIAL_PL2303=y
 # CONFIG_USB_SERIAL_HP4X is not set
 # CONFIG_USB_SERIAL_SAFE is not set
+# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
 # CONFIG_USB_SERIAL_TI is not set
 # CONFIG_USB_SERIAL_CYBERJACK is not set
 # CONFIG_USB_SERIAL_XIRCOM is not set
@@ -871,7 +876,7 @@ CONFIG_USB_SERIAL_PL2303=y
 # CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
-# CONFIG_USB_CY7C63 is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
 # CONFIG_USB_CYTHERM is not set
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
@@ -916,6 +921,7 @@ CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_DRV_X1205 is not set
 # CONFIG_RTC_DRV_DS1307 is not set
 # CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
 # CONFIG_RTC_DRV_DS1672 is not set
 # CONFIG_RTC_DRV_DS1742 is not set
 # CONFIG_RTC_DRV_PCF8563 is not set
@@ -1023,7 +1029,6 @@ CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
index 2242f5f7cb7ddf5f8dc02c3c78e02617e5ad3b5e..4fe386eea4b4963bf61c8c55e25a3d7ba9ab3102 100644 (file)
@@ -114,9 +114,9 @@ ENTRY(secondary_startup)
         * Use the page tables supplied from  __cpu_up.
         */
        adr     r4, __secondary_data
-       ldmia   r4, {r5, r6, r13}               @ address to jump to after
+       ldmia   r4, {r5, r7, r13}               @ address to jump to after
        sub     r4, r4, r5                      @ mmu has been enabled
-       ldr     r4, [r6, r4]                    @ get secondary_data.pgdir
+       ldr     r4, [r7, r4]                    @ get secondary_data.pgdir
        adr     lr, __enable_mmu                @ return address
        add     pc, r10, #12                    @ initialise processor
                                                @ (return control reg)
@@ -125,7 +125,7 @@ ENTRY(secondary_startup)
         * r6  = &secondary_data
         */
 ENTRY(__secondary_switched)
-       ldr     sp, [r6, #4]                    @ get secondary_data.stack
+       ldr     sp, [r7, #4]                    @ get secondary_data.stack
        mov     fp, #0
        b       secondary_start_kernel
 
index 35a052fc177aeaefbebd2ceb294805d472ac7d45..4e29dd03e58297725af0dd5203ac6c55d5317a14 100644 (file)
@@ -232,11 +232,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
        bust_spinlocks(0);
        spin_unlock_irq(&die_lock);
 
-       if (panic_on_oops) {
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
-               ssleep(5);
-               panic("Fatal exception");
-       }
+       if (panic_on_oops)
+               panic("Fatal exception: panic_on_oops");
 
        do_exit(SIGSEGV);
 }
index 5b64d5c5b967764f8ac52dc1f46e836291b610a8..ef6ccc8993e96c2082489075cd712372006c417e 100644 (file)
@@ -8,7 +8,7 @@
 #include <linux/ioport.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/tty.h>
+#include <linux/screen_info.h>
 
 #include <asm/hardware/dec21285.h>
 #include <asm/io.h>
index 4a92d6f92d6b8be1e57d7a3e50eb4752c82375c6..60641d452db33275c57d4b33adcc1caebf23cad3 100644 (file)
@@ -60,11 +60,12 @@ static struct map_desc anubis_iodesc[] __initdata = {
        .virtual        = (u32)S3C24XX_VA_ISA_BYTE,
        .pfn            = __phys_to_pfn(0x0),
        .length         = SZ_4M,
-       .type           = MT_DEVICE
+       .type           = MT_DEVICE,
   }, {
        .virtual        = (u32)S3C24XX_VA_ISA_WORD,
        .pfn            = __phys_to_pfn(0x0),
-       .length         = SZ_4M, MT_DEVICE
+       .length         = SZ_4M,
+       .type           = MT_DEVICE,
   },
 
   /* we could possibly compress the next set down into a set of smaller tables
@@ -78,36 +79,12 @@ static struct map_desc anubis_iodesc[] __initdata = {
        .virtual        = (u32)ANUBIS_VA_CTRL1,
        .pfn            = __phys_to_pfn(ANUBIS_PA_CTRL1),
        .length         = SZ_4K,
-       .type           = MT_DEVICE
+       .type           = MT_DEVICE,
   }, {
        .virtual        = (u32)ANUBIS_VA_CTRL2,
        .pfn            = __phys_to_pfn(ANUBIS_PA_CTRL2),
        .length         = SZ_4K,
-       .type           =MT_DEVICE
-  },
-
-  /* IDE drives */
-
-  {
-       .virtual        = (u32)ANUBIS_IDEPRI,
-       .pfn            = __phys_to_pfn(S3C2410_CS3),
-       .length         = SZ_1M,
-       .type           = MT_DEVICE
-  }, {
-       .virtual        = (u32)ANUBIS_IDEPRIAUX,
-       .pfn            = __phys_to_pfn(S3C2410_CS3+(1<<26)),
-       .length         = SZ_1M,
-       .type           = MT_DEVICE
-  }, {
-       .virtual        = (u32)ANUBIS_IDESEC,
-       .pfn            = __phys_to_pfn(S3C2410_CS4),
-       .length         = SZ_1M,
-       .type           = MT_DEVICE
-  }, {
-       .virtual        = (u32)ANUBIS_IDESECAUX,
-       .pfn            = __phys_to_pfn(S3C2410_CS4+(1<<26)),
-       .length         = SZ_1M,
-       .type           = MT_DEVICE
+       .type           = MT_DEVICE,
   },
 };
 
@@ -126,7 +103,7 @@ static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = {
                .name           = "pclk",
                .divisor        = 1,
                .min_baud       = 0,
-               .max_baud       = 0.
+               .max_baud       = 0,
        }
 };
 
@@ -139,7 +116,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = anubis_serial_clocks,
-               .clocks_size = ARRAY_SIZE(anubis_serial_clocks)
+               .clocks_size = ARRAY_SIZE(anubis_serial_clocks),
        },
        [1] = {
                .hwport      = 2,
@@ -148,7 +125,7 @@ static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = anubis_serial_clocks,
-               .clocks_size = ARRAY_SIZE(anubis_serial_clocks)
+               .clocks_size = ARRAY_SIZE(anubis_serial_clocks),
        },
 };
 
@@ -162,7 +139,7 @@ static struct mtd_partition anubis_default_nand_part[] = {
        [0] = {
                .name   = "Boot Agent",
                .size   = SZ_16K,
-               .offset = 0
+               .offset = 0,
        },
        [1] = {
                .name   = "/boot",
@@ -194,21 +171,21 @@ static struct s3c2410_nand_set anubis_nand_sets[] = {
                .nr_chips       = 1,
                .nr_map         = external_map,
                .nr_partitions  = ARRAY_SIZE(anubis_default_nand_part),
-               .partitions     = anubis_default_nand_part
+               .partitions     = anubis_default_nand_part,
        },
        [0] = {
                .name           = "chip0",
                .nr_chips       = 1,
                .nr_map         = chip0_map,
                .nr_partitions  = ARRAY_SIZE(anubis_default_nand_part),
-               .partitions     = anubis_default_nand_part
+               .partitions     = anubis_default_nand_part,
        },
        [2] = {
                .name           = "chip1",
                .nr_chips       = 1,
                .nr_map         = chip1_map,
                .nr_partitions  = ARRAY_SIZE(anubis_default_nand_part),
-               .partitions     = anubis_default_nand_part
+               .partitions     = anubis_default_nand_part,
        },
 };
 
@@ -313,7 +290,7 @@ static struct s3c24xx_board anubis_board __initdata = {
        .devices       = anubis_devices,
        .devices_count = ARRAY_SIZE(anubis_devices),
        .clocks        = anubis_clocks,
-       .clocks_count  = ARRAY_SIZE(anubis_clocks)
+       .clocks_count  = ARRAY_SIZE(anubis_clocks),
 };
 
 static void __init anubis_map_io(void)
index 858fd03c6bc524d978546e2e1779fa771ff492cd..e193ba69e652e2e39c0dffed700363cbecb42c54 100644 (file)
@@ -67,12 +67,12 @@ static struct map_desc osiris_iodesc[] __initdata = {
          .virtual      = (u32)OSIRIS_VA_CTRL1,
          .pfn          = __phys_to_pfn(OSIRIS_PA_CTRL1),
          .length       = SZ_16K,
-         .type         = MT_DEVICE
+         .type         = MT_DEVICE,
   }, {
          .virtual      = (u32)OSIRIS_VA_CTRL2,
          .pfn          = __phys_to_pfn(OSIRIS_PA_CTRL2),
          .length       = SZ_16K,
-         .type         = MT_DEVICE
+         .type         = MT_DEVICE,
   },
 };
 
@@ -91,7 +91,7 @@ static struct s3c24xx_uart_clksrc osiris_serial_clocks[] = {
                .name           = "pclk",
                .divisor        = 1,
                .min_baud       = 0,
-               .max_baud       = 0.
+               .max_baud       = 0,
        }
 };
 
@@ -103,7 +103,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = osiris_serial_clocks,
-               .clocks_size = ARRAY_SIZE(osiris_serial_clocks)
+               .clocks_size = ARRAY_SIZE(osiris_serial_clocks),
        },
        [1] = {
                .hwport      = 1,
@@ -112,7 +112,7 @@ static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = {
                .ulcon       = ULCON,
                .ufcon       = UFCON,
                .clocks      = osiris_serial_clocks,
-               .clocks_size = ARRAY_SIZE(osiris_serial_clocks)
+               .clocks_size = ARRAY_SIZE(osiris_serial_clocks),
        },
 };
 
@@ -126,7 +126,7 @@ static struct mtd_partition osiris_default_nand_part[] = {
        [0] = {
                .name   = "Boot Agent",
                .size   = SZ_16K,
-               .offset = 0
+               .offset = 0,
        },
        [1] = {
                .name   = "/boot",
@@ -158,21 +158,21 @@ static struct s3c2410_nand_set osiris_nand_sets[] = {
                .nr_chips       = 1,
                .nr_map         = external_map,
                .nr_partitions  = ARRAY_SIZE(osiris_default_nand_part),
-               .partitions     = osiris_default_nand_part
+               .partitions     = osiris_default_nand_part,
        },
        [0] = {
                .name           = "chip0",
                .nr_chips       = 1,
                .nr_map         = chip0_map,
                .nr_partitions  = ARRAY_SIZE(osiris_default_nand_part),
-               .partitions     = osiris_default_nand_part
+               .partitions     = osiris_default_nand_part,
        },
        [2] = {
                .name           = "chip1",
                .nr_chips       = 1,
                .nr_map         = chip1_map,
                .nr_partitions  = ARRAY_SIZE(osiris_default_nand_part),
-               .partitions     = osiris_default_nand_part
+               .partitions     = osiris_default_nand_part,
        },
 };
 
@@ -245,7 +245,7 @@ static struct s3c24xx_board osiris_board __initdata = {
        .devices       = osiris_devices,
        .devices_count = ARRAY_SIZE(osiris_devices),
        .clocks        = osiris_clocks,
-       .clocks_count  = ARRAY_SIZE(osiris_clocks)
+       .clocks_count  = ARRAY_SIZE(osiris_clocks),
 };
 
 static void __init osiris_map_io(void)
index dba7dddfe57d365a53959c74b84a7e136781c775..88a999df0ab3f59ddaf8fe6da4f942fca750895d 100644 (file)
@@ -363,7 +363,9 @@ EXPORT_SYMBOL(__ioremap);
 
 void __iounmap(void __iomem *addr)
 {
+#ifndef CONFIG_SMP
        struct vm_struct **p, *tmp;
+#endif
        unsigned int section_mapping = 0;
 
        addr = (void __iomem *)(PAGE_MASK & (unsigned long)addr);
index 6c5f0fe578a5e220e8245809c40df9601faecc41..ab143557e6889ae7c5ff23e2e335716d6e134ef5 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/cacheflush.h>
 #include <asm/proc-fns.h>
 #include <asm/tlbflush.h>
+#include <asm/page.h>
 
 #ifndef MULTI_CPU
 EXPORT_SYMBOL(cpu_dcache_clean_area);
@@ -30,6 +31,13 @@ EXPORT_SYMBOL(__cpuc_coherent_kern_range);
 EXPORT_SYMBOL(cpu_cache);
 #endif
 
+#ifndef MULTI_USER
+EXPORT_SYMBOL(__cpu_clear_user_page);
+EXPORT_SYMBOL(__cpu_copy_user_page);
+#else
+EXPORT_SYMBOL(cpu_user);
+#endif
+
 /*
  * No module should need to touch the TLB (and currently
  * no modules do.  We export this for "loadkernel" support
index 521538671f4ce6efcaac8b645d9431c21f127467..561bff73a036ae15964e02d5356c634ce1b93324 100644 (file)
@@ -536,6 +536,11 @@ cpu_80200_name:
        .asciz  "XScale-80200"
        .size   cpu_80200_name, . - cpu_80200_name
 
+       .type   cpu_80219_name, #object
+cpu_80219_name:
+       .asciz  "XScale-80219"
+       .size   cpu_80219_name, . - cpu_80219_name
+
        .type   cpu_8032x_name, #object
 cpu_8032x_name:
        .asciz  "XScale-IOP8032x Family"
@@ -613,10 +618,33 @@ __80200_proc_info:
        .long   xscale_cache_fns
        .size   __80200_proc_info, . - __80200_proc_info
 
+       .type   __80219_proc_info,#object
+__80219_proc_info:
+       .long   0x69052e20
+       .long   0xffffffe0
+       .long   PMD_TYPE_SECT | \
+               PMD_SECT_BUFFERABLE | \
+               PMD_SECT_CACHEABLE | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
+       .long   PMD_TYPE_SECT | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
+       b       __xscale_setup
+       .long   cpu_arch_name
+       .long   cpu_elf_name
+       .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
+       .long   cpu_80219_name
+       .long   xscale_processor_functions
+       .long   v4wbi_tlb_fns
+       .long   xscale_mc_user_fns
+       .long   xscale_cache_fns
+       .size   __80219_proc_info, . - __80219_proc_info
+
        .type   __8032x_proc_info,#object
 __8032x_proc_info:
        .long   0x69052420
-       .long   0xfffff5e0      @ mask should accomodate IOP80219 also
+       .long   0xffffffe0
        .long   PMD_TYPE_SECT | \
                PMD_SECT_BUFFERABLE | \
                PMD_SECT_CACHEABLE | \
index daa75ce4b7773d374b2015edb6cc533cb1c8afa8..f71fb4a029cbf031111e7dbddc9753b5af231978 100644 (file)
@@ -672,7 +672,7 @@ config MTRR
          See <file:Documentation/mtrr.txt> for more information.
 
 config EFI
-       bool "Boot from EFI support (EXPERIMENTAL)"
+       bool "Boot from EFI support"
        depends on ACPI
        default n
        ---help---
index 1b452a1665c4ffe92a05f3a5fa80704b4e1738ec..ab98fc21a54105b7d41fed6a5c6861ed44735dad 100644 (file)
@@ -59,7 +59,8 @@ quiet_cmd_syscall = SYSCALL $@
 
 export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH)
 
-vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1
+vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \
+                $(call ld-option, -Wl$(comma)--hash-style=sysv)
 SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags)
 SYSCFLAGS_vsyscall-int80.so    = $(vsyscall-flags)
 
index e9f0b928b0a9925e534ddeadb3c868493240df58..5c43be47587f5d4b9875e4c45070027cdb829d95 100644 (file)
@@ -759,7 +759,7 @@ static int __cpuinit cache_sysfs_init(void)
        if (num_cache_leaves == 0)
                return 0;
 
-       register_cpu_notifier(&cacheinfo_cpu_notifier);
+       register_hotcpu_notifier(&cacheinfo_cpu_notifier);
 
        for_each_online_cpu(i) {
                cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE,
index dc2416dfef151271ba8d15d206564a0d8cf56fec..84fd4cf7d0fb11e4396c981f0319af9d85b4dc5f 100644 (file)
@@ -9,6 +9,6 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c);
 /* Call the installed machine check handler for this CPU setup. */
 extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code);
 
-extern int mce_disabled __initdata;
+extern int mce_disabled;
 extern int nr_mce_banks;
 
index d9a260f2efb4d24086bf7ee4c1e8e1ab7eaf8c5e..37a7d2eaf4a006608a8321647b96e7323c05e998 100644 (file)
@@ -204,7 +204,7 @@ VM_MASK             = 0x00020000
 ENTRY(ret_from_fork)
        CFI_STARTPROC
        pushl %eax
-       CFI_ADJUST_CFA_OFFSET -4
+       CFI_ADJUST_CFA_OFFSET 4
        call schedule_tail
        GET_THREAD_INFO(%ebp)
        popl %eax
index de2e16e561c06796d62efe9191b0c388e4d93a83..afe6505ca0b3a78af53db084d60574540ea7361d 100644 (file)
@@ -256,11 +256,6 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
        int ret = 0;
        kprobe_opcode_t *addr;
        struct kprobe_ctlblk *kcb;
-#ifdef CONFIG_PREEMPT
-       unsigned pre_preempt_count = preempt_count();
-#else
-       unsigned pre_preempt_count = 1;
-#endif
 
        addr = (kprobe_opcode_t *)(regs->eip - sizeof(kprobe_opcode_t));
 
@@ -338,13 +333,15 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
                return 1;
 
 ss_probe:
-       if (pre_preempt_count && p->ainsn.boostable == 1 && !p->post_handler){
+#ifndef CONFIG_PREEMPT
+       if (p->ainsn.boostable == 1 && !p->post_handler){
                /* Boost up -- we can execute copied instructions directly */
                reset_current_kprobe();
                regs->eip = (unsigned long)p->ainsn.insn;
                preempt_enable_no_resched();
                return 1;
        }
+#endif
        prepare_singlestep(p, regs);
        kcb->kprobe_status = KPROBE_HIT_SS;
        return 1;
index 511abe52a94e861a2ad2051dd72e072a131db30c..6b1ae6ba76f0d15421f9aee87747a9192da1f4db 100644 (file)
@@ -189,14 +189,11 @@ NORET_TYPE void machine_kexec(struct kimage *image)
        memcpy((void *)reboot_code_buffer, relocate_new_kernel,
                                                relocate_new_kernel_size);
 
-       /* The segment registers are funny things, they are
-        * automatically loaded from a table, in memory wherever you
-        * set them to a specific selector, but this table is never
-        * accessed again you set the segment to a different selector.
-        *
-        * The more common model is are caches where the behide
-        * the scenes work is done, but is also dropped at arbitrary
-        * times.
+       /* The segment registers are funny things, they have both a
+        * visible and an invisible part.  Whenever the visible part is
+        * set to a specific selector, the invisible part is loaded
+        * with from a table in memory.  At no other time is the
+        * descriptor table in memory accessed.
         *
         * I take advantage of this here by force loading the
         * segments, before I zap the gdt with an invalid value.
index 2dd928a84645c53f34c69391c1966cb5ff8e9614..acb351478e42b9f5e4693de4ca6d5786d2ed8f37 100644 (file)
@@ -575,6 +575,7 @@ void touch_nmi_watchdog (void)
         */
        touch_softlockup_watchdog();
 }
+EXPORT_SYMBOL(touch_nmi_watchdog);
 
 extern void die_nmi(struct pt_regs *, const char *msg);
 
index 923bb292f47fbc91ac978777ab69eafc28a2535c..8657c739656a37bbcef81cb36accb486902cf5d1 100644 (file)
@@ -690,8 +690,8 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
        /*
         * Now maybe handle debug registers and/or IO bitmaps
         */
-       if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
-           || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP))
+       if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW)
+           || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)))
                __switch_to_xtra(next_p, tss);
 
        disable_tsc(prev_p, next_p);
index 6f5fea05f1d7fc92a80e66819962cf4ee269086f..f948419c888a85905aa768f1aaeaf0c5378ca910 100644 (file)
@@ -212,14 +212,20 @@ valid_k7:
  * then we print a warning if not, and always resync.
  */
 
-static atomic_t tsc_start_flag = ATOMIC_INIT(0);
-static atomic_t tsc_count_start = ATOMIC_INIT(0);
-static atomic_t tsc_count_stop = ATOMIC_INIT(0);
-static unsigned long long tsc_values[NR_CPUS];
+static struct {
+       atomic_t start_flag;
+       atomic_t count_start;
+       atomic_t count_stop;
+       unsigned long long values[NR_CPUS];
+} tsc __initdata = {
+       .start_flag = ATOMIC_INIT(0),
+       .count_start = ATOMIC_INIT(0),
+       .count_stop = ATOMIC_INIT(0),
+};
 
 #define NR_LOOPS 5
 
-static void __init synchronize_tsc_bp (void)
+static void __init synchronize_tsc_bp(void)
 {
        int i;
        unsigned long long t0;
@@ -233,7 +239,7 @@ static void __init synchronize_tsc_bp (void)
        /* convert from kcyc/sec to cyc/usec */
        one_usec = cpu_khz / 1000;
 
-       atomic_set(&tsc_start_flag, 1);
+       atomic_set(&tsc.start_flag, 1);
        wmb();
 
        /*
@@ -250,16 +256,16 @@ static void __init synchronize_tsc_bp (void)
                /*
                 * all APs synchronize but they loop on '== num_cpus'
                 */
-               while (atomic_read(&tsc_count_start) != num_booting_cpus()-1)
+               while (atomic_read(&tsc.count_start) != num_booting_cpus()-1)
                        cpu_relax();
-               atomic_set(&tsc_count_stop, 0);
+               atomic_set(&tsc.count_stop, 0);
                wmb();
                /*
                 * this lets the APs save their current TSC:
                 */
-               atomic_inc(&tsc_count_start);
+               atomic_inc(&tsc.count_start);
 
-               rdtscll(tsc_values[smp_processor_id()]);
+               rdtscll(tsc.values[smp_processor_id()]);
                /*
                 * We clear the TSC in the last loop:
                 */
@@ -269,56 +275,54 @@ static void __init synchronize_tsc_bp (void)
                /*
                 * Wait for all APs to leave the synchronization point:
                 */
-               while (atomic_read(&tsc_count_stop) != num_booting_cpus()-1)
+               while (atomic_read(&tsc.count_stop) != num_booting_cpus()-1)
                        cpu_relax();
-               atomic_set(&tsc_count_start, 0);
+               atomic_set(&tsc.count_start, 0);
                wmb();
-               atomic_inc(&tsc_count_stop);
+               atomic_inc(&tsc.count_stop);
        }
 
        sum = 0;
        for (i = 0; i < NR_CPUS; i++) {
                if (cpu_isset(i, cpu_callout_map)) {
-                       t0 = tsc_values[i];
+                       t0 = tsc.values[i];
                        sum += t0;
                }
        }
        avg = sum;
        do_div(avg, num_booting_cpus());
 
-       sum = 0;
        for (i = 0; i < NR_CPUS; i++) {
                if (!cpu_isset(i, cpu_callout_map))
                        continue;
-               delta = tsc_values[i] - avg;
+               delta = tsc.values[i] - avg;
                if (delta < 0)
                        delta = -delta;
                /*
                 * We report bigger than 2 microseconds clock differences.
                 */
                if (delta > 2*one_usec) {
-                       long realdelta;
+                       long long realdelta;
+
                        if (!buggy) {
                                buggy = 1;
                                printk("\n");
                        }
                        realdelta = delta;
                        do_div(realdelta, one_usec);
-                       if (tsc_values[i] < avg)
+                       if (tsc.values[i] < avg)
                                realdelta = -realdelta;
 
-                       if (realdelta > 0)
-                               printk(KERN_INFO "CPU#%d had %ld usecs TSC "
+                       if (realdelta)
+                               printk(KERN_INFO "CPU#%d had %Ld usecs TSC "
                                        "skew, fixed it up.\n", i, realdelta);
                }
-
-               sum += delta;
        }
        if (!buggy)
                printk("passed.\n");
 }
 
-static void __init synchronize_tsc_ap (void)
+static void __init synchronize_tsc_ap(void)
 {
        int i;
 
@@ -327,20 +331,20 @@ static void __init synchronize_tsc_ap (void)
         * this gets called, so we first wait for the BP to
         * finish SMP initialization:
         */
-       while (!atomic_read(&tsc_start_flag))
+       while (!atomic_read(&tsc.start_flag))
                cpu_relax();
 
        for (i = 0; i < NR_LOOPS; i++) {
-               atomic_inc(&tsc_count_start);
-               while (atomic_read(&tsc_count_start) != num_booting_cpus())
+               atomic_inc(&tsc.count_start);
+               while (atomic_read(&tsc.count_start) != num_booting_cpus())
                        cpu_relax();
 
-               rdtscll(tsc_values[smp_processor_id()]);
+               rdtscll(tsc.values[smp_processor_id()]);
                if (i == NR_LOOPS-1)
                        write_tsc(0, 0);
 
-               atomic_inc(&tsc_count_stop);
-               while (atomic_read(&tsc_count_stop) != num_booting_cpus())
+               atomic_inc(&tsc.count_stop);
+               while (atomic_read(&tsc.count_stop) != num_booting_cpus())
                        cpu_relax();
        }
 }
index 8705c0f0578881afafb5af2e80337f347bfad5ec..edd00f6cee377715fdc6e73e411d0e2c8fed2026 100644 (file)
@@ -135,7 +135,7 @@ unsigned long profile_pc(struct pt_regs *regs)
 {
        unsigned long pc = instruction_pointer(regs);
 
-       if (in_lock_functions(pc))
+       if (!user_mode_vm(regs) && in_lock_functions(pc))
                return *(unsigned long *)(regs->ebp + 4);
 
        return pc;
index 313ac1f7dc5aaf88795748554118a8d9e393f83f..0d4005dc06c545b2c488e01ea523a1c80a2892bb 100644 (file)
@@ -187,10 +187,21 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
                        if (unwind_init_blocked(&info, task) == 0)
                                unw_ret = show_trace_unwind(&info, log_lvl);
                }
-               if (unw_ret > 0) {
-                       if (call_trace > 0)
+               if (unw_ret > 0 && !arch_unw_user_mode(&info)) {
+#ifdef CONFIG_STACK_UNWIND
+                       print_symbol("DWARF2 unwinder stuck at %s\n",
+                                    UNW_PC(&info));
+                       if (call_trace == 1) {
+                               printk("Leftover inexact backtrace:\n");
+                               if (UNW_SP(&info))
+                                       stack = (void *)UNW_SP(&info);
+                       } else if (call_trace > 1)
                                return;
-                       printk("%sLegacy call trace:\n", log_lvl);
+                       else
+                               printk("Full inexact backtrace again:\n");
+#else
+                       printk("Inexact backtrace:\n");
+#endif
                }
        }
 
@@ -442,11 +453,9 @@ void die(const char * str, struct pt_regs * regs, long err)
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
-       if (panic_on_oops) {
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
-               ssleep(5);
-               panic("Fatal exception");
-       }
+       if (panic_on_oops)
+               panic("Fatal exception: panic_on_oops");
+
        oops_exit();
        do_exit(SIGSEGV);
 }
@@ -1238,8 +1247,10 @@ static int __init call_trace_setup(char *s)
                call_trace = -1;
        else if (strcmp(s, "both") == 0)
                call_trace = 0;
-       else if (strcmp(s, "new") == 0)
+       else if (strcmp(s, "newfallback") == 0)
                call_trace = 1;
+       else if (strcmp(s, "new") == 2)
+               call_trace = 2;
        return 1;
 }
 __setup("call_trace=", call_trace_setup);
index e26975fc68b650105cbff7b0568ba7b856770085..f66cd11adb7211e211f6d78f2ad063e0701ce832 100644 (file)
@@ -10,6 +10,7 @@ SECTIONS
   . = VDSO_PRELINK + SIZEOF_HEADERS;
 
   .hash           : { *(.hash) }               :text
+  .gnu.hash       : { *(.gnu.hash) }
   .dynsym         : { *(.dynsym) }
   .dynstr         : { *(.dynstr) }
   .gnu.version    : { *(.gnu.version) }
index 9ea35398e10d0b9a28d43152d274a3b40dd05258..0f14a82b856e500b72aa4277ddea084ae242a8f7 100644 (file)
@@ -363,7 +363,7 @@ CONFIG_BLK_DEV_IDECD=y
 #
 CONFIG_IDE_GENERIC=y
 CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
+CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 # CONFIG_BLK_DEV_GENERIC is not set
 # CONFIG_BLK_DEV_OPTI621 is not set
index 6cba55da572a0bb28c6399142765df87aeeb4b96..9001b3fbaa3244c53a535fc62e23adef893a7166 100644 (file)
@@ -366,7 +366,7 @@ CONFIG_BLK_DEV_IDESCSI=m
 # CONFIG_IDE_GENERIC is not set
 # CONFIG_BLK_DEV_IDEPNP is not set
 CONFIG_BLK_DEV_IDEPCI=y
-# CONFIG_IDEPCI_SHARE_IRQ is not set
+CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 CONFIG_BLK_DEV_GENERIC=y
 # CONFIG_BLK_DEV_OPTI621 is not set
index 0e4553f320bffd4a812401f0cae3836f63d88c7d..ad8215a3c586948f3cf92c2e6c80f31a5ff36aa5 100644 (file)
@@ -45,7 +45,8 @@ CPPFLAGS_gate.lds := -P -C -U$(ARCH)
 quiet_cmd_gate = GATE $@
       cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@
 
-GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1
+GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 \
+                    $(call ld-option, -Wl$(comma)--hash-style=sysv)
 $(obj)/gate.so: $(obj)/gate.lds $(obj)/gate.o FORCE
        $(call if_changed,gate)
 
index cc35cddfd4cfdd8e047ed30b06ef6e87f7f5c7e2..6d198339bf85446d2f47d1bf7a2b5e9731dffbbb 100644 (file)
@@ -12,6 +12,7 @@ SECTIONS
   . = GATE_ADDR + SIZEOF_HEADERS;
 
   .hash                                : { *(.hash) }                          :readable
+  .gnu.hash                    : { *(.gnu.hash) }
   .dynsym                      : { *(.dynsym) }
   .dynstr                      : { *(.dynstr) }
   .gnu.version                 : { *(.gnu.version) }
index 00d9c83b80205dd43669b6e5d87f4a882cf3bbce..781960f80b6f12c2d7c8be375157086c3b16a72d 100644 (file)
@@ -448,11 +448,20 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
        return 0;
 }
 
+void __kprobes flush_insn_slot(struct kprobe *p)
+{
+       unsigned long arm_addr;
+
+       arm_addr = ((unsigned long)&p->opcode.bundle) & ~0xFULL;
+       flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
+}
+
 void __kprobes arch_arm_kprobe(struct kprobe *p)
 {
        unsigned long addr = (unsigned long)p->addr;
        unsigned long arm_addr = addr & ~0xFULL;
 
+       flush_insn_slot(p);
        memcpy((char *)arm_addr, &p->ainsn.insn.bundle, sizeof(bundle_t));
        flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
 }
index 3f5bac59209a501fa7b9278f5ed4681567f417ee..ab5b52413e918db331c599b69cdc9ed8db19546b 100644 (file)
@@ -958,9 +958,9 @@ remove_palinfo_proc_entries(unsigned int hcpu)
        }
 }
 
-static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
-                                                               unsigned long action,
-                                                               void *hcpu)
+#ifdef CONFIG_HOTPLUG_CPU
+static int palinfo_cpu_callback(struct notifier_block *nfb,
+                                       unsigned long action, void *hcpu)
 {
        unsigned int hotcpu = (unsigned long)hcpu;
 
@@ -968,20 +968,19 @@ static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb,
        case CPU_ONLINE:
                create_palinfo_proc_entries(hotcpu);
                break;
-#ifdef CONFIG_HOTPLUG_CPU
        case CPU_DEAD:
                remove_palinfo_proc_entries(hotcpu);
                break;
-#endif
        }
        return NOTIFY_OK;
 }
 
-static struct notifier_block __cpuinitdata palinfo_cpu_notifier =
+static struct notifier_block palinfo_cpu_notifier =
 {
        .notifier_call = palinfo_cpu_callback,
        .priority = 0,
 };
+#endif
 
 static int __init
 palinfo_init(void)
@@ -1020,7 +1019,7 @@ palinfo_exit(void)
        /*
         * Unregister from cpu notifier callbacks
         */
-       unregister_cpu_notifier(&palinfo_cpu_notifier);
+       unregister_hotcpu_notifier(&palinfo_cpu_notifier);
 }
 
 module_init(palinfo_init);
index b146f1cfad3141e240fac9297de3bfc67f75286a..d24fa393b18210603fbaadbfa2934e060c2702ba 100644 (file)
@@ -435,7 +435,7 @@ static int __cpuinit cache_sysfs_init(void)
                                (void *)(long)i);
        }
 
-       register_cpu_notifier(&cache_cpu_notifier);
+       register_hotcpu_notifier(&cache_cpu_notifier);
 
        return 0;
 }
index e7bbb0f40aa20eacb9b07431f360fbd456cc91e1..5a0420464c6ca747bcf8243646541b33e3b9a2b8 100644 (file)
@@ -117,11 +117,8 @@ die (const char *str, struct pt_regs *regs, long err)
        die.lock_owner = -1;
        spin_unlock_irq(&die.lock);
 
-       if (panic_on_oops) {
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
-               ssleep(5);
-               panic("Fatal exception");
-       }
+       if (panic_on_oops)
+               panic("Fatal exception: panic_on_oops");
 
        do_exit(SIGSEGV);
 }
index 9989495a51dd64e8c026c88c20fec99fc9dc2ae0..b3677fc8eef597fb9f4ebeb6fda0249e4a48f5f2 100644 (file)
@@ -204,6 +204,7 @@ SECTIONS
        *(.dynstr)
        *(.dynamic)
        *(.hash)
+       *(.gnu.hash)
 #endif
        }
 
index 0104350955501942833470f5a7c578d6125530cd..fec228cd0163d69d60c9b5a12e3938596d0b04f2 100644 (file)
@@ -278,7 +278,7 @@ static void unregister_cpu_online(unsigned int cpu)
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
-static int __devinit sysfs_cpu_notify(struct notifier_block *self,
+static int __cpuinit sysfs_cpu_notify(struct notifier_block *self,
                                      unsigned long action, void *hcpu)
 {
        unsigned int cpu = (unsigned int)(long)hcpu;
@@ -296,7 +296,7 @@ static int __devinit sysfs_cpu_notify(struct notifier_block *self,
        return NOTIFY_OK;
 }
 
-static struct notifier_block __devinitdata sysfs_cpu_nb = {
+static struct notifier_block __cpuinitdata sysfs_cpu_nb = {
        .notifier_call  = sysfs_cpu_notify,
 };
 
index 3c668078e524fefb03c628dd1fd986d8745f092d..2105767fcc57dff8b22c699aa2bdf0fbb63581cf 100644 (file)
@@ -150,13 +150,9 @@ int die(const char *str, struct pt_regs *regs, long err)
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
-       if (panic_on_oops) {
-#ifdef CONFIG_PPC64
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
-               ssleep(5);
-#endif
-               panic("Fatal exception");
-       }
+       if (panic_on_oops)
+               panic("Fatal exception: panic_on_oops");
+
        do_exit(err);
 
        return 0;
index 8a3bed5f143a14f4a226a26fbcae4a2ba07e9791..3726358faae88444f8603c7a8cc8f0b394095846 100644 (file)
@@ -14,7 +14,8 @@ obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
 
 
 EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
-EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1
+EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \
+               $(call ld-option, -Wl$(comma)--hash-style=sysv)
 EXTRA_AFLAGS := -D__VDSO32__ -s
 
 obj-y += vdso32_wrapper.o
index f4bad720cb0a1b7f450260671844261f0ebb634e..6187af2d54c393ea825e523172636ebbcd062427 100644 (file)
@@ -14,6 +14,7 @@ SECTIONS
 {
   . = VDSO32_LBASE + SIZEOF_HEADERS;
   .hash           : { *(.hash) }                       :text
+  .gnu.hash       : { *(.gnu.hash) }
   .dynsym         : { *(.dynsym) }
   .dynstr         : { *(.dynstr) }
   .gnu.version    : { *(.gnu.version) }
index ab39988452ccb8f5ec90fc19c03ecb5be117b0ab..43af9b2a6f3bd21dc8b3d4f86faa7928f041648b 100644 (file)
@@ -8,7 +8,8 @@ targets := $(obj-vdso64) vdso64.so
 obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
 
 EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
-EXTRA_CFLAGS +=  -nostdlib -Wl,-soname=linux-vdso64.so.1
+EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
+               $(call ld-option, -Wl$(comma)--hash-style=sysv)
 EXTRA_AFLAGS := -D__VDSO64__ -s
 
 obj-y += vdso64_wrapper.o
index 4bdf224464abaf2914a2d62bb285f5f3404fe85c..4a2b6dc0960c582b3b0f0f9c8ba73a171195ee0c 100644 (file)
@@ -12,6 +12,7 @@ SECTIONS
 {
   . = VDSO64_LBASE + SIZEOF_HEADERS;
   .hash           : { *(.hash) }               :text
+  .gnu.hash       : { *(.gnu.hash) }
   .dynsym         : { *(.dynsym) }
   .dynstr         : { *(.dynstr) }
   .gnu.version    : { *(.gnu.version) }
index 74eed6b74cd6dbf3a762328f9b5218b09e5f4a92..d6641549105523be39a647c2c1409833b6e3d176 100644 (file)
 #include <linux/kernel.h>
 #include <linux/fb.h>
 #include <linux/backlight.h>
+#include <linux/adb.h>
+#include <linux/pmu.h>
+#include <asm/atomic.h>
 #include <asm/prom.h>
 #include <asm/backlight.h>
 
 #define OLD_BACKLIGHT_MAX 15
 
 static void pmac_backlight_key_worker(void *data);
+static void pmac_backlight_set_legacy_worker(void *data);
+
 static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker, NULL);
+static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker, NULL);
 
-/* Although this variable is used in interrupt context, it makes no sense to
- * protect it. No user is able to produce enough key events per second and
+/* Although these variables are used in interrupt context, it makes no sense to
+ * protect them. No user is able to produce enough key events per second and
  * notice the errors that might happen.
  */
 static int pmac_backlight_key_queued;
+static int pmac_backlight_set_legacy_queued;
+
+/* The via-pmu code allows the backlight to be grabbed, in which case the
+ * in-kernel control of the brightness needs to be disabled. This should
+ * only be used by really old PowerBooks.
+ */
+static atomic_t kernel_backlight_disabled = ATOMIC_INIT(0);
 
 /* Protect the pmac_backlight variable */
 DEFINE_MUTEX(pmac_backlight_mutex);
@@ -82,6 +95,9 @@ int pmac_backlight_curve_lookup(struct fb_info *info, int value)
 
 static void pmac_backlight_key_worker(void *data)
 {
+       if (atomic_read(&kernel_backlight_disabled))
+               return;
+
        mutex_lock(&pmac_backlight_mutex);
        if (pmac_backlight) {
                struct backlight_properties *props;
@@ -107,8 +123,12 @@ static void pmac_backlight_key_worker(void *data)
        mutex_unlock(&pmac_backlight_mutex);
 }
 
+/* This function is called in interrupt context */
 void pmac_backlight_key(int direction)
 {
+       if (atomic_read(&kernel_backlight_disabled))
+               return;
+
        /* we can receive multiple interrupts here, but the scheduled work
         * will run only once, with the last value
         */
@@ -116,7 +136,7 @@ void pmac_backlight_key(int direction)
        schedule_work(&pmac_backlight_key_work);
 }
 
-int pmac_backlight_set_legacy_brightness(int brightness)
+static int __pmac_backlight_set_legacy_brightness(int brightness)
 {
        int error = -ENXIO;
 
@@ -145,6 +165,28 @@ int pmac_backlight_set_legacy_brightness(int brightness)
        return error;
 }
 
+static void pmac_backlight_set_legacy_worker(void *data)
+{
+       if (atomic_read(&kernel_backlight_disabled))
+               return;
+
+       __pmac_backlight_set_legacy_brightness(pmac_backlight_set_legacy_queued);
+}
+
+/* This function is called in interrupt context */
+void pmac_backlight_set_legacy_brightness_pmu(int brightness) {
+       if (atomic_read(&kernel_backlight_disabled))
+               return;
+
+       pmac_backlight_set_legacy_queued = brightness;
+       schedule_work(&pmac_backlight_set_legacy_work);
+}
+
+int pmac_backlight_set_legacy_brightness(int brightness)
+{
+       return __pmac_backlight_set_legacy_brightness(brightness);
+}
+
 int pmac_backlight_get_legacy_brightness()
 {
        int result = -ENXIO;
@@ -167,6 +209,16 @@ int pmac_backlight_get_legacy_brightness()
        return result;
 }
 
+void pmac_backlight_disable()
+{
+       atomic_inc(&kernel_backlight_disabled);
+}
+
+void pmac_backlight_enable()
+{
+       atomic_dec(&kernel_backlight_disabled);
+}
+
 EXPORT_SYMBOL_GPL(pmac_backlight);
 EXPORT_SYMBOL_GPL(pmac_backlight_mutex);
 EXPORT_SYMBOL_GPL(pmac_has_backlight_type);
index 09c6525cfa6133081b962fdc0257e6189dbe0d67..095fd3323323b077a3acbcdcdf00e91c7bacce02 100644 (file)
@@ -8,6 +8,7 @@ SECTIONS
   . = + SIZEOF_HEADERS;
   .interp : { *(.interp) }
   .hash          : { *(.hash)          }
+  .gnu.hash      : { *(.gnu.hash)      }
   .dynsym        : { *(.dynsym)                }
   .dynstr        : { *(.dynstr)                }
   .rel.text      : { *(.rel.text)              }
index d0f82c995af680a3c678d68c60094ae91b056348..6a4b5f9715c902260cb7a2ea9e9e2f9e6be047e4 100644 (file)
@@ -617,7 +617,8 @@ appldata_offline_cpu(int cpu)
        spin_unlock(&appldata_timer_lock);
 }
 
-static int __cpuinit
+#ifdef CONFIG_HOTPLUG_CPU
+static int
 appldata_cpu_notify(struct notifier_block *self,
                    unsigned long action, void *hcpu)
 {
@@ -625,20 +626,19 @@ appldata_cpu_notify(struct notifier_block *self,
        case CPU_ONLINE:
                appldata_online_cpu((long) hcpu);
                break;
-#ifdef CONFIG_HOTPLUG_CPU
        case CPU_DEAD:
                appldata_offline_cpu((long) hcpu);
                break;
-#endif
        default:
                break;
        }
        return NOTIFY_OK;
 }
 
-static struct notifier_block __devinitdata appldata_nb = {
+static struct notifier_block appldata_nb = {
        .notifier_call = appldata_cpu_notify,
 };
+#endif
 
 /*
  * appldata_init()
@@ -662,7 +662,7 @@ static int __init appldata_init(void)
                appldata_online_cpu(i);
 
        /* Register cpu hotplug notifier */
-       register_cpu_notifier(&appldata_nb);
+       register_hotcpu_notifier(&appldata_nb);
 
        appldata_sysctl_header = register_sysctl_table(appldata_dir_table, 1);
 #ifdef MODULE
index f4dfc10026d2411fb8ec0a301360fb50b1dbf5f9..f1d4591eddbbd3bcf26801a728e033992841f412 100644 (file)
@@ -1,13 +1,16 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17-rc1
-# Mon Apr  3 14:34:15 2006
+# Linux kernel version: 2.6.18-rc2
+# Thu Jul 27 13:51:07 2006
 #
 CONFIG_MMU=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_S390=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
@@ -25,6 +28,7 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
 CONFIG_SYSCTL=y
 CONFIG_AUDIT=y
 # CONFIG_AUDITSYSCALL is not set
@@ -43,10 +47,12 @@ CONFIG_PRINTK=y
 CONFIG_BUG=y
 CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
+CONFIG_RT_MUTEXES=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_SHMEM=y
 CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 # CONFIG_SLOB is not set
@@ -94,7 +100,6 @@ CONFIG_HOTPLUG_CPU=y
 CONFIG_DEFAULT_MIGRATION_COST=1000000
 CONFIG_COMPAT=y
 CONFIG_SYSVIPC_COMPAT=y
-CONFIG_BINFMT_ELF32=y
 
 #
 # Code generation options
@@ -115,6 +120,7 @@ CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_RESOURCES_64BIT=y
 
 #
 # I/O subsystem configuration
@@ -142,6 +148,7 @@ CONFIG_VIRT_CPU_ACCOUNTING=y
 # CONFIG_APPLDATA_BASE is not set
 CONFIG_NO_IDLE_HZ=y
 CONFIG_NO_IDLE_HZ_INIT=y
+CONFIG_S390_HYPFS_FS=y
 CONFIG_KEXEC=y
 
 #
@@ -174,6 +181,8 @@ CONFIG_IP_FIB_HASH=y
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_XFRM_TUNNEL is not set
 # CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
@@ -186,7 +195,10 @@ CONFIG_IPV6=y
 # CONFIG_INET6_IPCOMP is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
 # CONFIG_IPV6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
 
 #
@@ -263,6 +275,7 @@ CONFIG_NET_ESTIMATOR=y
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_TCPPROBE is not set
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
@@ -276,6 +289,7 @@ CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
 # CONFIG_DEBUG_DRIVER is not set
+CONFIG_SYS_HYPERVISOR=y
 
 #
 # Connector - unified userspace <-> kernelspace linker
@@ -334,6 +348,7 @@ CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
 
@@ -359,9 +374,7 @@ CONFIG_MD_LINEAR=m
 CONFIG_MD_RAID0=m
 CONFIG_MD_RAID1=m
 # CONFIG_MD_RAID10 is not set
-CONFIG_MD_RAID5=m
-# CONFIG_MD_RAID5_RESHAPE is not set
-# CONFIG_MD_RAID6 is not set
+# CONFIG_MD_RAID456 is not set
 CONFIG_MD_MULTIPATH=m
 # CONFIG_MD_FAULTY is not set
 CONFIG_BLK_DEV_DM=y
@@ -419,7 +432,8 @@ CONFIG_S390_TAPE_34XX=m
 #
 # Cryptographic devices
 #
-CONFIG_Z90CRYPT=m
+CONFIG_ZCRYPT=m
+# CONFIG_ZCRYPT_MONOLITHIC is not set
 
 #
 # Network device support
@@ -509,6 +523,7 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
@@ -614,26 +629,36 @@ CONFIG_MSDOS_PARTITION=y
 # Instrumentation Support
 #
 # CONFIG_PROFILING is not set
-# CONFIG_STATISTICS is not set
+CONFIG_STATISTICS=y
+CONFIG_KPROBES=y
 
 #
 # Kernel hacking
 #
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_LOG_BUF_SHIFT=17
 # CONFIG_DETECT_SOFTLOCKUP is not set
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_DEBUG_PREEMPT=y
-CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
 CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
 CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_FS=y
 # CONFIG_DEBUG_VM is not set
+# CONFIG_FRAME_POINTER is not set
 # CONFIG_UNWIND_INFO is not set
 CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
@@ -688,3 +713,4 @@ CONFIG_CRYPTO=y
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=m
 # CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
index 04eb1eab6e3e17f2777045c86a31650900cb999e..845081b0126760ac14e8b7c2735ad089bee991f2 100644 (file)
@@ -225,6 +225,32 @@ static __inline__ int has_low_battery(void)
        return (data1 == data2);        /* Was the write blocked? */
 }
 
+static void __init mostek_set_system_time(void)
+{
+       unsigned int year, mon, day, hour, min, sec;
+       struct mostek48t02 *mregs;
+
+       mregs = (struct mostek48t02 *)mstk48t02_regs;
+       if(!mregs) {
+               prom_printf("Something wrong, clock regs not mapped yet.\n");
+               prom_halt();
+       }               
+       spin_lock_irq(&mostek_lock);
+       mregs->creg |= MSTK_CREG_READ;
+       sec = MSTK_REG_SEC(mregs);
+       min = MSTK_REG_MIN(mregs);
+       hour = MSTK_REG_HOUR(mregs);
+       day = MSTK_REG_DOM(mregs);
+       mon = MSTK_REG_MONTH(mregs);
+       year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) );
+       xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
+       xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
+        set_normalized_timespec(&wall_to_monotonic,
+                                -xtime.tv_sec, -xtime.tv_nsec);
+       mregs->creg &= ~MSTK_CREG_READ;
+       spin_unlock_irq(&mostek_lock);
+}
+
 /* Probe for the real time clock chip on Sun4 */
 static __inline__ void sun4_clock_probe(void)
 {
@@ -273,6 +299,7 @@ static __inline__ void sun4_clock_probe(void)
 #endif
 }
 
+#ifndef CONFIG_SUN4
 static int __devinit clock_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
@@ -307,6 +334,8 @@ static int __devinit clock_probe(struct of_device *op, const struct of_device_id
        if (mostek_read(mstk48t02_regs + MOSTEK_SEC) & MSTK_STOP)
                kick_start_clock();
 
+       mostek_set_system_time();
+
        return 0;
 }
 
@@ -325,56 +354,37 @@ static struct of_platform_driver clock_driver = {
 
 
 /* Probe for the mostek real time clock chip. */
-static void clock_init(void)
+static int __init clock_init(void)
 {
-       of_register_driver(&clock_driver, &of_bus_type);
+       return of_register_driver(&clock_driver, &of_bus_type);
 }
 
+/* Must be after subsys_initcall() so that busses are probed.  Must
+ * be before device_initcall() because things like the RTC driver
+ * need to see the clock registers.
+ */
+fs_initcall(clock_init);
+#endif /* !CONFIG_SUN4 */
+
 void __init sbus_time_init(void)
 {
-       unsigned int year, mon, day, hour, min, sec;
-       struct mostek48t02 *mregs;
-
-#ifdef CONFIG_SUN4
-       int temp;
-       struct intersil *iregs;
-#endif
 
        BTFIXUPSET_CALL(bus_do_settimeofday, sbus_do_settimeofday, BTFIXUPCALL_NORM);
        btfixup();
 
        if (ARCH_SUN4)
                sun4_clock_probe();
-       else
-               clock_init();
 
        sparc_init_timers(timer_interrupt);
        
 #ifdef CONFIG_SUN4
        if(idprom->id_machtype == (SM_SUN4 | SM_4_330)) {
-#endif
-       mregs = (struct mostek48t02 *)mstk48t02_regs;
-       if(!mregs) {
-               prom_printf("Something wrong, clock regs not mapped yet.\n");
-               prom_halt();
-       }               
-       spin_lock_irq(&mostek_lock);
-       mregs->creg |= MSTK_CREG_READ;
-       sec = MSTK_REG_SEC(mregs);
-       min = MSTK_REG_MIN(mregs);
-       hour = MSTK_REG_HOUR(mregs);
-       day = MSTK_REG_DOM(mregs);
-       mon = MSTK_REG_MONTH(mregs);
-       year = MSTK_CVT_YEAR( MSTK_REG_YEAR(mregs) );
-       xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-       xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-        set_normalized_timespec(&wall_to_monotonic,
-                                -xtime.tv_sec, -xtime.tv_nsec);
-       mregs->creg &= ~MSTK_CREG_READ;
-       spin_unlock_irq(&mostek_lock);
-#ifdef CONFIG_SUN4
+               mostek_set_system_time();
        } else if(idprom->id_machtype == (SM_SUN4 | SM_4_260) ) {
                /* initialise the intersil on sun4 */
+               unsigned int year, mon, day, hour, min, sec;
+               int temp;
+               struct intersil *iregs;
 
                iregs=intersil_clock;
                if(!iregs) {
index 1605967cce91c1a076a482a56cb9cf399ebc204e..55ae802dc0ad6ffd6c06b9bd12e860f9a777267b 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/kprobes.h>
+#include <linux/kallsyms.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
@@ -132,6 +133,8 @@ static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr)
 
        printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n",
               regs->tpc);
+       printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]);
+       print_symbol("RPC: <%s>\n", regs->u_regs[15]);
        printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr);
        __asm__("mov %%sp, %0" : "=r" (ksp));
        show_stack(current, ksp);
index 2517ecb8bf27d07d56fc5903c0cd26052aa7617a..68ed24df5c8fa7f24d5089e305fa91e743c37e5a 100644 (file)
@@ -26,6 +26,7 @@ SECTIONS
 
   /* Read-only sections, merged into text segment: */
   .hash           : { *(.hash) }
+  .gnu.hash       : { *(.gnu.hash) }
   .dynsym         : { *(.dynsym) }
   .dynstr         : { *(.dynstr) }
   .gnu.version    : { *(.gnu.version) }
index 62bdb8d29fc05191750c7f1033a802e24f445d4d..1bf672a25692a9b3575d527092a1b255430e391f 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/setup.c -- Arch-dependent initialization functions
  *
- *  Copyright (C) 2001,02,03,05  NEC Electronics Corporation
- *  Copyright (C) 2001,02,03,05  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03,05,06  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03,05,06  Miles Bader <miles@gnu.org>
  *
  * This file is subject to the terms and conditions of the GNU General
  * Public License.  See the file COPYING in the main directory of this
@@ -190,7 +190,7 @@ void free_initmem (void)
                for (addr = start; addr < end; addr += PAGE_SIZE) {
                        struct page *page = virt_to_page (addr);
                        ClearPageReserved (page);
-                       set_page_count (page, 1);
+                       init_page_count (page);
                        __free_page (page);
                        total_ram_pages++;
                }
index c03ad6ed61cca6f10139895a4f4ba4dcb89deef7..67bc48e57c60061c707f762c3b74de88dcb1338f 100644 (file)
@@ -21,9 +21,6 @@ EXPORT_SYMBOL (trap_table);
 
 /* platform dependent support */
 EXPORT_SYMBOL (kernel_thread);
-EXPORT_SYMBOL (enable_irq);
-EXPORT_SYMBOL (disable_irq);
-EXPORT_SYMBOL (disable_irq_nosync);
 EXPORT_SYMBOL (__bug);
 
 /* Networking helper routines. */
@@ -33,22 +30,9 @@ EXPORT_SYMBOL (ip_compute_csum);
 EXPORT_SYMBOL (ip_fast_csum);
 
 /* string / mem functions */
-EXPORT_SYMBOL (strcpy);
-EXPORT_SYMBOL (strncpy);
-EXPORT_SYMBOL (strcat);
-EXPORT_SYMBOL (strncat);
-EXPORT_SYMBOL (strcmp);
-EXPORT_SYMBOL (strncmp);
-EXPORT_SYMBOL (strchr);
-EXPORT_SYMBOL (strlen);
-EXPORT_SYMBOL (strnlen);
-EXPORT_SYMBOL (strrchr);
-EXPORT_SYMBOL (strstr);
 EXPORT_SYMBOL (memset);
 EXPORT_SYMBOL (memcpy);
 EXPORT_SYMBOL (memmove);
-EXPORT_SYMBOL (memcmp);
-EXPORT_SYMBOL (memscan);
 
 /* semaphores */
 EXPORT_SYMBOL (__down);
index 83d389b8ebd80f8f3eddb23a2b5cc802f6284136..840d5d93d5cc9f3447c844f1a4eef8e6f6ffef87 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17-git22
-# Tue Jul  4 14:24:40 2006
+# Linux kernel version: 2.6.18-rc2
+# Tue Jul 18 17:13:20 2006
 #
 CONFIG_X86_64=y
 CONFIG_64BIT=y
@@ -37,6 +37,7 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
 CONFIG_SYSCTL=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
@@ -413,6 +414,7 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 CONFIG_BLK_DEV_INITRD=y
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
@@ -1195,7 +1197,7 @@ CONFIG_USB_MON=y
 # CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
-# CONFIG_USB_CY7C63 is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
 # CONFIG_USB_CYTHERM is not set
 # CONFIG_USB_PHIDGETKIT is not set
 # CONFIG_USB_PHIDGETSERVO is not set
@@ -1373,7 +1375,6 @@ CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
 # CONFIG_CIFS is not set
-# CONFIG_CIFS_DEBUG2 is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
index 62bc5f56da9e7cf8def1e9749297c6e2b1234cf1..cdae36435e21a308aece3f925cf71e5a5b8a7c8a 100644 (file)
@@ -23,6 +23,7 @@ targets := $(foreach F,sysenter syscall,vsyscall-$F.o vsyscall-$F.so)
 # The DSO images are built using a special linker script
 quiet_cmd_syscall = SYSCALL $@
       cmd_syscall = $(CC) -m32 -nostdlib -shared -s \
+                         $(call ld-option, -Wl$(comma)--hash-style=sysv) \
                           -Wl,-soname=linux-gate.so.1 -o $@ \
                           -Wl,-T,$(filter-out FORCE,$^)
 
index 9b5bb413a6e938ea1efe0c41327563e07547774d..5d4a7d125ed0bbd9cbc0729290b25475b3a1534d 100644 (file)
@@ -103,7 +103,7 @@ ENTRY(ia32_sysenter_target)
        pushq   %rax
        CFI_ADJUST_CFA_OFFSET 8
        cld
-       SAVE_ARGS 0,0,1
+       SAVE_ARGS 0,0,0
        /* no need to do an access_ok check here because rbp has been
           32bit zero extended */ 
 1:     movl    (%rbp),%r9d
index f2e75ed4c6c757caca14fa19cb488e75d97f685e..1dc86ff5bcb9013a3fa404700129ce528ae0061b 100644 (file)
@@ -11,6 +11,7 @@ SECTIONS
   . = VSYSCALL_BASE + SIZEOF_HEADERS;
 
   .hash           : { *(.hash) }               :text
+  .gnu.hash       : { *(.gnu.hash) }
   .dynsym         : { *(.dynsym) }
   .dynstr         : { *(.dynstr) }
   .gnu.version    : { *(.gnu.version) }
index 83fb24a02821e0f67d6c14b5cff6b417da5e0221..106076b370fc8fa8a4cfc2faf610bf237b2dbde0 100644 (file)
@@ -207,14 +207,11 @@ NORET_TYPE void machine_kexec(struct kimage *image)
        __flush_tlb();
 
 
-       /* The segment registers are funny things, they are
-        * automatically loaded from a table, in memory wherever you
-        * set them to a specific selector, but this table is never
-        * accessed again unless you set the segment to a different selector.
-        *
-        * The more common model are caches where the behide
-        * the scenes work is done, but is also dropped at arbitrary
-        * times.
+       /* The segment registers are funny things, they have both a
+        * visible and an invisible part.  Whenever the visible part is
+        * set to a specific selector, the invisible part is loaded
+        * with from a table in memory.  At no other time is the
+        * descriptor table in memory accessed.
         *
         * I take advantage of this here by force loading the
         * segments, before I zap the gdt with an invalid value.
index 88845674c661a39feefc5b35bb5c5dd9b2255be8..4e017fb30fb3f60c824fabc384bd895867dc90e8 100644 (file)
@@ -615,7 +615,7 @@ static __cpuinit int mce_create_device(unsigned int cpu)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-static __cpuinit void mce_remove_device(unsigned int cpu)
+static void mce_remove_device(unsigned int cpu)
 {
        int i;
 
@@ -626,10 +626,9 @@ static __cpuinit void mce_remove_device(unsigned int cpu)
        sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval);
        sysdev_unregister(&per_cpu(device_mce,cpu));
 }
-#endif
 
 /* Get notified when a cpu comes on/off. Be hotplug friendly. */
-static __cpuinit int
+static int
 mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
 {
        unsigned int cpu = (unsigned long)hcpu;
@@ -638,18 +637,17 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
        case CPU_ONLINE:
                mce_create_device(cpu);
                break;
-#ifdef CONFIG_HOTPLUG_CPU
        case CPU_DEAD:
                mce_remove_device(cpu);
                break;
-#endif
        }
        return NOTIFY_OK;
 }
 
-static struct notifier_block __cpuinitdata mce_cpu_notifier = {
+static struct notifier_block mce_cpu_notifier = {
        .notifier_call = mce_cpu_callback,
 };
+#endif
 
 static __init int mce_init_device(void)
 {
@@ -664,7 +662,7 @@ static __init int mce_init_device(void)
                mce_create_device(i);
        }
 
-       register_cpu_notifier(&mce_cpu_notifier);
+       register_hotcpu_notifier(&mce_cpu_notifier);
        misc_register(&mce_log_device);
        return err;
 }
index db2acbf7ad288b4621a7e4bcb7f79d86d13eef43..883fe747f64c3346e21f9d8c7ceed22244287b47 100644 (file)
@@ -558,7 +558,7 @@ out:
  *   of shared sysfs dir/files, and rest of the cores will be symlinked to it.
  */
 
-static __cpuinit void deallocate_threshold_block(unsigned int cpu,
+static void deallocate_threshold_block(unsigned int cpu,
                                                 unsigned int bank)
 {
        struct threshold_block *pos = NULL;
@@ -578,7 +578,7 @@ static __cpuinit void deallocate_threshold_block(unsigned int cpu,
        per_cpu(threshold_banks, cpu)[bank]->blocks = NULL;
 }
 
-static __cpuinit void threshold_remove_bank(unsigned int cpu, int bank)
+static void threshold_remove_bank(unsigned int cpu, int bank)
 {
        int i = 0;
        struct threshold_bank *b;
@@ -618,7 +618,7 @@ free_out:
        per_cpu(threshold_banks, cpu)[bank] = NULL;
 }
 
-static __cpuinit void threshold_remove_device(unsigned int cpu)
+static void threshold_remove_device(unsigned int cpu)
 {
        unsigned int bank;
 
@@ -629,14 +629,8 @@ static __cpuinit void threshold_remove_device(unsigned int cpu)
        }
 }
 
-#else /* !CONFIG_HOTPLUG_CPU */
-static void threshold_remove_device(unsigned int cpu)
-{
-}
-#endif
-
 /* get notified when a cpu comes on/off */
-static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
+static int threshold_cpu_callback(struct notifier_block *nfb,
                                            unsigned long action, void *hcpu)
 {
        /* cpu was unsigned int to begin with */
@@ -659,9 +653,10 @@ static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
        return NOTIFY_OK;
 }
 
-static struct notifier_block threshold_cpu_notifier __cpuinitdata = {
+static struct notifier_block threshold_cpu_notifier = {
        .notifier_call = threshold_cpu_callback,
 };
+#endif /* CONFIG_HOTPLUG_CPU */
 
 static __init int threshold_init_device(void)
 {
@@ -673,7 +668,7 @@ static __init int threshold_init_device(void)
                if (err)
                        return err;
        }
-       register_cpu_notifier(&threshold_cpu_notifier);
+       register_hotcpu_notifier(&threshold_cpu_notifier);
        return 0;
 }
 
index e71ed53b08fb7bad84aa3f852504d1291237f249..146924ba5df5b5d86ec3aea9b2a1edddc17f83e8 100644 (file)
@@ -85,7 +85,8 @@
 #define CSR_AGENT_MASK         0xffe0ffff
 
 #define MAX_NUM_OF_PHBS                8 /* how many PHBs in total? */
-#define MAX_PHB_BUS_NUM                (MAX_NUM_OF_PHBS * 2) /* max dev->bus->number */
+#define MAX_NUM_CHASSIS                8 /* max number of chassis */
+#define MAX_PHB_BUS_NUM                (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) /* max dev->bus->number */
 #define PHBS_PER_CALGARY       4
 
 /* register offsets in Calgary's internal register space */
@@ -110,7 +111,8 @@ static const unsigned long phb_offsets[] = {
        0xB000 /* PHB3 */
 };
 
-void* tce_table_kva[MAX_NUM_OF_PHBS * MAX_NUMNODES];
+static char bus_to_phb[MAX_PHB_BUS_NUM];
+void* tce_table_kva[MAX_PHB_BUS_NUM];
 unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED;
 static int translate_empty_slots __read_mostly = 0;
 static int calgary_detected __read_mostly = 0;
@@ -119,7 +121,7 @@ static int calgary_detected __read_mostly = 0;
  * the bitmap of PHBs the user requested that we disable
  * translation on.
  */
-static DECLARE_BITMAP(translation_disabled, MAX_NUMNODES * MAX_PHB_BUS_NUM);
+static DECLARE_BITMAP(translation_disabled, MAX_PHB_BUS_NUM);
 
 static void tce_cache_blast(struct iommu_table *tbl);
 
@@ -452,7 +454,7 @@ static struct dma_mapping_ops calgary_dma_ops = {
 
 static inline int busno_to_phbid(unsigned char num)
 {
-       return bus_to_phb(num) % PHBS_PER_CALGARY;
+       return bus_to_phb[num];
 }
 
 static inline unsigned long split_queue_offset(unsigned char num)
@@ -812,7 +814,7 @@ static int __init calgary_init(void)
        int i, ret = -ENODEV;
        struct pci_dev *dev = NULL;
 
-       for (i = 0; i <= num_online_nodes() * MAX_NUM_OF_PHBS; i++) {
+       for (i = 0; i < MAX_PHB_BUS_NUM; i++) {
                dev = pci_get_device(PCI_VENDOR_ID_IBM,
                                     PCI_DEVICE_ID_IBM_CALGARY,
                                     dev);
@@ -822,7 +824,7 @@ static int __init calgary_init(void)
                        calgary_init_one_nontraslated(dev);
                        continue;
                }
-               if (!tce_table_kva[i] && !translate_empty_slots) {
+               if (!tce_table_kva[dev->bus->number] && !translate_empty_slots) {
                        pci_dev_put(dev);
                        continue;
                }
@@ -842,7 +844,7 @@ error:
                        pci_dev_put(dev);
                        continue;
                }
-               if (!tce_table_kva[i] && !translate_empty_slots)
+               if (!tce_table_kva[dev->bus->number] && !translate_empty_slots)
                        continue;
                calgary_disable_translation(dev);
                calgary_free_tar(dev);
@@ -876,9 +878,10 @@ static inline int __init determine_tce_table_size(u64 ram)
 void __init detect_calgary(void)
 {
        u32 val;
-       int bus, table_idx;
+       int bus;
        void *tbl;
-       int detected = 0;
+       int calgary_found = 0;
+       int phb = -1;
 
        /*
         * if the user specified iommu=off or iommu=soft or we found
@@ -889,38 +892,46 @@ void __init detect_calgary(void)
 
        specified_table_size = determine_tce_table_size(end_pfn * PAGE_SIZE);
 
-       for (bus = 0, table_idx = 0;
-            bus <= num_online_nodes() * MAX_PHB_BUS_NUM;
-            bus++) {
-               BUG_ON(bus > MAX_NUMNODES * MAX_PHB_BUS_NUM);
+       for (bus = 0; bus < MAX_PHB_BUS_NUM; bus++) {
+               int dev;
+
+               tce_table_kva[bus] = NULL;
+               bus_to_phb[bus] = -1;
+
                if (read_pci_config(bus, 0, 0, 0) != PCI_VENDOR_DEVICE_ID_CALGARY)
                        continue;
+
+               /*
+                * There are 4 PHBs per Calgary chip.  Set phb to which phb (0-3)
+                * it is connected to releative to the clagary chip.
+                */
+               phb = (phb + 1) % PHBS_PER_CALGARY;
+
                if (test_bit(bus, translation_disabled)) {
                        printk(KERN_INFO "Calgary: translation is disabled for "
                               "PHB 0x%x\n", bus);
                        /* skip this phb, don't allocate a tbl for it */
-                       tce_table_kva[table_idx] = NULL;
-                       table_idx++;
                        continue;
                }
                /*
-                * scan the first slot of the PCI bus to see if there
-                * are any devices present
+                * Scan the slots of the PCI bus to see if there is a device present.
+                * The parent bus will be the zero-ith device, so start at 1.
                 */
-               val = read_pci_config(bus, 1, 0, 0);
-               if (val != 0xffffffff || translate_empty_slots) {
-                       tbl = alloc_tce_table();
-                       if (!tbl)
-                               goto cleanup;
-                       detected = 1;
-               } else
-                       tbl = NULL;
-
-               tce_table_kva[table_idx] = tbl;
-               table_idx++;
+               for (dev = 1; dev < 8; dev++) {
+                       val = read_pci_config(bus, dev, 0, 0);
+                       if (val != 0xffffffff || translate_empty_slots) {
+                               tbl = alloc_tce_table();
+                               if (!tbl)
+                                       goto cleanup;
+                               tce_table_kva[bus] = tbl;
+                               bus_to_phb[bus] = phb;
+                               calgary_found = 1;
+                               break;
+                       }
+               }
        }
 
-       if (detected) {
+       if (calgary_found) {
                iommu_detected = 1;
                calgary_detected = 1;
                printk(KERN_INFO "PCI-DMA: Calgary IOMMU detected. "
@@ -929,9 +940,9 @@ void __init detect_calgary(void)
        return;
 
 cleanup:
-       for (--table_idx; table_idx >= 0; --table_idx)
-               if (tce_table_kva[table_idx])
-                       free_tce_table(tce_table_kva[table_idx]);
+       for (--bus; bus >= 0; --bus)
+               if (tce_table_kva[bus])
+                       free_tce_table(tce_table_kva[bus]);
 }
 
 int __init calgary_iommu_init(void)
@@ -1002,7 +1013,7 @@ static int __init calgary_parse_options(char *p)
                        if (p == endp)
                                break;
 
-                       if (bridge <= (num_online_nodes() * MAX_PHB_BUS_NUM)) {
+                       if (bridge < MAX_PHB_BUS_NUM) {
                                printk(KERN_INFO "Calgary: disabling "
                                       "translation for PHB 0x%x\n", bridge);
                                set_bit(bridge, translation_disabled);
index ebdb77fe20573702facc612fd1262ab3e3d93ade..6a55f87ba97f917ed2814bc3c11c3f21a3ad096b 100644 (file)
@@ -31,9 +31,10 @@ struct dma_mapping_ops swiotlb_dma_ops = {
 void pci_swiotlb_init(void)
 {
        /* don't initialize swiotlb if iommu=off (no_iommu=1) */
-       if (!iommu_detected && !no_iommu &&
-           (end_pfn > MAX_DMA32_PFN || force_iommu))
+       if (!iommu_detected && !no_iommu && end_pfn > MAX_DMA32_PFN)
               swiotlb = 1;
+       if (swiotlb_force)
+               swiotlb = 1;
        if (swiotlb) {
                printk(KERN_INFO "PCI-DMA: Using software bounce buffering for IO (SWIOTLB)\n");
                swiotlb_init();
index d3a9e79e954c43aaf8bd873be430a57448382c61..5530dda3f27ac3b84ec63a6e4f96662f4f50abc3 100644 (file)
@@ -96,7 +96,6 @@ static inline unsigned int table_size_to_number_of_entries(unsigned char size)
 static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl)
 {
        unsigned int bitmapsz;
-       unsigned int tce_table_index;
        unsigned long bmppages;
        int ret;
 
@@ -105,8 +104,7 @@ static int tce_table_setparms(struct pci_dev *dev, struct iommu_table *tbl)
        /* set the tce table size - measured in entries */
        tbl->it_size = table_size_to_number_of_entries(specified_table_size);
 
-       tce_table_index = bus_to_phb(tbl->it_busno);
-       tbl->it_base = (unsigned long)tce_table_kva[tce_table_index];
+       tbl->it_base = (unsigned long)tce_table_kva[dev->bus->number];
        if (!tbl->it_base) {
                printk(KERN_ERR "Calgary: iommu_table_setparms: "
                       "no table allocated?!\n");
index b9ff75992c16d85b8fd1c7b7a2118c7d6847087b..7a9b18224182ced7cd0932b2691249c69f70e4ad 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/acpi.h>
 #ifdef CONFIG_ACPI
 #include <acpi/achware.h>      /* for PM timer frequency */
+#include <acpi/acpi_bus.h>
 #endif
 #include <asm/8253pit.h>
 #include <asm/pgtable.h>
@@ -193,7 +194,7 @@ unsigned long profile_pc(struct pt_regs *regs)
           is just accounted to the spinlock function.
           Better would be to write these functions in assembler again
           and check exactly. */
-       if (in_lock_functions(pc)) {
+       if (!user_mode(regs) && in_lock_functions(pc)) {
                char *v = *(char **)regs->rsp;
                if ((v >= _stext && v <= _etext) ||
                        (v >= _sinittext && v <= _einittext) ||
@@ -953,11 +954,18 @@ __cpuinit int unsynchronized_tsc(void)
 #ifdef CONFIG_SMP
        if (apic_is_clustered_box())
                return 1;
-       /* Intel systems are normally all synchronized. Exceptions
-          are handled in the check above. */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-               return 0;
 #endif
+       /* Most intel systems have synchronized TSCs except for
+          multi node systems */
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
+#ifdef CONFIG_ACPI
+               /* But TSC doesn't tick in C3 so don't use it there */
+               if (acpi_fadt.length > 0 && acpi_fadt.plvl3_lat < 100)
+                       return 1;
+#endif
+               return 0;
+       }
+
        /* Assume multi socket systems are not synchronized */
        return num_present_cpus() > 1;
 }
index eb39a2775236428a405aeda04227d15be93b8b27..4e9938dee0609489cfd0db60fbb6134e12617dcf 100644 (file)
@@ -254,7 +254,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
 {
        const unsigned cpu = safe_smp_processor_id();
        unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
-       int i = 11;
        unsigned used = 0;
 
        printk("\nCall Trace:\n");
@@ -275,11 +274,20 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
                        if (unwind_init_blocked(&info, tsk) == 0)
                                unw_ret = show_trace_unwind(&info, NULL);
                }
-               if (unw_ret > 0) {
-                       if (call_trace > 0)
+               if (unw_ret > 0 && !arch_unw_user_mode(&info)) {
+#ifdef CONFIG_STACK_UNWIND
+                       unsigned long rip = info.regs.rip;
+                       print_symbol("DWARF2 unwinder stuck at %s\n", rip);
+                       if (call_trace == 1) {
+                               printk("Leftover inexact backtrace:\n");
+                               stack = (unsigned long *)info.regs.rsp;
+                       } else if (call_trace > 1)
                                return;
-                       printk("Legacy call trace:");
-                       i = 18;
+                       else
+                               printk("Full inexact backtrace again:\n");
+#else
+                       printk("Inexact backtrace:\n");
+#endif
                }
        }
 
@@ -521,7 +529,7 @@ void __kprobes oops_end(unsigned long flags)
                /* Nest count reaches zero, release the lock. */
                spin_unlock_irqrestore(&die_lock, flags);
        if (panic_on_oops)
-               panic("Oops");
+               panic("Fatal exception: panic_on_oops");
 }
 
 void __kprobes __die(const char * str, struct pt_regs * regs, long err)
@@ -1118,8 +1126,10 @@ static int __init call_trace_setup(char *s)
                call_trace = -1;
        else if (strcmp(s, "both") == 0)
                call_trace = 0;
-       else if (strcmp(s, "new") == 0)
+       else if (strcmp(s, "newfallback") == 0)
                call_trace = 1;
+       else if (strcmp(s, "new") == 0)
+               call_trace = 2;
        return 1;
 }
 __setup("call_trace=", call_trace_setup);
index b50a7c7c47f8984b45329d07447a5b9cbb1447d3..3acf60ded2a0b54144a72b5b0faf5f8bc2c00933 100644 (file)
@@ -2,7 +2,6 @@
 #include <linux/pci.h>
 #include <asm/mpspec.h>
 #include <linux/cpumask.h>
-#include <asm/k8.h>
 
 /*
  * This discovers the pcibus <-> node mapping on AMD K8.
@@ -19,6 +18,7 @@
 #define NR_LDT_BUS_NUMBER_REGISTERS 3
 #define SECONDARY_LDT_BUS_NUMBER(dword) ((dword >> 8) & 0xFF)
 #define SUBORDINATE_LDT_BUS_NUMBER(dword) ((dword >> 16) & 0xFF)
+#define PCI_DEVICE_ID_K8HTCONFIG 0x1100
 
 /**
  * fill_mp_bus_to_cpumask()
@@ -28,7 +28,8 @@
 __init static int
 fill_mp_bus_to_cpumask(void)
 {
-       int i, j, k;
+       struct pci_dev *nb_dev = NULL;
+       int i, j;
        u32 ldtbus, nid;
        static int lbnr[3] = {
                LDT_BUS_NUMBER_REGISTER_0,
@@ -36,9 +37,8 @@ fill_mp_bus_to_cpumask(void)
                LDT_BUS_NUMBER_REGISTER_2
        };
 
-       cache_k8_northbridges();
-       for (k = 0; k < num_k8_northbridges; k++) {
-               struct pci_dev *nb_dev = k8_northbridges[k];
+       while ((nb_dev = pci_get_device(PCI_VENDOR_ID_AMD,
+                       PCI_DEVICE_ID_K8HTCONFIG, nb_dev))) {
                pci_read_config_dword(nb_dev, NODE_ID_REGISTER, &nid);
 
                for (i = 0; i < NR_LDT_BUS_NUMBER_REGISTERS; i++) {
index 27e409089a7b9837ce33927236f21ea89323fdf1..9734960a24519a625ad5e712ada896f3cd7e0f28 100644 (file)
@@ -487,11 +487,9 @@ void die(const char * str, struct pt_regs * regs, long err)
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
-       if (panic_on_oops) {
-               printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
-               ssleep(5);
-               panic("Fatal exception");
-       }
+       if (panic_on_oops)
+               panic("Fatal exception: panic_on_oops");
+
        do_exit(err);
 }
 
index b8c0702777ff4e1bb2557567a7aa7f6d987bb6eb..265f7a830619ef1e5de60bfe1179fa9d3a002229 100644 (file)
@@ -80,7 +80,7 @@ static u32 bio_act[5] __read_mostly = { 0, BLK_TC_ACT(BLK_TC_BARRIER), BLK_TC_AC
 #define trace_sync_bit(rw)     \
        (((rw) & (1 << BIO_RW_SYNC)) >> (BIO_RW_SYNC - 1))
 #define trace_ahead_bit(rw)    \
-       (((rw) & (1 << BIO_RW_AHEAD)) << (BIO_RW_AHEAD - 0))
+       (((rw) & (1 << BIO_RW_AHEAD)) << (2 - BIO_RW_AHEAD))
 
 /*
  * The worker for the various blk_add_trace*() types. Fills out a
index 102ebc2c5c34c73f8e7f76c589559ddfde0d9885..aae3123bf3eec6501faa46fdbf3000ea4bfa97af 100644 (file)
@@ -936,7 +936,7 @@ static int cfq_arm_slice_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
         * seeks. so allow a little bit of time for him to submit a new rq
         */
        if (sample_valid(cic->seek_samples) && CIC_SEEKY(cic))
-               sl = 2;
+               sl = min(sl, msecs_to_jiffies(2));
 
        mod_timer(&cfqd->idle_slice_timer, jiffies + sl);
        return 1;
index c2d621632383306a493fd5f60d5d3b9b55721f70..3ef9d514b916985af339d2af7067903daf9a881e 100644 (file)
@@ -139,7 +139,7 @@ static int __cpuinit topology_sysfs_init(void)
                                (void *)(long)i);
        }
 
-       register_cpu_notifier(&topology_cpu_notifier);
+       register_hotcpu_notifier(&topology_cpu_notifier);
 
        return 0;
 }
index 1c4df22dfd2a960a2309570e093828e570096d94..7b0eca703a678c3c2401b58e9c78f07d0e40f415 100644 (file)
@@ -1233,6 +1233,50 @@ static inline void complete_buffers(struct bio *bio, int status)
        }
 }
 
+static void cciss_check_queues(ctlr_info_t *h)
+{
+       int start_queue = h->next_to_run;
+       int i;
+
+       /* check to see if we have maxed out the number of commands that can
+        * be placed on the queue.  If so then exit.  We do this check here
+        * in case the interrupt we serviced was from an ioctl and did not
+        * free any new commands.
+        */
+       if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
+               return;
+
+       /* We have room on the queue for more commands.  Now we need to queue
+        * them up.  We will also keep track of the next queue to run so
+        * that every queue gets a chance to be started first.
+        */
+       for (i = 0; i < h->highest_lun + 1; i++) {
+               int curr_queue = (start_queue + i) % (h->highest_lun + 1);
+               /* make sure the disk has been added and the drive is real
+                * because this can be called from the middle of init_one.
+                */
+               if (!(h->drv[curr_queue].queue) || !(h->drv[curr_queue].heads))
+                       continue;
+               blk_start_queue(h->gendisk[curr_queue]->queue);
+
+               /* check to see if we have maxed out the number of commands
+                * that can be placed on the queue.
+                */
+               if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) {
+                       if (curr_queue == start_queue) {
+                               h->next_to_run =
+                                   (start_queue + 1) % (h->highest_lun + 1);
+                               break;
+                       } else {
+                               h->next_to_run = curr_queue;
+                               break;
+                       }
+               } else {
+                       curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
+               }
+       }
+}
+
 static void cciss_softirq_done(struct request *rq)
 {
        CommandList_struct *cmd = rq->completion_data;
@@ -1264,6 +1308,7 @@ static void cciss_softirq_done(struct request *rq)
        spin_lock_irqsave(&h->lock, flags);
        end_that_request_last(rq, rq->errors);
        cmd_free(h, cmd, 1);
+       cciss_check_queues(h);
        spin_unlock_irqrestore(&h->lock, flags);
 }
 
@@ -2528,8 +2573,6 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
        CommandList_struct *c;
        unsigned long flags;
        __u32 a, a1, a2;
-       int j;
-       int start_queue = h->next_to_run;
 
        if (interrupt_not_for_us(h))
                return IRQ_NONE;
@@ -2588,45 +2631,6 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
                }
        }
 
-       /* check to see if we have maxed out the number of commands that can
-        * be placed on the queue.  If so then exit.  We do this check here
-        * in case the interrupt we serviced was from an ioctl and did not
-        * free any new commands.
-        */
-       if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
-               goto cleanup;
-
-       /* We have room on the queue for more commands.  Now we need to queue
-        * them up.  We will also keep track of the next queue to run so
-        * that every queue gets a chance to be started first.
-        */
-       for (j = 0; j < h->highest_lun + 1; j++) {
-               int curr_queue = (start_queue + j) % (h->highest_lun + 1);
-               /* make sure the disk has been added and the drive is real
-                * because this can be called from the middle of init_one.
-                */
-               if (!(h->drv[curr_queue].queue) || !(h->drv[curr_queue].heads))
-                       continue;
-               blk_start_queue(h->gendisk[curr_queue]->queue);
-
-               /* check to see if we have maxed out the number of commands
-                * that can be placed on the queue.
-                */
-               if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS) {
-                       if (curr_queue == start_queue) {
-                               h->next_to_run =
-                                   (start_queue + 1) % (h->highest_lun + 1);
-                               goto cleanup;
-                       } else {
-                               h->next_to_run = curr_queue;
-                               goto cleanup;
-                       }
-               } else {
-                       curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
-               }
-       }
-
-      cleanup:
        spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
        return IRQ_HANDLED;
 }
index 0a1b1ea36ddcdc3064ba4daa35567a01e0f5b72d..bdbade9a5cf50a99e3b2e3fa3f860d71f36bfe82 100644 (file)
@@ -300,6 +300,15 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
                                lo->disk->disk_name, result);
                goto harderror;
        }
+
+       if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
+               printk(KERN_ERR "%s: Wrong magic (0x%lx)\n",
+                               lo->disk->disk_name,
+                               (unsigned long)ntohl(reply.magic));
+               result = -EPROTO;
+               goto harderror;
+       }
+
        req = nbd_find_request(lo, reply.handle);
        if (unlikely(IS_ERR(req))) {
                result = PTR_ERR(req);
@@ -312,13 +321,6 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
                goto harderror;
        }
 
-       if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
-               printk(KERN_ERR "%s: Wrong magic (0x%lx)\n",
-                               lo->disk->disk_name,
-                               (unsigned long)ntohl(reply.magic));
-               result = -EPROTO;
-               goto harderror;
-       }
        if (ntohl(reply.error)) {
                printk(KERN_ERR "%s: Other side returned error (%d)\n",
                                lo->disk->disk_name, ntohl(reply.error));
@@ -339,7 +341,8 @@ static struct request *nbd_read_stat(struct nbd_device *lo)
                                        printk(KERN_ERR "%s: Receive data failed (result %d)\n",
                                                        lo->disk->disk_name,
                                                        result);
-                                       goto harderror;
+                                       req->errors++;
+                                       return req;
                                }
                                dprintk(DBG_RX, "%s: request %p: got %d bytes data\n",
                                        lo->disk->disk_name, req, bvec->bv_len);
index bde2c64b634660b0a49057b127ce5e05a97c8cc1..451b996bba91e53bc934cc54048951015acc9868 100644 (file)
@@ -2577,19 +2577,19 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm
        case PKT_CTRL_CMD_SETUP:
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               mutex_lock(&ctl_mutex);
+               mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
                ret = pkt_setup_dev(&ctrl_cmd);
                mutex_unlock(&ctl_mutex);
                break;
        case PKT_CTRL_CMD_TEARDOWN:
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               mutex_lock(&ctl_mutex);
+               mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
                ret = pkt_remove_dev(&ctrl_cmd);
                mutex_unlock(&ctl_mutex);
                break;
        case PKT_CTRL_CMD_STATUS:
-               mutex_lock(&ctl_mutex);
+               mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
                pkt_get_status(&ctrl_cmd);
                mutex_unlock(&ctl_mutex);
                break;
index be61f22ee7bb3e9a69d452236ef700b1104581e6..d37ced0d132ba3d09bc0e972820dad0c445998e6 100644 (file)
@@ -107,10 +107,14 @@ found:
        if (err) {
                printk(KERN_ERR PFX "RNG registering failed (%d)\n",
                       err);
-               goto out;
+               goto err_unmap;
        }
 out:
        return err;
+
+err_unmap:
+       iounmap(mem);
+       goto out;
 }
 
 static void __exit mod_exit(void)
index 6594bd5645f42928992a8e85d13332169fdf5e85..ccd7e7102234cf09cfda77bdb49db017389d197a 100644 (file)
@@ -164,7 +164,7 @@ static int __init mod_init(void)
        if (err) {
                printk(KERN_ERR PFX "RNG registering failed (%d)\n",
                       err);
-               goto out;
+               goto err_unmap;
        }
 out:
        return err;
index 645eb81cb5a9d6be636fe4eef7dfb6a618ea672f..84e5a68635f12203c361cf837aab3f2bd4fdbca0 100644 (file)
@@ -221,7 +221,6 @@ static struct nsc_gpio_ops pc8736x_gpio_ops = {
        .gpio_change    = pc8736x_gpio_change,
        .gpio_current   = pc8736x_gpio_current
 };
-EXPORT_SYMBOL(pc8736x_gpio_ops);
 
 static int pc8736x_gpio_open(struct inode *inode, struct file *file)
 {
index 498aa37bca221f50a3e3d070e40cbaa7a648a0db..3ece6923134359a9e70c841e8e592b589ea864ab 100644 (file)
@@ -51,6 +51,7 @@ void proc_fork_connector(struct task_struct *task)
        struct cn_msg *msg;
        struct proc_event *ev;
        __u8 buffer[CN_PROC_MSG_SIZE];
+       struct timespec ts;
 
        if (atomic_read(&proc_event_num_listeners) < 1)
                return;
@@ -58,7 +59,8 @@ void proc_fork_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
-       ktime_get_ts(&ev->timestamp); /* get high res monotonic timestamp */
+       ktime_get_ts(&ts); /* get high res monotonic timestamp */
+       ev->timestamp_ns = timespec_to_ns(&ts);
        ev->what = PROC_EVENT_FORK;
        ev->event_data.fork.parent_pid = task->real_parent->pid;
        ev->event_data.fork.parent_tgid = task->real_parent->tgid;
@@ -76,6 +78,7 @@ void proc_exec_connector(struct task_struct *task)
 {
        struct cn_msg *msg;
        struct proc_event *ev;
+       struct timespec ts;
        __u8 buffer[CN_PROC_MSG_SIZE];
 
        if (atomic_read(&proc_event_num_listeners) < 1)
@@ -84,7 +87,8 @@ void proc_exec_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
-       ktime_get_ts(&ev->timestamp);
+       ktime_get_ts(&ts); /* get high res monotonic timestamp */
+       ev->timestamp_ns = timespec_to_ns(&ts);
        ev->what = PROC_EVENT_EXEC;
        ev->event_data.exec.process_pid = task->pid;
        ev->event_data.exec.process_tgid = task->tgid;
@@ -100,6 +104,7 @@ void proc_id_connector(struct task_struct *task, int which_id)
        struct cn_msg *msg;
        struct proc_event *ev;
        __u8 buffer[CN_PROC_MSG_SIZE];
+       struct timespec ts;
 
        if (atomic_read(&proc_event_num_listeners) < 1)
                return;
@@ -118,7 +123,8 @@ void proc_id_connector(struct task_struct *task, int which_id)
        } else
                return;
        get_seq(&msg->seq, &ev->cpu);
-       ktime_get_ts(&ev->timestamp);
+       ktime_get_ts(&ts); /* get high res monotonic timestamp */
+       ev->timestamp_ns = timespec_to_ns(&ts);
 
        memcpy(&msg->id, &cn_proc_event_id, sizeof(msg->id));
        msg->ack = 0; /* not used */
@@ -131,6 +137,7 @@ void proc_exit_connector(struct task_struct *task)
        struct cn_msg *msg;
        struct proc_event *ev;
        __u8 buffer[CN_PROC_MSG_SIZE];
+       struct timespec ts;
 
        if (atomic_read(&proc_event_num_listeners) < 1)
                return;
@@ -138,7 +145,8 @@ void proc_exit_connector(struct task_struct *task)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        get_seq(&msg->seq, &ev->cpu);
-       ktime_get_ts(&ev->timestamp);
+       ktime_get_ts(&ts); /* get high res monotonic timestamp */
+       ev->timestamp_ns = timespec_to_ns(&ts);
        ev->what = PROC_EVENT_EXIT;
        ev->event_data.exit.process_pid = task->pid;
        ev->event_data.exit.process_tgid = task->tgid;
@@ -164,6 +172,7 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
        struct cn_msg *msg;
        struct proc_event *ev;
        __u8 buffer[CN_PROC_MSG_SIZE];
+       struct timespec ts;
 
        if (atomic_read(&proc_event_num_listeners) < 1)
                return;
@@ -171,7 +180,8 @@ static void cn_proc_ack(int err, int rcvd_seq, int rcvd_ack)
        msg = (struct cn_msg*)buffer;
        ev = (struct proc_event*)msg->data;
        msg->seq = rcvd_seq;
-       ktime_get_ts(&ev->timestamp);
+       ktime_get_ts(&ts); /* get high res monotonic timestamp */
+       ev->timestamp_ns = timespec_to_ns(&ts);
        ev->cpu = -1;
        ev->what = PROC_EVENT_NONE;
        ev->event_data.ack.err = err;
index 8d328186f774b81cfdd1eabf5c01d244f50115be..bc1088d9b379a97843c58b050f046b8b0df023f5 100644 (file)
@@ -364,10 +364,12 @@ static ssize_t store_##file_name                                  \
        if (ret != 1)                                                   \
                return -EINVAL;                                         \
                                                                        \
+       lock_cpu_hotplug();                                             \
        mutex_lock(&policy->lock);                                      \
        ret = __cpufreq_set_policy(policy, &new_policy);                \
        policy->user_policy.object = policy->object;                    \
        mutex_unlock(&policy->lock);                                    \
+       unlock_cpu_hotplug();                                           \
                                                                        \
        return ret ? ret : count;                                       \
 }
@@ -1197,20 +1199,18 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier);
  *********************************************************************/
 
 
+/* Must be called with lock_cpu_hotplug held */
 int __cpufreq_driver_target(struct cpufreq_policy *policy,
                            unsigned int target_freq,
                            unsigned int relation)
 {
        int retval = -EINVAL;
 
-       lock_cpu_hotplug();
        dprintk("target for CPU %u: %u kHz, relation %u\n", policy->cpu,
                target_freq, relation);
        if (cpu_online(policy->cpu) && cpufreq_driver->target)
                retval = cpufreq_driver->target(policy, target_freq, relation);
 
-       unlock_cpu_hotplug();
-
        return retval;
 }
 EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
@@ -1225,17 +1225,23 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
        if (!policy)
                return -EINVAL;
 
+       lock_cpu_hotplug();
        mutex_lock(&policy->lock);
 
        ret = __cpufreq_driver_target(policy, target_freq, relation);
 
        mutex_unlock(&policy->lock);
+       unlock_cpu_hotplug();
 
        cpufreq_cpu_put(policy);
        return ret;
 }
 EXPORT_SYMBOL_GPL(cpufreq_driver_target);
 
+/*
+ * Locking: Must be called with the lock_cpu_hotplug() lock held
+ * when "event" is CPUFREQ_GOV_LIMITS
+ */
 
 static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
 {
@@ -1257,24 +1263,6 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
 }
 
 
-int cpufreq_governor(unsigned int cpu, unsigned int event)
-{
-       int ret = 0;
-       struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
-
-       if (!policy)
-               return -EINVAL;
-
-       mutex_lock(&policy->lock);
-       ret = __cpufreq_governor(policy, event);
-       mutex_unlock(&policy->lock);
-
-       cpufreq_cpu_put(policy);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(cpufreq_governor);
-
-
 int cpufreq_register_governor(struct cpufreq_governor *governor)
 {
        struct cpufreq_governor *t;
@@ -1342,6 +1330,9 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
 EXPORT_SYMBOL(cpufreq_get_policy);
 
 
+/*
+ * Locking: Must be called with the lock_cpu_hotplug() lock held
+ */
 static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy)
 {
        int ret = 0;
@@ -1436,6 +1427,8 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
        if (!data)
                return -EINVAL;
 
+       lock_cpu_hotplug();
+
        /* lock this CPU */
        mutex_lock(&data->lock);
 
@@ -1446,6 +1439,8 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
        data->user_policy.governor = data->governor;
 
        mutex_unlock(&data->lock);
+
+       unlock_cpu_hotplug();
        cpufreq_cpu_put(data);
 
        return ret;
@@ -1469,6 +1464,7 @@ int cpufreq_update_policy(unsigned int cpu)
        if (!data)
                return -ENODEV;
 
+       lock_cpu_hotplug();
        mutex_lock(&data->lock);
 
        dprintk("updating policy for CPU %u\n", cpu);
@@ -1494,7 +1490,7 @@ int cpufreq_update_policy(unsigned int cpu)
        ret = __cpufreq_set_policy(data, &policy);
 
        mutex_unlock(&data->lock);
-
+       unlock_cpu_hotplug();
        cpufreq_cpu_put(data);
        return ret;
 }
index b3ebc8f019753db87d072914b1d699e9f36c85eb..c4c578defabfa0e5df0251d430fde58fee7d45ab 100644 (file)
@@ -525,7 +525,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                break;
 
        case CPUFREQ_GOV_LIMITS:
-               lock_cpu_hotplug();
                mutex_lock(&dbs_mutex);
                if (policy->max < this_dbs_info->cur_policy->cur)
                        __cpufreq_driver_target(
@@ -536,7 +535,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                                        this_dbs_info->cur_policy,
                                        policy->min, CPUFREQ_RELATION_L);
                mutex_unlock(&dbs_mutex);
-               unlock_cpu_hotplug();
                break;
        }
        return 0;
index 178f0c547eb7ac928fcdce0d0f0edd3da73c4c70..52cf1f02182591f64f527144e1e3a1394ee9a050 100644 (file)
@@ -309,7 +309,9 @@ static void do_dbs_timer(void *data)
        if (!dbs_info->enable)
                return;
 
+       lock_cpu_hotplug();
        dbs_check_cpu(dbs_info);
+       unlock_cpu_hotplug();
        queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work,
                        usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
 }
@@ -412,7 +414,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                break;
 
        case CPUFREQ_GOV_LIMITS:
-               lock_cpu_hotplug();
                mutex_lock(&dbs_mutex);
                if (policy->max < this_dbs_info->cur_policy->cur)
                        __cpufreq_driver_target(this_dbs_info->cur_policy,
@@ -423,7 +424,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                                                policy->min,
                                                CPUFREQ_RELATION_L);
                mutex_unlock(&dbs_mutex);
-               unlock_cpu_hotplug();
                break;
        }
        return 0;
index 44ae5e5b94cf4a30f4d1ab18287f72ec28caadb1..a06c204589cdf7c9f8e0e68e38c337f1535ace66 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <linux/cpufreq.h>
+#include <linux/cpu.h>
 #include <linux/types.h>
 #include <linux/fs.h>
 #include <linux/sysfs.h>
@@ -70,6 +71,7 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy)
 
        dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
 
+       lock_cpu_hotplug();
        mutex_lock(&userspace_mutex);
        if (!cpu_is_managed[policy->cpu])
                goto err;
@@ -92,6 +94,7 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy)
 
  err:
        mutex_unlock(&userspace_mutex);
+       unlock_cpu_hotplug();
        return ret;
 }
 
index 53bba41f29bcc75459f9147d2012dfbfd394196a..b6fb167e20f681980a54c9baa7ef14a0de4fea83 100644 (file)
@@ -682,6 +682,7 @@ config BLK_DEV_SVWKS
 config BLK_DEV_SGIIOC4
        tristate "Silicon Graphics IOC4 chipset ATA/ATAPI support"
        depends on (IA64_SGI_SN2 || IA64_GENERIC) && SGI_IOC4
+       select IDEPCI_SHARE_IRQ
        help
          This driver adds PIO & MultiMode DMA-2 support for the SGI IOC4
          chipset, which has one channel and can support two devices.
index f712e4cfd9dcb7eb1dafba2dc59f7e1c584f80f2..7cf3eb02352140d8f8558533aee4107c8fd1a445 100644 (file)
@@ -776,7 +776,7 @@ static void update_ordered(ide_drive_t *drive)
                 * not available so we don't need to recheck that.
                 */
                capacity = idedisk_capacity(drive);
-               barrier = ide_id_has_flush_cache(id) &&
+               barrier = ide_id_has_flush_cache(id) && !drive->noflush &&
                        (drive->addressing == 0 || capacity <= (1ULL << 28) ||
                         ide_id_has_flush_cache_ext(id));
 
index 98918fb6b2ce32a8854fa4c05068e2fc9ad184c4..7c3a13e1cf647a4cbca6ee39c327c36f9de8d422 100644 (file)
@@ -750,7 +750,7 @@ void ide_dma_verbose(ide_drive_t *drive)
                        goto bug_dma_off;
                printk(", DMA");
        } else if (id->field_valid & 1) {
-               printk(", BUG");
+               goto bug_dma_off;
        }
        return;
 bug_dma_off:
index 657165297dc76c0a16bd2126b854920ffbf99cbe..77703acaec1731164c433d7ce35d2eda0ba15293 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/hdreg.h>
 #include <linux/ide.h>
 #include <linux/bitops.h>
+#include <linux/nmi.h>
 
 #include <asm/byteorder.h>
 #include <asm/irq.h>
@@ -1243,6 +1244,7 @@ int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout)
                if (stat == 0xff)
                        return -ENODEV;
                touch_softlockup_watchdog();
+               touch_nmi_watchdog();
        }
        return -EBUSY;
 }
index 05fbd9298db7c7cd5e265a8d9a65a994ec1c81f5..defd4b4bd37488ab38198e8ab86f963c438e2809 100644 (file)
@@ -1539,7 +1539,7 @@ static int __init ide_setup(char *s)
                const char *hd_words[] = {
                        "none", "noprobe", "nowerr", "cdrom", "serialize",
                        "autotune", "noautotune", "minus8", "swapdata", "bswap",
-                       "minus11", "remap", "remap63", "scsi", NULL };
+                       "noflush", "remap", "remap63", "scsi", NULL };
                unit = s[2] - 'a';
                hw   = unit / MAX_DRIVES;
                unit = unit % MAX_DRIVES;
@@ -1578,6 +1578,9 @@ static int __init ide_setup(char *s)
                        case -10: /* "bswap" */
                                drive->bswap = 1;
                                goto done;
+                       case -11: /* noflush */
+                               drive->noflush = 1;
+                               goto done;
                        case -12: /* "remap" */
                                drive->remap_0_to_1 = 1;
                                goto done;
index 3cb04424d351dcb9f88e0163a120ea103983b19c..e9bad185968a8e289cd28f2844ac2578b6727373 100644 (file)
@@ -498,9 +498,14 @@ static int config_chipset_for_dma (ide_drive_t *drive)
 {
        u8 speed        = ide_dma_speed(drive, it821x_ratemask(drive));
 
-       config_it821x_chipset_for_pio(drive, !speed);
-       it821x_tune_chipset(drive, speed);
-       return ide_dma_enable(drive);
+       if (speed) {
+               config_it821x_chipset_for_pio(drive, 0);
+               it821x_tune_chipset(drive, speed);
+
+               return ide_dma_enable(drive);
+       }
+
+       return 0;
 }
 
 /**
index 44708b5e582ddecb1fe1774030f8cd865f37446c..d5d649f5ccdb3a05f14309fd1e11af83c7486a9f 100644 (file)
@@ -124,8 +124,6 @@ config PMAC_BACKLIGHT
        bool "Backlight control for LCD screens"
        depends on ADB_PMU && FB = y && (BROKEN || !PPC64)
        select FB_BACKLIGHT
-       select BACKLIGHT_CLASS_DEVICE
-       select BACKLIGHT_LCD_SUPPORT
        help
          Say Y here to enable Macintosh specific extensions of the generic
          backlight code. With this enabled, the brightness keys on older
index 545be1ed692783035d190b2d3a884808db11515f..c69d23bb255e54683357eed0026aaa0040e999d7 100644 (file)
 #include <linux/pmu.h>
 
 #include <asm/machdep.h>
+#include <asm/backlight.h>
 #ifdef CONFIG_PPC_PMAC
 #include <asm/pmac_feature.h>
 #endif
 
-#ifdef CONFIG_PMAC_BACKLIGHT
-#include <asm/backlight.h>
-#endif
-
 MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
 
 #define KEYB_KEYREG    0       /* register # for key up/down data */
@@ -237,11 +234,6 @@ static struct adb_ids keyboard_ids;
 static struct adb_ids mouse_ids;
 static struct adb_ids buttons_ids;
 
-#ifdef CONFIG_PMAC_BACKLIGHT
-/* Exported to via-pmu.c */
-int disable_kernel_backlight = 0;
-#endif /* CONFIG_PMAC_BACKLIGHT */
-
 /* Kind of keyboard, see Apple technote 1152  */
 #define ADB_KEYBOARD_UNKNOWN   0
 #define ADB_KEYBOARD_ANSI      0x0100
@@ -527,7 +519,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto
 
                case 0xa:       /* brightness decrease */
 #ifdef CONFIG_PMAC_BACKLIGHT
-                       if (!disable_kernel_backlight && down)
+                       if (down)
                                pmac_backlight_key_down();
 #endif
                        input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
@@ -535,7 +527,7 @@ adbhid_buttons_input(unsigned char *data, int nb, struct pt_regs *regs, int auto
 
                case 0x9:       /* brightness increase */
 #ifdef CONFIG_PMAC_BACKLIGHT
-                       if (!disable_kernel_backlight && down)
+                       if (down)
                                pmac_backlight_key_up();
 #endif
                        input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down);
index b42d05f2aaff60c1d8f6ab50d44f0a4b1eb62a49..d3f8d75bcbb434cae0cf091901444e2d396df495 100644 (file)
@@ -15,8 +15,9 @@
 
 #define MAX_PMU_LEVEL 0xFF
 
-static struct device_node *vias;
 static struct backlight_properties pmu_backlight_data;
+static spinlock_t pmu_backlight_lock;
+static int sleeping;
 
 static int pmu_backlight_get_level_brightness(struct fb_info *info,
                int level)
@@ -40,23 +41,36 @@ static int pmu_backlight_update_status(struct backlight_device *bd)
 {
        struct fb_info *info = class_get_devdata(&bd->class_dev);
        struct adb_request req;
-       int pmulevel, level = bd->props->brightness;
+       unsigned long flags;
+       int level = bd->props->brightness;
 
-       if (vias == NULL)
-               return -ENODEV;
+       spin_lock_irqsave(&pmu_backlight_lock, flags);
+
+       /* Don't update brightness when sleeping */
+       if (sleeping)
+               goto out;
 
        if (bd->props->power != FB_BLANK_UNBLANK ||
            bd->props->fb_blank != FB_BLANK_UNBLANK)
                level = 0;
 
-       pmulevel = pmu_backlight_get_level_brightness(info, level);
+       if (level > 0) {
+               int pmulevel = pmu_backlight_get_level_brightness(info, level);
 
-       pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel);
-       pmu_wait_complete(&req);
+               pmu_request(&req, NULL, 2, PMU_BACKLIGHT_BRIGHT, pmulevel);
+               pmu_wait_complete(&req);
 
-       pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
-               PMU_POW_BACKLIGHT | (level > 0 ? PMU_POW_ON : PMU_POW_OFF));
-       pmu_wait_complete(&req);
+               pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
+                       PMU_POW_BACKLIGHT | PMU_POW_ON);
+               pmu_wait_complete(&req);
+       } else {
+               pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
+                       PMU_POW_BACKLIGHT | PMU_POW_OFF);
+               pmu_wait_complete(&req);
+       }
+
+out:
+       spin_unlock_irqrestore(&pmu_backlight_lock, flags);
 
        return 0;
 }
@@ -73,15 +87,39 @@ static struct backlight_properties pmu_backlight_data = {
        .max_brightness = (FB_BACKLIGHT_LEVELS - 1),
 };
 
-void __init pmu_backlight_init(struct device_node *in_vias)
+#ifdef CONFIG_PM
+static int pmu_backlight_sleep_call(struct pmu_sleep_notifier *self, int when)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&pmu_backlight_lock, flags);
+
+       switch (when) {
+       case PBOOK_SLEEP_REQUEST:
+               sleeping = 1;
+               break;
+       case PBOOK_WAKE:
+               sleeping = 0;
+               break;
+       }
+
+       spin_unlock_irqrestore(&pmu_backlight_lock, flags);
+
+       return PBOOK_SLEEP_OK;
+}
+
+static struct pmu_sleep_notifier pmu_backlight_sleep_notif = {
+       .notifier_call = pmu_backlight_sleep_call,
+};
+#endif
+
+void __init pmu_backlight_init()
 {
        struct backlight_device *bd;
        struct fb_info *info;
        char name[10];
        int level, autosave;
 
-       vias = in_vias;
-
        /* Special case for the old PowerBook since I can't test on it */
        autosave =
                machine_is_compatible("AAPL,3400/2400") ||
@@ -141,6 +179,10 @@ void __init pmu_backlight_init(struct device_node *in_vias)
                pmac_backlight = bd;
        mutex_unlock(&pmac_backlight_mutex);
 
+#ifdef CONFIG_PM
+       pmu_register_sleep_notifier(&pmu_backlight_sleep_notif);
+#endif
+
        printk("pmubl: Backlight initialized (%s)\n", name);
 
        return;
index 06ca80bfd6b98442dfce7c532d33a6d8a9e4ced0..ea386801e215976ae002604f070c01ba9a224d1f 100644 (file)
@@ -16,7 +16,6 @@
  *    a sleep or a freq. switch
  *  - Move sleep code out of here to pmac_pm, merge into new
  *    common PM infrastructure
- *  - Move backlight code out as well
  *  - Save/Restore PCI space properly
  *
  */
@@ -60,9 +59,7 @@
 #include <asm/mmu_context.h>
 #include <asm/cputable.h>
 #include <asm/time.h>
-#ifdef CONFIG_PMAC_BACKLIGHT
 #include <asm/backlight.h>
-#endif
 
 #include "via-pmu-event.h"
 
@@ -177,10 +174,6 @@ static int query_batt_timer = BATTERY_POLLING_COUNT;
 static struct adb_request batt_req;
 static struct proc_dir_entry *proc_pmu_batt[PMU_MAX_BATTERIES];
 
-#if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
-extern int disable_kernel_backlight;
-#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */
-
 int __fake_sleep;
 int asleep;
 BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
@@ -466,7 +459,7 @@ static int __init via_pmu_dev_init(void)
 
 #ifdef CONFIG_PMAC_BACKLIGHT
        /* Initialize backlight */
-       pmu_backlight_init(vias);
+       pmu_backlight_init();
 #endif
 
 #ifdef CONFIG_PPC32
@@ -1403,11 +1396,8 @@ next:
        else if ((1 << pirq) & PMU_INT_SNDBRT) {
 #ifdef CONFIG_PMAC_BACKLIGHT
                if (len == 3)
-#ifdef CONFIG_INPUT_ADBHID
-                       if (!disable_kernel_backlight)
-#endif /* CONFIG_INPUT_ADBHID */
-                               pmac_backlight_set_legacy_brightness(data[1] >> 4);
-#endif /* CONFIG_PMAC_BACKLIGHT */
+                       pmac_backlight_set_legacy_brightness_pmu(data[1] >> 4);
+#endif
        }
        /* Tick interrupt */
        else if ((1 << pirq) & PMU_INT_TICK) {
@@ -2414,7 +2404,7 @@ struct pmu_private {
        spinlock_t lock;
 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
        int     backlight_locker;
-#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */    
+#endif
 };
 
 static LIST_HEAD(all_pmu_pvt);
@@ -2464,7 +2454,7 @@ pmu_open(struct inode *inode, struct file *file)
        spin_lock_irqsave(&all_pvt_lock, flags);
 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
        pp->backlight_locker = 0;
-#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */    
+#endif
        list_add(&pp->list, &all_pmu_pvt);
        spin_unlock_irqrestore(&all_pvt_lock, flags);
        file->private_data = pp;
@@ -2559,13 +2549,12 @@ pmu_release(struct inode *inode, struct file *file)
                spin_lock_irqsave(&all_pvt_lock, flags);
                list_del(&pp->list);
                spin_unlock_irqrestore(&all_pvt_lock, flags);
+
 #if defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT)
-               if (pp->backlight_locker) {
-                       spin_lock_irqsave(&pmu_lock, flags);
-                       disable_kernel_backlight--;
-                       spin_unlock_irqrestore(&pmu_lock, flags);
-               }
-#endif /* defined(CONFIG_INPUT_ADBHID) && defined(CONFIG_PMAC_BACKLIGHT) */
+               if (pp->backlight_locker)
+                       pmac_backlight_enable();
+#endif
+
                kfree(pp);
        }
        unlock_kernel();
@@ -2642,18 +2631,18 @@ pmu_ioctl(struct inode * inode, struct file *filp,
 #ifdef CONFIG_INPUT_ADBHID
        case PMU_IOC_GRAB_BACKLIGHT: {
                struct pmu_private *pp = filp->private_data;
-               unsigned long flags;
 
                if (pp->backlight_locker)
                        return 0;
+
                pp->backlight_locker = 1;
-               spin_lock_irqsave(&pmu_lock, flags);
-               disable_kernel_backlight++;
-               spin_unlock_irqrestore(&pmu_lock, flags);
+               pmac_backlight_disable();
+
                return 0;
        }
 #endif /* CONFIG_INPUT_ADBHID */
 #endif /* CONFIG_PMAC_BACKLIGHT_LEGACY */
+
        case PMU_IOC_GET_MODEL:
                return put_user(pmu_kind, argp);
        case PMU_IOC_HAS_ADB:
index 07ca9480a6fe7fc892b32b87e49d9065aac9a695..c3e52c806b13c3f9607e7a217cac354c7e0bce56 100644 (file)
@@ -620,7 +620,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp)
                return -ENXIO;
        }
        dev_info(&mgp->pdev->dev, "handoff confirmed\n");
-       myri10ge_dummy_rdma(mgp, mgp->tx.boundary != 4096);
+       myri10ge_dummy_rdma(mgp, 1);
 
        return 0;
 }
index 82200bfaa8ed2bb5bef5ea7f959d1a183887f234..7de9a07b2ac2defb1c45311c21b5348952bb82f5 100644 (file)
@@ -516,10 +516,7 @@ static int skge_set_pauseparam(struct net_device *dev,
 /* Chip internal frequency for clock calculations */
 static inline u32 hwkhz(const struct skge_hw *hw)
 {
-       if (hw->chip_id == CHIP_ID_GENESIS)
-               return 53215; /* or:  53.125 MHz */
-       else
-               return 78215; /* or:  78.125 MHz */
+       return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125;
 }
 
 /* Chip HZ to microseconds */
index 1ef9fd39a79a9cfc3b1dacb6235088a0c0525e5d..0e3fdf7c6dd3a8cf321a063d61876a39d58b2c1d 100644 (file)
@@ -1537,7 +1537,7 @@ static int __init sparc_lance_init(void)
 {
        if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) ||
            (idprom->id_machtype == (SM_SUN4|SM_4_470))) {
-               memset(&sun4_sdev, 0, sizeof(sdev));
+               memset(&sun4_sdev, 0, sizeof(struct sbus_dev));
                sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr;
                sun4_sdev.irqs[0] = 6;
                return sparc_lance_probe_one(&sun4_sdev, NULL, NULL);
@@ -1547,16 +1547,16 @@ static int __init sparc_lance_init(void)
 
 static int __exit sunlance_sun4_remove(void)
 {
-       struct lance_private *lp = dev_get_drvdata(&sun4_sdev->dev);
+       struct lance_private *lp = dev_get_drvdata(&sun4_sdev.ofdev.dev);
        struct net_device *net_dev = lp->dev;
 
        unregister_netdevice(net_dev);
 
-       lance_free_hwresources(root_lance_dev);
+       lance_free_hwresources(lp);
 
        free_netdev(net_dev);
 
-       dev_set_drvdata(&sun4_sdev->dev, NULL);
+       dev_set_drvdata(&sun4_sdev.ofdev.dev, NULL);
 
        return 0;
 }
index ce6f3be86da00b77e363d426eb7562c962c35121..1b8138f641e3e6023250500fa46f7e5ccb55afdd 100644 (file)
@@ -68,8 +68,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.62"
-#define DRV_MODULE_RELDATE     "June 30, 2006"
+#define DRV_MODULE_VERSION     "3.63"
+#define DRV_MODULE_RELDATE     "July 25, 2006"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
@@ -3590,6 +3590,28 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
 static int tg3_init_hw(struct tg3 *, int);
 static int tg3_halt(struct tg3 *, int, int);
 
+/* Restart hardware after configuration changes, self-test, etc.
+ * Invoked with tp->lock held.
+ */
+static int tg3_restart_hw(struct tg3 *tp, int reset_phy)
+{
+       int err;
+
+       err = tg3_init_hw(tp, reset_phy);
+       if (err) {
+               printk(KERN_ERR PFX "%s: Failed to re-initialize device, "
+                      "aborting.\n", tp->dev->name);
+               tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
+               tg3_full_unlock(tp);
+               del_timer_sync(&tp->timer);
+               tp->irq_sync = 0;
+               netif_poll_enable(tp->dev);
+               dev_close(tp->dev);
+               tg3_full_lock(tp, 0);
+       }
+       return err;
+}
+
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void tg3_poll_controller(struct net_device *dev)
 {
@@ -3630,13 +3652,15 @@ static void tg3_reset_task(void *_data)
        }
 
        tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
-       tg3_init_hw(tp, 1);
+       if (tg3_init_hw(tp, 1))
+               goto out;
 
        tg3_netif_start(tp);
 
        if (restart_timer)
                mod_timer(&tp->timer, jiffies + 1);
 
+out:
        tp->tg3_flags &= ~TG3_FLAG_IN_RESET_TASK;
 
        tg3_full_unlock(tp);
@@ -4124,6 +4148,7 @@ static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp,
 static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct tg3 *tp = netdev_priv(dev);
+       int err;
 
        if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU(tp))
                return -EINVAL;
@@ -4144,13 +4169,14 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
 
        tg3_set_mtu(dev, tp, new_mtu);
 
-       tg3_init_hw(tp, 0);
+       err = tg3_restart_hw(tp, 0);
 
-       tg3_netif_start(tp);
+       if (!err)
+               tg3_netif_start(tp);
 
        tg3_full_unlock(tp);
 
-       return 0;
+       return err;
 }
 
 /* Free up pending packets in all rx/tx rings.
@@ -4232,7 +4258,7 @@ static void tg3_free_rings(struct tg3 *tp)
  * end up in the driver.  tp->{tx,}lock are held and thus
  * we may not sleep.
  */
-static void tg3_init_rings(struct tg3 *tp)
+static int tg3_init_rings(struct tg3 *tp)
 {
        u32 i;
 
@@ -4281,18 +4307,38 @@ static void tg3_init_rings(struct tg3 *tp)
 
        /* Now allocate fresh SKBs for each rx ring. */
        for (i = 0; i < tp->rx_pending; i++) {
-               if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD,
-                                    -1, i) < 0)
+               if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_STD, -1, i) < 0) {
+                       printk(KERN_WARNING PFX
+                              "%s: Using a smaller RX standard ring, "
+                              "only %d out of %d buffers were allocated "
+                              "successfully.\n",
+                              tp->dev->name, i, tp->rx_pending);
+                       if (i == 0)
+                               return -ENOMEM;
+                       tp->rx_pending = i;
                        break;
+               }
        }
 
        if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) {
                for (i = 0; i < tp->rx_jumbo_pending; i++) {
                        if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO,
-                                            -1, i) < 0)
+                                            -1, i) < 0) {
+                               printk(KERN_WARNING PFX
+                                      "%s: Using a smaller RX jumbo ring, "
+                                      "only %d out of %d buffers were "
+                                      "allocated successfully.\n",
+                                      tp->dev->name, i, tp->rx_jumbo_pending);
+                               if (i == 0) {
+                                       tg3_free_rings(tp);
+                                       return -ENOMEM;
+                               }
+                               tp->rx_jumbo_pending = i;
                                break;
+                       }
                }
        }
+       return 0;
 }
 
 /*
@@ -5815,6 +5861,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
 {
        struct tg3 *tp = netdev_priv(dev);
        struct sockaddr *addr = p;
+       int err = 0;
 
        if (!is_valid_ether_addr(addr->sa_data))
                return -EINVAL;
@@ -5832,9 +5879,9 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
                tg3_full_lock(tp, 1);
 
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               tg3_init_hw(tp, 0);
-
-               tg3_netif_start(tp);
+               err = tg3_restart_hw(tp, 0);
+               if (!err)
+                       tg3_netif_start(tp);
                tg3_full_unlock(tp);
        } else {
                spin_lock_bh(&tp->lock);
@@ -5842,7 +5889,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
                spin_unlock_bh(&tp->lock);
        }
 
-       return 0;
+       return err;
 }
 
 /* tp->lock is held. */
@@ -5942,7 +5989,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
         * can only do this after the hardware has been
         * successfully reset.
         */
-       tg3_init_rings(tp);
+       err = tg3_init_rings(tp);
+       if (err)
+               return err;
 
        /* This value is determined during the probe time DMA
         * engine test, tg3_test_dma.
@@ -7956,7 +8005,7 @@ static void tg3_get_ringparam(struct net_device *dev, struct ethtool_ringparam *
 static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering)
 {
        struct tg3 *tp = netdev_priv(dev);
-       int irq_sync = 0;
+       int irq_sync = 0, err = 0;
   
        if ((ering->rx_pending > TG3_RX_RING_SIZE - 1) ||
            (ering->rx_jumbo_pending > TG3_RX_JUMBO_RING_SIZE - 1) ||
@@ -7980,13 +8029,14 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
 
        if (netif_running(dev)) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               tg3_init_hw(tp, 1);
-               tg3_netif_start(tp);
+               err = tg3_restart_hw(tp, 1);
+               if (!err)
+                       tg3_netif_start(tp);
        }
 
        tg3_full_unlock(tp);
   
-       return 0;
+       return err;
 }
   
 static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
@@ -8001,7 +8051,7 @@ static void tg3_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam
 static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause)
 {
        struct tg3 *tp = netdev_priv(dev);
-       int irq_sync = 0;
+       int irq_sync = 0, err = 0;
   
        if (netif_running(dev)) {
                tg3_netif_stop(tp);
@@ -8025,13 +8075,14 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
 
        if (netif_running(dev)) {
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
-               tg3_init_hw(tp, 1);
-               tg3_netif_start(tp);
+               err = tg3_restart_hw(tp, 1);
+               if (!err)
+                       tg3_netif_start(tp);
        }
 
        tg3_full_unlock(tp);
   
-       return 0;
+       return err;
 }
   
 static u32 tg3_get_rx_csum(struct net_device *dev)
@@ -8666,7 +8717,9 @@ static int tg3_test_loopback(struct tg3 *tp)
        if (!netif_running(tp->dev))
                return TG3_LOOPBACK_FAILED;
 
-       tg3_reset_hw(tp, 1);
+       err = tg3_reset_hw(tp, 1);
+       if (err)
+               return TG3_LOOPBACK_FAILED;
 
        if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
                err |= TG3_MAC_LOOPBACK_FAILED;
@@ -8740,8 +8793,8 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
                tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
                if (netif_running(dev)) {
                        tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-                       tg3_init_hw(tp, 1);
-                       tg3_netif_start(tp);
+                       if (!tg3_restart_hw(tp, 1))
+                               tg3_netif_start(tp);
                }
 
                tg3_full_unlock(tp);
@@ -11699,7 +11752,8 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
                tg3_full_lock(tp, 0);
 
                tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-               tg3_init_hw(tp, 1);
+               if (tg3_restart_hw(tp, 1))
+                       goto out;
 
                tp->timer.expires = jiffies + tp->timer_offset;
                add_timer(&tp->timer);
@@ -11707,6 +11761,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
                netif_device_attach(dev);
                tg3_netif_start(tp);
 
+out:
                tg3_full_unlock(tp);
        }
 
@@ -11733,16 +11788,19 @@ static int tg3_resume(struct pci_dev *pdev)
        tg3_full_lock(tp, 0);
 
        tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
-       tg3_init_hw(tp, 1);
+       err = tg3_restart_hw(tp, 1);
+       if (err)
+               goto out;
 
        tp->timer.expires = jiffies + tp->timer_offset;
        add_timer(&tp->timer);
 
        tg3_netif_start(tp);
 
+out:
        tg3_full_unlock(tp);
 
-       return 0;
+       return err;
 }
 
 static struct pci_driver tg3_driver = {
index f5b0078eb4adf471ca0397d55fe165bf7d6503f3..aa9cd92f46b2dbbb51716416acd4f26d503aca1c 100644 (file)
@@ -2742,7 +2742,7 @@ static u32 check_connection_type(struct mac_regs __iomem * regs)
 
        if (PHYSR0 & PHYSR0_SPDG)
                status |= VELOCITY_SPEED_1000;
-       if (PHYSR0 & PHYSR0_SPD10)
+       else if (PHYSR0 & PHYSR0_SPD10)
                status |= VELOCITY_SPEED_10;
        else
                status |= VELOCITY_SPEED_100;
@@ -2851,8 +2851,17 @@ static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd
        u32 status;
        status = check_connection_type(vptr->mac_regs);
 
-       cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg | SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full;
-       if (status & VELOCITY_SPEED_100)
+       cmd->supported = SUPPORTED_TP |
+                       SUPPORTED_Autoneg |
+                       SUPPORTED_10baseT_Half |
+                       SUPPORTED_10baseT_Full |
+                       SUPPORTED_100baseT_Half |
+                       SUPPORTED_100baseT_Full |
+                       SUPPORTED_1000baseT_Half |
+                       SUPPORTED_1000baseT_Full;
+       if (status & VELOCITY_SPEED_1000)
+               cmd->speed = SPEED_1000;
+       else if (status & VELOCITY_SPEED_100)
                cmd->speed = SPEED_100;
        else
                cmd->speed = SPEED_10;
@@ -2896,7 +2905,7 @@ static u32 velocity_get_link(struct net_device *dev)
 {
        struct velocity_info *vptr = netdev_priv(dev);
        struct mac_regs __iomem * regs = vptr->mac_regs;
-       return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, &regs->PHYSR0)  ? 0 : 1;
+       return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, &regs->PHYSR0) ? 1 : 0;
 }
 
 static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
index fa9d2c4edc93eeda6fe7520036d228f6df0c7c9e..2e8ac995d56f0b404a98ed4f24e9b2cc549750c5 100644 (file)
@@ -447,6 +447,7 @@ config AIRO_CS
        tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
        depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
        select CRYPTO
+       select CRYPTO_AES
        ---help---
          This is the standard Linux driver to support Cisco/Aironet PCMCIA
          802.11 wireless cards.  This driver is the same as the Aironet
index 3889f79e7128b1e5ab0bc1566d3d936c9c394395..df317c1e12a89df16d84ce861ffac7d302cea8ad 100644 (file)
@@ -3701,7 +3701,7 @@ static void bcm43xx_ieee80211_set_security(struct net_device *net_dev,
        }
        if (sec->flags & SEC_AUTH_MODE) {
                secinfo->auth_mode = sec->auth_mode;
-               dprintk(", .auth_mode = %d\n", sec->auth_mode);
+               dprintk(", .auth_mode = %d", sec->auth_mode);
        }
        dprintk("\n");
        if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED &&
index d6ed5781b93a8cf6ffce52cabd4ba3e01847acc5..317ace7f9aae3af7191323c45953f9416875ed3b 100644 (file)
@@ -2875,7 +2875,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        if (orinoco_lock(priv, &flags) != 0)
                return -EBUSY;
 
-       if (erq->pointer) {
+       if (erq->length > 0) {
                if ((index < 0) || (index >= ORINOCO_MAX_KEYS))
                        index = priv->tx_key;
 
@@ -2918,7 +2918,7 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev,
        if (erq->flags & IW_ENCODE_RESTRICTED)
                restricted = 1;
 
-       if (erq->pointer) {
+       if (erq->pointer && erq->length > 0) {
                priv->keys[index].len = cpu_to_le16(xlen);
                memset(priv->keys[index].data, 0,
                       sizeof(priv->keys[index].data));
index 662ecc8a33ff9f6559a32c8dff38d25ff5b793ad..c52e9bcf8d02f3fc688de9d7f1c17c49b51c9288 100644 (file)
@@ -1820,6 +1820,8 @@ static int zd1201_probe(struct usb_interface *interface,
            zd->dev->name);
 
        usb_set_intfdata(interface, zd);
+       zd1201_enable(zd);      /* zd1201 likes to startup enabled, */
+       zd1201_disable(zd);     /* interfering with all the wifis in range */
        return 0;
 
 err_net:
index 622b3f8ba820d25e9f6bbcf1b1d83eb9eb60a765..f8ae2b7db0a718b1ec22edb6aabbe68f7845a82d 100644 (file)
@@ -61,7 +61,7 @@ struct pci_bus * __devinit pci_find_bus(int domain, int busnr)
  * @from: Previous PCI bus found, or %NULL for new search.
  *
  * Iterates through the list of known PCI busses.  A new search is
- * initiated by passing %NULL to the @from argument.  Otherwise if
+ * initiated by passing %NULL as the @from argument.  Otherwise if
  * @from is not %NULL, searches continue from next device on the
  * global list.
  */
@@ -148,13 +148,14 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn)
  * @from: Previous PCI device found in search, or %NULL for new search.
  *
  * Iterates through the list of known PCI devices.  If a PCI device is
- * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
- * device structure is returned.  Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL to the @from argument.
- * Otherwise if @from is not %NULL, searches continue from next device on the global list.
+ * found with a matching @vendor, @device, @ss_vendor and @ss_device, a
+ * pointer to its device structure is returned.  Otherwise, %NULL is returned.
+ * A new search is initiated by passing %NULL as the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from next device
+ * on the global list.
  *
- * NOTE: Do not use this function anymore, use pci_get_subsys() instead, as
- * the pci device returned by this function can disappear at any moment in
+ * NOTE: Do not use this function any more; use pci_get_subsys() instead, as
+ * the PCI device returned by this function can disappear at any moment in
  * time.
  */
 static struct pci_dev * pci_find_subsys(unsigned int vendor,
@@ -191,14 +192,15 @@ exit:
  * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
  * @from: Previous PCI device found in search, or %NULL for new search.
  *
- * Iterates through the list of known PCI devices.  If a PCI device is
- * found with a matching @vendor and @device, a pointer to its device structure is
+ * Iterates through the list of known PCI devices.  If a PCI device is found
+ * with a matching @vendor and @device, a pointer to its device structure is
  * returned.  Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL to the @from argument.
- * Otherwise if @from is not %NULL, searches continue from next device on the global list.
+ * A new search is initiated by passing %NULL as the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from next device
+ * on the global list.
  * 
- * NOTE: Do not use this function anymore, use pci_get_device() instead, as
- * the pci device returned by this function can disappear at any moment in
+ * NOTE: Do not use this function any more; use pci_get_device() instead, as
+ * the PCI device returned by this function can disappear at any moment in
  * time.
  */
 struct pci_dev *
@@ -215,11 +217,11 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *
  * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids
  * @from: Previous PCI device found in search, or %NULL for new search.
  *
- * Iterates through the list of known PCI devices.  If a PCI device is
- * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
+ * Iterates through the list of known PCI devices.  If a PCI device is found
+ * with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
  * device structure is returned, and the reference count to the device is
  * incremented.  Otherwise, %NULL is returned.  A new search is initiated by
- * passing %NULL to the @from argument.  Otherwise if @from is not %NULL,
+ * passing %NULL as the @from argument.  Otherwise if @from is not %NULL,
  * searches continue from next device on the global list.
  * The reference count for @from is always decremented if it is not %NULL.
  */
@@ -262,7 +264,7 @@ exit:
  * found with a matching @vendor and @device, the reference count to the
  * device is incremented and a pointer to its device structure is returned.
  * Otherwise, %NULL is returned.  A new search is initiated by passing %NULL
- * to the @from argument.  Otherwise if @from is not %NULL, searches continue
+ * as the @from argument.  Otherwise if @from is not %NULL, searches continue
  * from next device on the global list.  The reference count for @from is
  * always decremented if it is not %NULL.
  */
@@ -279,11 +281,13 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
  * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
  * @from: Previous PCI device found in search, or %NULL for new search.
  *
- * Iterates through the list of known PCI devices in the reverse order of pci_find_device().
+ * Iterates through the list of known PCI devices in the reverse order of
+ * pci_find_device().
  * If a PCI device is found with a matching @vendor and @device, a pointer to
  * its device structure is returned.  Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL to the @from argument.
- * Otherwise if @from is not %NULL, searches continue from previous device on the global list.
+ * A new search is initiated by passing %NULL as the @from argument.
+ * Otherwise if @from is not %NULL, searches continue from previous device
+ * on the global list.
  */
 struct pci_dev *
 pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from)
@@ -317,7 +321,7 @@ exit:
  * found with a matching @class, the reference count to the device is
  * incremented and a pointer to its device structure is returned.
  * Otherwise, %NULL is returned.
- * A new search is initiated by passing %NULL to the @from argument.
+ * A new search is initiated by passing %NULL as the @from argument.
  * Otherwise if @from is not %NULL, searches continue from next device
  * on the global list.  The reference count for @from is always decremented
  * if it is not %NULL.
index 738b1ef595a3506fd595f9f742da4c6f966b7e47..9ad18e62658d6da302f70290027410eaace11c7d 100644 (file)
@@ -601,12 +601,8 @@ static int ds_ioctl(struct inode * inode, struct file * file,
            ret = CS_BAD_ARGS;
        else {
            struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->config.Function);
-           if (p_dev == NULL)
-                   ret = CS_BAD_ARGS;
-           else {
-                   ret = pccard_get_configuration_info(s, p_dev, &buf->config);
-                   pcmcia_put_dev(p_dev);
-           }
+           ret = pccard_get_configuration_info(s, p_dev, &buf->config);
+           pcmcia_put_dev(p_dev);
        }
        break;
     case DS_GET_FIRST_TUPLE:
@@ -636,12 +632,8 @@ static int ds_ioctl(struct inode * inode, struct file * file,
                    ret = CS_BAD_ARGS;
            else {
                    struct pcmcia_device *p_dev = get_pcmcia_device(s, buf->status.Function);
-                   if (p_dev == NULL)
-                           ret = CS_BAD_ARGS;
-                   else {
-                           ret = pccard_get_status(s, p_dev, &buf->status);
-                           pcmcia_put_dev(p_dev);
-                   }
+                   ret = pccard_get_status(s, p_dev, &buf->status);
+                   pcmcia_put_dev(p_dev);
            }
            break;
     case DS_VALIDATE_CIS:
index 7bf25b88ea314ffdc730d5fef834232aa1116980..c8323399e9e4d03ec0b9cced174a8834b9b60e4a 100644 (file)
@@ -245,10 +245,17 @@ int pccard_get_configuration_info(struct pcmcia_socket *s,
                return CS_SUCCESS;
        }
 
-       /* !!! This is a hack !!! */
-       memcpy(&config->Attributes, &c->Attributes, sizeof(config_t));
-       config->Attributes |= CONF_VALID_CLIENT;
-       config->CardValues = c->CardValues;
+       config->Attributes = c->Attributes | CONF_VALID_CLIENT;
+       config->Vcc = s->socket.Vcc;
+       config->Vpp1 = config->Vpp2 = s->socket.Vpp;
+       config->IntType = c->IntType;
+       config->ConfigBase = c->ConfigBase;
+       config->Status = c->Status;
+       config->Pin = c->Pin;
+       config->Copy = c->Copy;
+       config->Option = c->Option;
+       config->ExtStatus = c->ExtStatus;
+       config->Present = config->CardValues = c->CardValues;
        config->IRQAttributes = c->irq.Attributes;
        config->AssignedIRQ = s->irq.AssignedIRQ;
        config->BasePort1 = c->io.BasePort1;
index b154b3f52cbe3cadcdf73f7e2a1a2a23f137ea34..551f58e298106060b5708cb288d04c8c7da39043 100644 (file)
@@ -346,7 +346,7 @@ static int insert_device(struct pnp_dev *dev, struct pnp_bios_node * node)
        dev->flags = node->flags;
        if (!(dev->flags & PNPBIOS_NO_CONFIG))
                dev->capabilities |= PNP_CONFIGURABLE;
-       if (!(dev->flags & PNPBIOS_NO_DISABLE))
+       if (!(dev->flags & PNPBIOS_NO_DISABLE) && pnpbios_is_dynamic(dev))
                dev->capabilities |= PNP_DISABLE;
        dev->capabilities |= PNP_READ;
        if (pnpbios_is_dynamic(dev))
index f26a2ee3aad8de4a3fe7d94daf23e3e42cdc8ca7..3cba6c9fab11ce9c049cb36e24391ad36c2fe31a 100644 (file)
@@ -152,7 +152,6 @@ ccwgroup_create(struct device *root,
        struct ccwgroup_device *gdev;
        int i;
        int rc;
-       int del_drvdata;
 
        if (argc > 256) /* disallow dumb users */
                return -EINVAL;
@@ -163,7 +162,6 @@ ccwgroup_create(struct device *root,
 
        atomic_set(&gdev->onoff, 0);
 
-       del_drvdata = 0;
        for (i = 0; i < argc; i++) {
                gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]);
 
@@ -180,10 +178,8 @@ ccwgroup_create(struct device *root,
                        rc = -EINVAL;
                        goto free_dev;
                }
-       }
-       for (i = 0; i < argc; i++)
                gdev->cdev[i]->dev.driver_data = gdev;
-       del_drvdata = 1;
+       }
 
        gdev->creator_id = creator_id;
        gdev->count = argc;
@@ -226,9 +222,9 @@ error:
 free_dev:
        for (i = 0; i < argc; i++)
                if (gdev->cdev[i]) {
-                       put_device(&gdev->cdev[i]->dev);
-                       if (del_drvdata)
+                       if (gdev->cdev[i]->dev.driver_data == gdev)
                                gdev->cdev[i]->dev.driver_data = NULL;
+                       put_device(&gdev->cdev[i]->dev);
                }
        kfree(gdev);
        return rc;
index ac6e0c7e43d9587805e820e8d2e6eb633989d58d..7a39e0b0386c63851d82147b7b47d907b82d2c11 100644 (file)
@@ -152,7 +152,8 @@ ccw_device_cancel_halt_clear(struct ccw_device *cdev)
                if (cdev->private->iretry) {
                        cdev->private->iretry--;
                        ret = cio_halt(sch);
-                       return (ret == 0) ? -EBUSY : ret;
+                       if (ret != -EBUSY)
+                               return (ret == 0) ? -EBUSY : ret;
                }
                /* halt io unsuccessful. */
                cdev->private->iretry = 255;    /* 255 clear retries. */
index 085db4826e0ed16f9fb3f371825fb59c604e214c..bdc6bb262bced9c235234364f84f7b2707abd841 100644 (file)
@@ -2152,29 +2152,23 @@ static int esp_do_data_finale(struct NCR_ESP *esp,
  */
 static int esp_should_clear_sync(Scsi_Cmnd *sp)
 {
-       unchar cmd1 = sp->cmnd[0];
-       unchar cmd2 = sp->data_cmnd[0];
+       unchar cmd = sp->cmnd[0];
 
        /* These cases are for spinning up a disk and
         * waiting for that spinup to complete.
         */
-       if(cmd1 == START_STOP ||
-          cmd2 == START_STOP)
+       if(cmd == START_STOP)
                return 0;
 
-       if(cmd1 == TEST_UNIT_READY ||
-          cmd2 == TEST_UNIT_READY)
+       if(cmd == TEST_UNIT_READY)
                return 0;
 
        /* One more special case for SCSI tape drives,
         * this is what is used to probe the device for
         * completion of a rewind or tape load operation.
         */
-       if(sp->device->type == TYPE_TAPE) {
-               if(cmd1 == MODE_SENSE ||
-                  cmd2 == MODE_SENSE)
-                       return 0;
-       }
+       if(sp->device->type == TYPE_TAPE && cmd == MODE_SENSE)
+               return 0;
 
        return 1;
 }
index 3e1053f111dcd61f849bb240c2a4caee4657f3d5..4cf7afc31cc7f00e24414f7a08d1cd3e8733ed7b 100644 (file)
@@ -2427,7 +2427,7 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt)
        info->stats.aborts += 1;
 
        printk(KERN_WARNING "scsi%d: abort command ", info->host->host_no);
-       __scsi_print_command(SCpnt->data_cmnd);
+       __scsi_print_command(SCpnt->cmnd);
 
        print_debug_list();
        fas216_dumpstate(info);
index eaf64c7e54e7014821b5145536edeb28090dfe03..98bd22714d0dde82647578abc90c07505fb1186f 100644 (file)
@@ -2754,18 +2754,15 @@ static int esp_do_data_finale(struct esp *esp)
  */
 static int esp_should_clear_sync(struct scsi_cmnd *sp)
 {
-       u8 cmd1 = sp->cmnd[0];
-       u8 cmd2 = sp->data_cmnd[0];
+       u8 cmd = sp->cmnd[0];
 
        /* These cases are for spinning up a disk and
         * waiting for that spinup to complete.
         */
-       if (cmd1 == START_STOP ||
-           cmd2 == START_STOP)
+       if (cmd == START_STOP)
                return 0;
 
-       if (cmd1 == TEST_UNIT_READY ||
-           cmd2 == TEST_UNIT_READY)
+       if (cmd == TEST_UNIT_READY)
                return 0;
 
        /* One more special case for SCSI tape drives,
@@ -2773,8 +2770,7 @@ static int esp_should_clear_sync(struct scsi_cmnd *sp)
         * completion of a rewind or tape load operation.
         */
        if (sp->device->type == TYPE_TAPE) {
-               if (cmd1 == MODE_SENSE ||
-                   cmd2 == MODE_SENSE)
+               if (cmd == MODE_SENSE)
                        return 0;
        }
 
index 4b6aa30f4d68529f1a51e0cdaf278c3e2918ec81..29f59345305d93e7181ad599594710b22963792f 100644 (file)
@@ -764,12 +764,27 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev,
                               unsigned int action)
 {
        unsigned long flags;
+       struct ata_eh_info *ehi = &ap->eh_info;
+       struct ata_eh_context *ehc = &ap->eh_context;
 
        spin_lock_irqsave(ap->lock, flags);
 
-       ata_eh_clear_action(dev, &ap->eh_info, action);
+       /* Reset is represented by combination of actions and EHI
+        * flags.  Suck in all related bits before clearing eh_info to
+        * avoid losing requested action.
+        */
+       if (action & ATA_EH_RESET_MASK) {
+               ehc->i.action |= ehi->action & ATA_EH_RESET_MASK;
+               ehc->i.flags |= ehi->flags & ATA_EHI_RESET_MODIFIER_MASK;
+
+               /* make sure all reset actions are cleared & clear EHI flags */
+               action |= ATA_EH_RESET_MASK;
+               ehi->flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
+       }
+
+       ata_eh_clear_action(dev, ehi, action);
 
-       if (!(ap->eh_context.i.flags & ATA_EHI_QUIET))
+       if (!(ehc->i.flags & ATA_EHI_QUIET))
                ap->pflags |= ATA_PFLAG_RECOVERED;
 
        spin_unlock_irqrestore(ap->lock, flags);
@@ -790,6 +805,12 @@ static void ata_eh_about_to_do(struct ata_port *ap, struct ata_device *dev,
 static void ata_eh_done(struct ata_port *ap, struct ata_device *dev,
                        unsigned int action)
 {
+       /* if reset is complete, clear all reset actions & reset modifier */
+       if (action & ATA_EH_RESET_MASK) {
+               action |= ATA_EH_RESET_MASK;
+               ap->eh_context.i.flags &= ~ATA_EHI_RESET_MODIFIER_MASK;
+       }
+
        ata_eh_clear_action(dev, &ap->eh_context.i, action);
 }
 
@@ -1276,8 +1297,6 @@ static int ata_eh_speed_down(struct ata_device *dev, int is_io,
 static void ata_eh_autopsy(struct ata_port *ap)
 {
        struct ata_eh_context *ehc = &ap->eh_context;
-       unsigned int action = ehc->i.action;
-       struct ata_device *failed_dev = NULL;
        unsigned int all_err_mask = 0;
        int tag, is_io = 0;
        u32 serror;
@@ -1294,7 +1313,7 @@ static void ata_eh_autopsy(struct ata_port *ap)
                ehc->i.serror |= serror;
                ata_eh_analyze_serror(ap);
        } else if (rc != -EOPNOTSUPP)
-               action |= ATA_EH_HARDRESET;
+               ehc->i.action |= ATA_EH_HARDRESET;
 
        /* analyze NCQ failure */
        ata_eh_analyze_ncq_error(ap);
@@ -1315,7 +1334,7 @@ static void ata_eh_autopsy(struct ata_port *ap)
                qc->err_mask |= ehc->i.err_mask;
 
                /* analyze TF */
-               action |= ata_eh_analyze_tf(qc, &qc->result_tf);
+               ehc->i.action |= ata_eh_analyze_tf(qc, &qc->result_tf);
 
                /* DEV errors are probably spurious in case of ATA_BUS error */
                if (qc->err_mask & AC_ERR_ATA_BUS)
@@ -1329,11 +1348,11 @@ static void ata_eh_autopsy(struct ata_port *ap)
                /* SENSE_VALID trumps dev/unknown error and revalidation */
                if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
                        qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
-                       action &= ~ATA_EH_REVALIDATE;
+                       ehc->i.action &= ~ATA_EH_REVALIDATE;
                }
 
                /* accumulate error info */
-               failed_dev = qc->dev;
+               ehc->i.dev = qc->dev;
                all_err_mask |= qc->err_mask;
                if (qc->flags & ATA_QCFLAG_IO)
                        is_io = 1;
@@ -1342,25 +1361,22 @@ static void ata_eh_autopsy(struct ata_port *ap)
        /* enforce default EH actions */
        if (ap->pflags & ATA_PFLAG_FROZEN ||
            all_err_mask & (AC_ERR_HSM | AC_ERR_TIMEOUT))
-               action |= ATA_EH_SOFTRESET;
+               ehc->i.action |= ATA_EH_SOFTRESET;
        else if (all_err_mask)
-               action |= ATA_EH_REVALIDATE;
+               ehc->i.action |= ATA_EH_REVALIDATE;
 
        /* if we have offending qcs and the associated failed device */
-       if (failed_dev) {
+       if (ehc->i.dev) {
                /* speed down */
-               action |= ata_eh_speed_down(failed_dev, is_io, all_err_mask);
+               ehc->i.action |= ata_eh_speed_down(ehc->i.dev, is_io,
+                                                  all_err_mask);
 
                /* perform per-dev EH action only on the offending device */
-               ehc->i.dev_action[failed_dev->devno] |=
-                       action & ATA_EH_PERDEV_MASK;
-               action &= ~ATA_EH_PERDEV_MASK;
+               ehc->i.dev_action[ehc->i.dev->devno] |=
+                       ehc->i.action & ATA_EH_PERDEV_MASK;
+               ehc->i.action &= ~ATA_EH_PERDEV_MASK;
        }
 
-       /* record autopsy result */
-       ehc->i.dev = failed_dev;
-       ehc->i.action |= action;
-
        DPRINTK("EXIT\n");
 }
 
@@ -1483,6 +1499,9 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
        ata_reset_fn_t reset;
        int i, did_followup_srst, rc;
 
+       /* about to reset */
+       ata_eh_about_to_do(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK);
+
        /* Determine which reset to use and record in ehc->i.action.
         * prereset() may examine and modify it.
         */
@@ -1531,8 +1550,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
                ata_port_printk(ap, KERN_INFO, "%s resetting port\n",
                                reset == softreset ? "soft" : "hard");
 
-       /* reset */
-       ata_eh_about_to_do(ap, NULL, ATA_EH_RESET_MASK);
+       /* mark that this EH session started with reset */
        ehc->i.flags |= ATA_EHI_DID_RESET;
 
        rc = ata_do_reset(ap, reset, classes);
@@ -1595,7 +1613,7 @@ static int ata_eh_reset(struct ata_port *ap, int classify,
                        postreset(ap, classes);
 
                /* reset successful, schedule revalidation */
-               ata_eh_done(ap, NULL, ATA_EH_RESET_MASK);
+               ata_eh_done(ap, NULL, ehc->i.action & ATA_EH_RESET_MASK);
                ehc->i.action |= ATA_EH_REVALIDATE;
        }
 
@@ -1848,15 +1866,16 @@ static int ata_eh_skip_recovery(struct ata_port *ap)
        for (i = 0; i < ata_port_max_devices(ap); i++) {
                struct ata_device *dev = &ap->device[i];
 
-               if (ata_dev_absent(dev) || ata_dev_ready(dev))
+               if (!(dev->flags & ATA_DFLAG_SUSPENDED))
                        break;
        }
 
        if (i == ata_port_max_devices(ap))
                return 1;
 
-       /* always thaw frozen port and recover failed devices */
-       if (ap->pflags & ATA_PFLAG_FROZEN || ata_port_nr_enabled(ap))
+       /* thaw frozen port, resume link and recover failed devices */
+       if ((ap->pflags & ATA_PFLAG_FROZEN) ||
+           (ehc->i.flags & ATA_EHI_RESUME_LINK) || ata_port_nr_enabled(ap))
                return 0;
 
        /* skip if class codes for all vacant slots are ATA_DEV_NONE */
index 64631bd38952e28dd806506eceec01ac44ad0190..4776f4e55839022303c8dba80e7ca4ec76ddf368 100644 (file)
@@ -269,8 +269,15 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = {
        { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20619 },
 
+/* TODO: remove all associated board_20771 code, as it completely
+ * duplicates board_2037x code, unless reason for separation can be
+ * divined.
+ */
+#if 0
        { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
          board_20771 },
+#endif
+
        { }     /* terminate list */
 };
 
index a89c4115cfbaa4c674b765a503e8ee9c3ea138a1..32293f4516694ae0d7bf237364a35892f2e53156 100644 (file)
@@ -110,11 +110,8 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
                                       sshdr.asc, sshdr.ascq);
                        break;
                case NOT_READY: /* This happens if there is no disc in drive */
-                       if (sdev->removable && (cmd[0] != TEST_UNIT_READY)) {
-                               printk(KERN_INFO "Device not ready. Make sure"
-                                      " there is a disc in the drive.\n");
+                       if (sdev->removable)
                                break;
-                       }
                case UNIT_ATTENTION:
                        if (sdev->removable) {
                                sdev->changed = 1;
index 6533b0f3923133e355284df03934a3b1de60c202..c40b9b8b1e7e0e176554dd23a30fa4ef2bae9945 100644 (file)
@@ -86,9 +86,11 @@ config FB_MACMODES
        default n
 
 config FB_BACKLIGHT
-       bool
-       depends on FB
-       default n
+       bool
+       depends on FB
+       select BACKLIGHT_LCD_SUPPORT
+       select BACKLIGHT_CLASS_DEVICE
+       default n
 
 config FB_MODE_HELPERS
         bool "Enable Video Mode Handling Helpers"
@@ -420,7 +422,7 @@ config FB_OF
 
 config FB_CONTROL
        bool "Apple \"control\" display support"
-       depends on (FB = y) && PPC_PMAC
+       depends on (FB = y) && PPC_PMAC && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -431,7 +433,7 @@ config FB_CONTROL
 
 config FB_PLATINUM
        bool "Apple \"platinum\" display support"
-       depends on (FB = y) && PPC_PMAC
+       depends on (FB = y) && PPC_PMAC && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -442,7 +444,7 @@ config FB_PLATINUM
 
 config FB_VALKYRIE
        bool "Apple \"valkyrie\" display support"
-       depends on (FB = y) && (MAC || PPC_PMAC)
+       depends on (FB = y) && (MAC || (PPC_PMAC && PPC32))
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -453,7 +455,7 @@ config FB_VALKYRIE
 
 config FB_CT65550
        bool "Chips 65550 display support"
-       depends on (FB = y) && PPC
+       depends on (FB = y) && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -721,10 +723,8 @@ config FB_NVIDIA_I2C
 
 config FB_NVIDIA_BACKLIGHT
        bool "Support for backlight control"
-       depends on FB_NVIDIA && PPC_PMAC
+       depends on FB_NVIDIA && PMAC_BACKLIGHT
        select FB_BACKLIGHT
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y here if you want to control the backlight of your display.
@@ -769,10 +769,8 @@ config FB_RIVA_DEBUG
 
 config FB_RIVA_BACKLIGHT
        bool "Support for backlight control"
-       depends on FB_RIVA && PPC_PMAC
+       depends on FB_RIVA && PMAC_BACKLIGHT
        select FB_BACKLIGHT
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y here if you want to control the backlight of your display.
@@ -1025,10 +1023,8 @@ config FB_RADEON_I2C
 
 config FB_RADEON_BACKLIGHT
        bool "Support for backlight control"
-       depends on FB_RADEON && PPC_PMAC
+       depends on FB_RADEON && PMAC_BACKLIGHT
        select FB_BACKLIGHT
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y here if you want to control the backlight of your display.
@@ -1059,10 +1055,8 @@ config FB_ATY128
 
 config FB_ATY128_BACKLIGHT
        bool "Support for backlight control"
-       depends on FB_ATY128 && PPC_PMAC
+       depends on FB_ATY128 && PMAC_BACKLIGHT
        select FB_BACKLIGHT
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y here if you want to control the backlight of your display.
@@ -1111,10 +1105,8 @@ config FB_ATY_GX
 
 config FB_ATY_BACKLIGHT
        bool "Support for backlight control"
-       depends on FB_ATY && PPC_PMAC
+       depends on FB_ATY && PMAC_BACKLIGHT
        select FB_BACKLIGHT
-       select BACKLIGHT_LCD_SUPPORT
-       select BACKLIGHT_CLASS_DEVICE
        default y
        help
          Say Y here if you want to control the backlight of your display.
@@ -1620,7 +1612,7 @@ if FB || SGI_NEWPORT_CONSOLE
        source "drivers/video/logo/Kconfig"
 endif
 
-if FB && SYSFS
+if SYSFS
        source "drivers/video/backlight/Kconfig"
 endif
 
index 95563c9c6b9c7498fdc0d5f2d34e475df1d22882..481c6c9695f821da3bd133017bc4a9c3823046be 100644 (file)
@@ -4,6 +4,7 @@
 
 # Each configuration option enables a list of files.
 
+obj-y                             += fb_notify.o
 obj-$(CONFIG_FB)                  += fb.o
 fb-y                              := fbmem.o fbmon.o fbcmap.o fbsysfs.o \
                                      modedb.o fbcvt.o
index c64a717e2d4b1c4711dd8c32618bddd470f7fc2f..8b08121b390bf979a9272792725fd4efb8ada9a6 100644 (file)
@@ -455,7 +455,10 @@ static void do_wait_for_fifo(u16 entries, struct aty128fb_par *par);
 static void wait_for_fifo(u16 entries, struct aty128fb_par *par);
 static void wait_for_idle(struct aty128fb_par *par);
 static u32 depth_to_dst(u32 depth);
+
+#ifdef CONFIG_FB_ATY128_BACKLIGHT
 static void aty128_bl_set_power(struct fb_info *info, int power);
+#endif
 
 #define BIOS_IN8(v)    (readb(bios + (v)))
 #define BIOS_IN16(v)   (readb(bios + (v)) | \
index 1507d19f481f8ebe84904a152a4f94333fc8f19e..053ff63365b76662ba092608cb3a145af6b2c42c 100644 (file)
@@ -2812,7 +2812,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
        if (par->lock_blank || par->asleep)
                return 0;
 
-#ifdef CONFIG_PMAC_BACKLIGHT
+#ifdef CONFIG_FB_ATY_BACKLIGHT
        if (machine_is(powermac) && blank > FB_BLANK_NORMAL)
                aty_bl_set_power(info, FB_BLANK_POWERDOWN);
 #elif defined(CONFIG_FB_ATY_GENERIC_LCD)
@@ -2844,7 +2844,7 @@ static int atyfb_blank(int blank, struct fb_info *info)
        }
        aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
 
-#ifdef CONFIG_PMAC_BACKLIGHT
+#ifdef CONFIG_FB_ATY_BACKLIGHT
        if (machine_is(powermac) && blank <= FB_BLANK_NORMAL)
                aty_bl_set_power(info, FB_BLANK_UNBLANK);
 #elif defined(CONFIG_FB_ATY_GENERIC_LCD)
index 8d85fc58142e62861f5481ff711aabe206bd5f0f..8e3400d5dd21e3f3246b8472287132e2ff73c7ff 100644 (file)
@@ -266,6 +266,8 @@ static int force_measure_pll = 0;
 #ifdef CONFIG_MTRR
 static int nomtrr = 0;
 #endif
+static int force_sleep;
+static int ignore_devlist;
 
 /*
  * prototypes
@@ -2327,9 +2329,9 @@ static int __devinit radeonfb_pci_register (struct pci_dev *pdev,
                /* -2 is special: means  ON on mobility chips and do not
                 * change on others
                 */
-               radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1);
+               radeonfb_pm_init(rinfo, rinfo->is_mobility ? 1 : -1, ignore_devlist, force_sleep);
        } else
-               radeonfb_pm_init(rinfo, default_dynclk);
+               radeonfb_pm_init(rinfo, default_dynclk, ignore_devlist, force_sleep);
 
        pci_set_drvdata(pdev, info);
 
@@ -2477,6 +2479,12 @@ static int __init radeonfb_setup (char *options)
                        force_measure_pll = 1;
                } else if (!strncmp(this_opt, "ignore_edid", 11)) {
                        ignore_edid = 1;
+#if defined(CONFIG_PM) && defined(CONFIG_X86)
+               } else if (!strncmp(this_opt, "force_sleep", 11)) {
+                       force_sleep = 1;
+               } else if (!strncmp(this_opt, "ignore_devlist", 14)) {
+                       ignore_devlist = 1;
+#endif
                } else
                        mode_option = this_opt;
        }
@@ -2532,3 +2540,9 @@ module_param(panel_yres, int, 0);
 MODULE_PARM_DESC(panel_yres, "int: set panel yres");
 module_param(mode_option, charp, 0);
 MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
+#if defined(CONFIG_PM) && defined(CONFIG_X86)
+module_param(force_sleep, bool, 0);
+MODULE_PARM_DESC(force_sleep, "bool: force D2 sleep mode on all hardware");
+module_param(ignore_devlist, bool, 0);
+MODULE_PARM_DESC(ignore_devlist, "bool: ignore workarounds for bugs in specific laptops");
+#endif
index c7091761cef41614cd08c3dd091eecb65a764205..f31e606a2ded2d8506db105f5d897bb3e02c7373 100644 (file)
 
 #include "ati_ids.h"
 
+static void radeon_reinitialize_M10(struct radeonfb_info *rinfo);
+
+/*
+ * Workarounds for bugs in PC laptops:
+ * - enable D2 sleep in some IBM Thinkpads
+ * - special case for Samsung P35
+ *
+ * Whitelist by subsystem vendor/device because
+ * its the subsystem vendor's fault!
+ */
+
+#if defined(CONFIG_PM) && defined(CONFIG_X86)
+struct radeon_device_id {
+        const char *ident;                     /* (arbitrary) Name */
+        const unsigned short subsystem_vendor; /* Subsystem Vendor ID */
+        const unsigned short subsystem_device; /* Subsystem Device ID */
+       const enum radeon_pm_mode pm_mode_modifier; /* modify pm_mode */
+       const reinit_function_ptr new_reinit_func;   /* changed reinit_func */
+};
+
+#define BUGFIX(model, sv, sd, pm, fn) { \
+       .ident = model, \
+       .subsystem_vendor = sv, \
+       .subsystem_device = sd, \
+       .pm_mode_modifier = pm, \
+       .new_reinit_func  = fn  \
+}
+
+static struct radeon_device_id radeon_workaround_list[] = {
+       BUGFIX("IBM Thinkpad R32",
+              PCI_VENDOR_ID_IBM, 0x1905,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad R40",
+              PCI_VENDOR_ID_IBM, 0x0526,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad R40",
+              PCI_VENDOR_ID_IBM, 0x0527,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad R50/R51/T40/T41",
+              PCI_VENDOR_ID_IBM, 0x0531,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad R51/T40/T41/T42",
+              PCI_VENDOR_ID_IBM, 0x0530,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad T30",
+              PCI_VENDOR_ID_IBM, 0x0517,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad T40p",
+              PCI_VENDOR_ID_IBM, 0x054d,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad T42",
+              PCI_VENDOR_ID_IBM, 0x0550,
+              radeon_pm_d2, NULL),
+       BUGFIX("IBM Thinkpad X31/X32",
+              PCI_VENDOR_ID_IBM, 0x052f,
+              radeon_pm_d2, NULL),
+       BUGFIX("Samsung P35",
+              PCI_VENDOR_ID_SAMSUNG, 0xc00c,
+              radeon_pm_off, radeon_reinitialize_M10),
+       { .ident = NULL }
+};
+
+static int radeon_apply_workarounds(struct radeonfb_info *rinfo)
+{
+       struct radeon_device_id *id;
+
+       for (id = radeon_workaround_list; id->ident != NULL; id++ )
+               if ((id->subsystem_vendor == rinfo->pdev->subsystem_vendor ) &&
+                   (id->subsystem_device == rinfo->pdev->subsystem_device )) {
+
+                       /* we found a device that requires workaround */
+                       printk(KERN_DEBUG "radeonfb: %s detected"
+                              ", enabling workaround\n", id->ident);
+
+                       rinfo->pm_mode |= id->pm_mode_modifier;
+
+                       if (id->new_reinit_func != NULL)
+                               rinfo->reinit_func = id->new_reinit_func;
+
+                       return 1;
+               }
+       return 0;  /* not found */
+}
+
+#else  /* defined(CONFIG_PM) && defined(CONFIG_X86) */
+static inline int radeon_apply_workarounds(struct radeonfb_info *rinfo)
+{
+        return 0;
+}
+#endif /* defined(CONFIG_PM) && defined(CONFIG_X86) */
+
+
+
 static void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo)
 {
        u32 tmp;
@@ -852,18 +945,26 @@ static void radeon_pm_setup_for_suspend(struct radeonfb_info *rinfo)
        /* because both INPLL and OUTPLL take the same lock, that's why. */
        tmp = INPLL( pllMCLK_MISC) | MCLK_MISC__EN_MCLK_TRISTATE_IN_SUSPEND;
        OUTPLL( pllMCLK_MISC, tmp);
-       
-       /* AGP PLL control */
-       if (rinfo->family <= CHIP_FAMILY_RV280) {
-               OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) |  BUS_CNTL1__AGPCLK_VALID);
 
-               OUTREG(BUS_CNTL1,
-                      (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK)
-                      | (2<<BUS_CNTL1__MOBILE_PLATFORM_SEL__SHIFT));   // 440BX
-       } else {
-               OUTREG(BUS_CNTL1, INREG(BUS_CNTL1));
-               OUTREG(BUS_CNTL1, (INREG(BUS_CNTL1) & ~0x4000) | 0x8000);
+       /* BUS_CNTL1__MOBILE_PLATORM_SEL setting is northbridge chipset
+        * and radeon chip dependent. Thus we only enable it on Mac for
+        * now (until we get more info on how to compute the correct
+        * value for various X86 bridges).
+        */
+#ifdef CONFIG_PPC_PMAC
+       if (machine_is(powermac)) {
+               /* AGP PLL control */
+               if (rinfo->family <= CHIP_FAMILY_RV280) {
+                       OUTREG(BUS_CNTL1, INREG(BUS_CNTL1) |  BUS_CNTL1__AGPCLK_VALID);
+                       OUTREG(BUS_CNTL1,
+                              (INREG(BUS_CNTL1) & ~BUS_CNTL1__MOBILE_PLATFORM_SEL_MASK)
+                              | (2<<BUS_CNTL1__MOBILE_PLATFORM_SEL__SHIFT));   // 440BX
+               } else {
+                       OUTREG(BUS_CNTL1, INREG(BUS_CNTL1));
+                       OUTREG(BUS_CNTL1, (INREG(BUS_CNTL1) & ~0x4000) | 0x8000);
+               }
        }
+#endif
 
        OUTREG(CRTC_OFFSET_CNTL, (INREG(CRTC_OFFSET_CNTL)
                                  & ~CRTC_OFFSET_CNTL__CRTC_STEREO_SYNC_OUT_EN));
@@ -2713,7 +2814,7 @@ static void radeonfb_early_resume(void *data)
 
 #endif /* CONFIG_PM */
 
-void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk)
+void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep)
 {
        /* Find PM registers in config space if any*/
        rinfo->pm_reg = pci_find_capability(rinfo->pdev, PCI_CAP_ID_PM);
@@ -2729,22 +2830,13 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk)
        }
 
 #if defined(CONFIG_PM)
+#if defined(CONFIG_PPC_PMAC)
        /* Check if we can power manage on suspend/resume. We can do
         * D2 on M6, M7 and M9, and we can resume from D3 cold a few other
         * "Mac" cards, but that's all. We need more infos about what the
         * BIOS does tho. Right now, all this PM stuff is pmac-only for that
         * reason. --BenH
         */
-       /* Special case for Samsung P35 laptops
-        */
-       if ((rinfo->pdev->vendor == PCI_VENDOR_ID_ATI) &&
-           (rinfo->pdev->device == PCI_CHIP_RV350_NP) &&
-           (rinfo->pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG) &&
-           (rinfo->pdev->subsystem_device == 0xc00c)) {
-               rinfo->reinit_func = radeon_reinitialize_M10;
-               rinfo->pm_mode |= radeon_pm_off;
-       }
-#if defined(CONFIG_PPC_PMAC)
        if (machine_is(powermac) && rinfo->of_node) {
                if (rinfo->is_mobility && rinfo->pm_reg &&
                    rinfo->family <= CHIP_FAMILY_RV250)
@@ -2790,6 +2882,18 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk)
        }
 #endif /* defined(CONFIG_PPC_PMAC) */
 #endif /* defined(CONFIG_PM) */
+
+       if (ignore_devlist)
+               printk(KERN_DEBUG
+                      "radeonfb: skipping test for device workarounds\n");
+       else
+               radeon_apply_workarounds(rinfo);
+
+       if (force_sleep) {
+               printk(KERN_DEBUG
+                      "radeonfb: forcefully enabling D2 sleep mode\n");
+               rinfo->pm_mode |= radeon_pm_d2;
+       }
 }
 
 void radeonfb_pm_exit(struct radeonfb_info *rinfo)
index 38657b2d10eb9c2010d10a578584f8f3c0a4a46e..d5ff224a625843e74ed64c27225ee664ce9dfcb3 100644 (file)
@@ -273,6 +273,8 @@ enum radeon_pm_mode {
        radeon_pm_off   = 0x00000002,   /* Can resume from D3 cold */
 };
 
+typedef void (*reinit_function_ptr)(struct radeonfb_info *rinfo);
+
 struct radeonfb_info {
        struct fb_info          *info;
 
@@ -338,7 +340,7 @@ struct radeonfb_info {
        int                     dynclk;
        int                     no_schedule;
        enum radeon_pm_mode     pm_mode;
-       void                    (*reinit_func)(struct radeonfb_info *rinfo);
+       reinit_function_ptr     reinit_func;
 
        /* Lock on register access */
        spinlock_t              reg_lock;
@@ -600,7 +602,7 @@ extern int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, u8
 /* PM Functions */
 extern int radeonfb_pci_suspend(struct pci_dev *pdev, pm_message_t state);
 extern int radeonfb_pci_resume(struct pci_dev *pdev);
-extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk);
+extern void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlist, int force_sleep);
 extern void radeonfb_pm_exit(struct radeonfb_info *rinfo);
 
 /* Monitor probe functions */
index 022f9d3473f5030074bda89cb3fe84a175d93a44..02f15297a021b1c7902137ee09bed8355e62f412 100644 (file)
@@ -10,7 +10,7 @@ menuconfig BACKLIGHT_LCD_SUPPORT
 
 config BACKLIGHT_CLASS_DEVICE
         tristate "Lowlevel Backlight controls"
-       depends on BACKLIGHT_LCD_SUPPORT && FB
+       depends on BACKLIGHT_LCD_SUPPORT
        default m
        help
          This framework adds support for low-level control of the LCD
@@ -26,7 +26,7 @@ config BACKLIGHT_DEVICE
 
 config LCD_CLASS_DEVICE
         tristate "Lowlevel LCD controls"
-       depends on BACKLIGHT_LCD_SUPPORT && FB
+       depends on BACKLIGHT_LCD_SUPPORT
        default m
        help
          This framework adds support for low-level control of LCD.
index 52ed12b12acc15b0a4f90e1d4e4fe027112ac6af..eb4d03fa53915612f40158a82d06f549eec4f595 100644 (file)
@@ -197,7 +197,7 @@ static int __init mdacon_setup(char *str)
 __setup("mdacon=", mdacon_setup);
 #endif
 
-static int __init mda_detect(void)
+static int mda_detect(void)
 {
        int count=0;
        u16 *p, p_save;
@@ -282,7 +282,7 @@ static int __init mda_detect(void)
        return 1;
 }
 
-static void __init mda_initialize(void)
+static void mda_initialize(void)
 {
        write_mda_b(97, 0x00);          /* horizontal total */
        write_mda_b(80, 0x01);          /* horizontal displayed */
diff --git a/drivers/video/fb_notify.c b/drivers/video/fb_notify.c
new file mode 100644 (file)
index 0000000..8c02038
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *  linux/drivers/video/fb_notify.c
+ *
+ *  Copyright (C) 2006 Antonino Daplas <adaplas@pol.net>
+ *
+ *     2001 - Documented with DocBook
+ *     - Brad Douglas <brad@neruo.com>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+#include <linux/fb.h>
+#include <linux/notifier.h>
+
+static BLOCKING_NOTIFIER_HEAD(fb_notifier_list);
+
+/**
+ *     fb_register_client - register a client notifier
+ *     @nb: notifier block to callback on events
+ */
+int fb_register_client(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&fb_notifier_list, nb);
+}
+EXPORT_SYMBOL(fb_register_client);
+
+/**
+ *     fb_unregister_client - unregister a client notifier
+ *     @nb: notifier block to callback on events
+ */
+int fb_unregister_client(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_unregister(&fb_notifier_list, nb);
+}
+EXPORT_SYMBOL(fb_unregister_client);
+
+/**
+ * fb_notifier_call_chain - notify clients of fb_events
+ *
+ */
+int fb_notifier_call_chain(unsigned long val, void *v)
+{
+       return blocking_notifier_call_chain(&fb_notifier_list, val, v);
+}
+EXPORT_SYMBOL_GPL(fb_notifier_call_chain);
index 4fc9df426c1af5fc7fb30c4ee0b96228d0eb03fe..17961e3ecaa07ed1b9572868e5af8055f1b91760 100644 (file)
@@ -52,7 +52,6 @@
 
 #define FBPIXMAPSIZE   (1024 * 8)
 
-static BLOCKING_NOTIFIER_HEAD(fb_notifier_list);
 struct fb_info *registered_fb[FB_MAX];
 int num_registered_fb;
 
@@ -791,8 +790,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 
                    event.info = info;
                    event.data = &mode1;
-                   ret = blocking_notifier_call_chain(&fb_notifier_list,
-                                  &nbs