aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING4
-rw-r--r--Documentation/00-INDEX2
-rw-r--r--Documentation/CodingStyle3
-rw-r--r--Documentation/DMA-API.txt2
-rw-r--r--Documentation/DocBook/journal-api.tmpl4
-rw-r--r--Documentation/DocBook/usb.tmpl2
-rw-r--r--Documentation/MSI-HOWTO.txt2
-rw-r--r--Documentation/RCU/RTFP.txt36
-rw-r--r--Documentation/RCU/UP.txt79
-rw-r--r--Documentation/RCU/checklist.txt23
-rw-r--r--Documentation/RCU/rcu.txt48
-rw-r--r--Documentation/RCU/whatisRCU.txt902
-rw-r--r--Documentation/cpu-freq/cpufreq-stats.txt2
-rw-r--r--Documentation/cpusets.txt2
-rw-r--r--Documentation/crypto/descore-readme.txt2
-rw-r--r--Documentation/feature-removal-schedule.txt8
-rw-r--r--Documentation/ioctl/cdrom.txt2
-rw-r--r--Documentation/kernel-parameters.txt1
-rw-r--r--Documentation/mono.txt2
-rw-r--r--Documentation/networking/bonding.txt4
-rw-r--r--Documentation/networking/wan-router.txt4
-rw-r--r--Documentation/pci.txt2
-rw-r--r--Documentation/powerpc/eeh-pci-error-recovery.txt2
-rw-r--r--Documentation/s390/s390dbf.txt2
-rw-r--r--Documentation/scsi/ibmmca.txt2
-rw-r--r--Documentation/sound/alsa/ALSA-Configuration.txt2
-rw-r--r--Documentation/sysrq.txt2
-rw-r--r--Documentation/uml/UserModeLinux-HOWTO.txt2
-rw-r--r--Documentation/usb/gadget_serial.txt2
-rw-r--r--Documentation/video4linux/Zoran2
-rw-r--r--Kbuild5
-rw-r--r--Makefile25
-rw-r--r--REPORTING-BUGS14
-rw-r--r--arch/alpha/kernel/alpha_ksyms.c9
-rw-r--r--arch/alpha/kernel/osf_sys.c3
-rw-r--r--arch/alpha/kernel/smp.c172
-rw-r--r--arch/arm/Kconfig4
-rw-r--r--arch/arm/Kconfig.debug2
-rw-r--r--arch/arm/common/scoop.c2
-rw-r--r--arch/arm/kernel/calls.S5
-rw-r--r--arch/arm/kernel/entry-common.S4
-rw-r--r--arch/arm/mach-pxa/corgi.c28
-rw-r--r--arch/i386/kernel/acpi/wakeup.S6
-rw-r--r--arch/i386/kernel/cpu/common.c2
-rw-r--r--arch/i386/kernel/io_apic.c3
-rw-r--r--arch/i386/kernel/smpboot.c3
-rw-r--r--arch/i386/kernel/vmlinux.lds.S11
-rw-r--r--arch/ia64/kernel/mca.c11
-rw-r--r--arch/m32r/Kconfig4
-rw-r--r--arch/m32r/kernel/smp.c48
-rw-r--r--arch/mips/kernel/irixsig.c17
-rw-r--r--arch/mips/kernel/sysirix.c3
-rw-r--r--arch/mips/lib/dec_and_lock.c8
-rw-r--r--arch/parisc/lib/Makefile2
-rw-r--r--arch/parisc/lib/bitops.c4
-rw-r--r--arch/parisc/lib/debuglocks.c277
-rw-r--r--arch/ppc/Kconfig9
-rw-r--r--arch/ppc/Makefile16
-rw-r--r--arch/ppc/kernel/cpu_setup_6xx.S1
-rw-r--r--arch/ppc/kernel/cpu_setup_power4.S1
-rw-r--r--arch/ppc/kernel/dma-mapping.c2
-rw-r--r--arch/ppc/kernel/head.S28
-rw-r--r--arch/ppc/kernel/idle.c6
-rw-r--r--arch/ppc/kernel/smp.c44
-rw-r--r--arch/ppc/kernel/traps.c22
-rw-r--r--arch/ppc/lib/Makefile1
-rw-r--r--arch/ppc/lib/dec_and_lock.c8
-rw-r--r--arch/ppc/mm/fault.c6
-rw-r--r--arch/ppc/platforms/pmac_sleep.S2
-rw-r--r--arch/ppc/platforms/pmac_smp.c85
-rw-r--r--arch/ppc/syslib/cpc700_pic.c12
-rw-r--r--arch/ppc/syslib/i8259.c13
-rw-r--r--arch/ppc/syslib/open_pic2.c12
-rw-r--r--arch/ppc/syslib/ppc403_pic.c11
-rw-r--r--arch/ppc/syslib/xilinx_pic.c13
-rw-r--r--arch/ppc64/Makefile13
-rw-r--r--arch/ppc64/kernel/cpu_setup_power4.S1
-rw-r--r--arch/ppc64/lib/dec_and_lock.c8
-rw-r--r--arch/ppc64/lib/locks.c14
-rw-r--r--arch/s390/lib/spinlock.c12
-rw-r--r--arch/sh/boards/adx/irq_maskreg.c14
-rw-r--r--arch/sh/boards/bigsur/io.c8
-rw-r--r--arch/sh/boards/bigsur/irq.c28
-rw-r--r--arch/sh/boards/cqreek/irq.c14
-rw-r--r--arch/sh/boards/harp/irq.c14
-rw-r--r--arch/sh/boards/overdrive/irq.c14
-rw-r--r--arch/sh/boards/renesas/hs7751rvoip/irq.c14
-rw-r--r--arch/sh/boards/renesas/rts7751r2d/irq.c14
-rw-r--r--arch/sh/boards/renesas/systemh/irq.c14
-rw-r--r--arch/sh/boards/superh/microdev/irq.c14
-rw-r--r--arch/sh/cchips/hd6446x/hd64465/io.c8
-rw-r--r--arch/sh/cchips/voyagergx/irq.c14
-rw-r--r--arch/sh/kernel/cpu/irq_imask.c14
-rw-r--r--arch/sh/kernel/cpu/irq_ipr.c28
-rw-r--r--arch/sh/kernel/cpu/sh4/irq_intc2.c14
-rw-r--r--arch/sh64/kernel/irq_intc.c14
-rw-r--r--arch/sparc/kernel/sparc_ksyms.c10
-rw-r--r--arch/sparc/lib/Makefile2
-rw-r--r--arch/sparc/lib/debuglocks.c202
-rw-r--r--arch/sparc64/kernel/process.c5
-rw-r--r--arch/sparc64/kernel/sparc64_ksyms.c5
-rw-r--r--arch/sparc64/lib/Makefile1
-rw-r--r--arch/sparc64/lib/debuglocks.c366
-rw-r--r--arch/um/Makefile7
-rw-r--r--arch/um/include/mem.h12
-rw-r--r--arch/um/kernel/dyn.lds.S37
-rw-r--r--arch/um/kernel/ksyms.c5
-rw-r--r--arch/um/kernel/physmem.c35
-rw-r--r--arch/um/kernel/trap_kern.c6
-rw-r--r--arch/um/kernel/uml.lds.S14
-rw-r--r--arch/v850/kernel/irq.c14
-rw-r--r--arch/v850/kernel/setup.c14
-rw-r--r--arch/v850/kernel/sim.c14
-rw-r--r--arch/x86_64/kernel/setup.c2
-rw-r--r--arch/x86_64/kernel/vmlinux.lds.S19
-rw-r--r--drivers/acpi/sleep/main.c8
-rw-r--r--drivers/acpi/sleep/poweroff.c4
-rw-r--r--drivers/acpi/sleep/proc.c2
-rw-r--r--drivers/base/dmapool.c3
-rw-r--r--drivers/block/cciss.c7
-rw-r--r--drivers/block/cfq-iosched.c3
-rw-r--r--drivers/block/paride/pcd.c3
-rw-r--r--drivers/block/paride/pf.c3
-rw-r--r--drivers/block/paride/pg.c3
-rw-r--r--drivers/block/paride/pt.c3
-rw-r--r--drivers/block/swim3.c9
-rw-r--r--drivers/block/swim_iop.c3
-rw-r--r--drivers/block/umem.c11
-rw-r--r--drivers/block/xd.c21
-rw-r--r--drivers/block/z2ram.c2
-rw-r--r--drivers/cdrom/sbpcd.c9
-rw-r--r--drivers/cdrom/sonycd535.c3
-rw-r--r--drivers/char/agp/backend.c7
-rw-r--r--drivers/char/applicom.c24
-rw-r--r--drivers/char/ftape/lowlevel/fdc-io.c6
-rw-r--r--drivers/char/hpet.c4
-rw-r--r--drivers/char/hw_random.c5
-rw-r--r--drivers/char/ip2/i2lib.c6
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c18
-rw-r--r--drivers/char/ipmi/ipmi_watchdog.c6
-rw-r--r--drivers/char/keyboard.c111
-rw-r--r--drivers/char/lcd.c7
-rw-r--r--drivers/char/lp.c3
-rw-r--r--drivers/char/mxser.c12
-rw-r--r--drivers/char/n_tty.c2
-rw-r--r--drivers/char/pcmcia/synclink_cs.c16
-rw-r--r--drivers/ide/ide-io.c6
-rw-r--r--drivers/ide/ide-tape.c3
-rw-r--r--drivers/ide/ide-timing.h25
-rw-r--r--drivers/ide/legacy/ide-cs.c4
-rw-r--r--drivers/input/evdev.c2
-rw-r--r--drivers/input/joystick/iforce/iforce-packets.c32
-rw-r--r--drivers/input/joystick/iforce/iforce-usb.c1
-rw-r--r--drivers/input/keyboard/atkbd.c10
-rw-r--r--drivers/input/keyboard/sunkbd.c2
-rw-r--r--drivers/input/mouse/Makefile2
-rw-r--r--drivers/input/mouse/alps.c2
-rw-r--r--drivers/input/mouse/logips2pp.c13
-rw-r--r--drivers/input/mouse/psmouse-base.c132
-rw-r--r--drivers/input/mouse/psmouse.h52
-rw-r--r--drivers/input/mouse/trackpoint.c304
-rw-r--r--drivers/input/mouse/trackpoint.h147
-rw-r--r--drivers/input/serio/i8042-io.h6
-rw-r--r--drivers/input/serio/i8042-ip22io.h2
-rw-r--r--drivers/input/serio/i8042-jazzio.h2
-rw-r--r--drivers/input/serio/i8042-sparcio.h12
-rw-r--r--drivers/input/serio/i8042-x86ia64io.h72
-rw-r--r--drivers/input/serio/i8042.c199
-rw-r--r--drivers/isdn/i4l/isdn_bsdcomp.c14
-rw-r--r--drivers/isdn/i4l/isdn_common.c3
-rw-r--r--drivers/md/dm-exception-store.c9
-rw-r--r--drivers/md/md.c4
-rw-r--r--drivers/media/common/saa7146_core.c6
-rw-r--r--drivers/media/video/cpia_usb.c30
-rw-r--r--drivers/media/video/stradis.c32
-rw-r--r--drivers/media/video/video-buf.c8
-rw-r--r--drivers/media/video/zoran_driver.c2
-rw-r--r--drivers/media/video/zr36120.c6
-rw-r--r--drivers/mfd/Kconfig9
-rw-r--r--drivers/mfd/Makefile6
-rw-r--r--drivers/mfd/ucb1x00-assabet.c73
-rw-r--r--drivers/mfd/ucb1x00-core.c665
-rw-r--r--drivers/mfd/ucb1x00-ts.c399
-rw-r--r--drivers/mfd/ucb1x00.h256
-rw-r--r--drivers/misc/hdpuftrs/hdpu_cpustate.c23
-rw-r--r--drivers/mtd/devices/mtdram.c3
-rw-r--r--drivers/mtd/ftl.c11
-rw-r--r--drivers/net/bsd_comp.c28
-rw-r--r--drivers/net/ppp_generic.c23
-rw-r--r--drivers/net/tulip/de4x5.c4
-rw-r--r--drivers/parisc/lasi.c1
-rw-r--r--drivers/parport/ieee1284.c7
-rw-r--r--drivers/parport/ieee1284_ops.c10
-rw-r--r--drivers/parport/parport_pc.c3
-rw-r--r--drivers/pci/pci-sysfs.c10
-rw-r--r--drivers/pci/probe.c6
-rw-r--r--drivers/sbus/char/bbc_envctrl.c3
-rw-r--r--drivers/sbus/char/envctrl.c4
-rw-r--r--drivers/scsi/53c7xx.c4
-rw-r--r--drivers/scsi/ch.c27
-rw-r--r--drivers/scsi/cpqfcTSinit.c3
-rw-r--r--drivers/scsi/ibmmca.c1
-rw-r--r--drivers/scsi/osst.c13
-rw-r--r--drivers/serial/8250.c2
-rw-r--r--drivers/telephony/ixj.c116
-rw-r--r--drivers/usb/input/hid-core.c76
-rw-r--r--drivers/usb/input/hid-debug.h34
-rw-r--r--drivers/usb/input/hid-input.c66
-rw-r--r--drivers/usb/input/hid.h9
-rw-r--r--drivers/usb/input/hiddev.c1
-rw-r--r--drivers/usb/media/stv680.c26
-rw-r--r--drivers/video/nvidia/nv_of.c3
-rw-r--r--drivers/video/vgastate.c15
-rw-r--r--fs/buffer.c1
-rw-r--r--fs/cifs/connect.c6
-rw-r--r--fs/cramfs/uncompress.c1
-rw-r--r--fs/dcache.c16
-rw-r--r--fs/jbd/transaction.c3
-rw-r--r--fs/jffs/intrep.c22
-rw-r--r--fs/lockd/clntproc.c3
-rw-r--r--fs/namespace.c4
-rw-r--r--fs/nfs/nfs3proc.c3
-rw-r--r--fs/nfs/nfs4proc.c12
-rw-r--r--fs/ntfs/aops.c1
-rw-r--r--fs/pipe.c6
-rw-r--r--fs/reiserfs/journal.c3
-rw-r--r--fs/reiserfs/super.c3
-rw-r--r--fs/smbfs/proc.c3
-rw-r--r--fs/xfs/linux-2.6/time.h3
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c6
-rw-r--r--fs/xfs/linux-2.6/xfs_super.c12
-rw-r--r--include/asm-alpha/spinlock.h96
-rw-r--r--include/asm-alpha/spinlock_types.h20
-rw-r--r--include/asm-arm/spinlock.h50
-rw-r--r--include/asm-arm/spinlock_types.h20
-rw-r--r--include/asm-arm/unistd.h3
-rw-r--r--include/asm-arm26/hardirq.h2
-rw-r--r--include/asm-generic/vmlinux.lds.h38
-rw-r--r--include/asm-i386/div64.h2
-rw-r--r--include/asm-i386/processor.h4
-rw-r--r--include/asm-i386/spinlock.h200
-rw-r--r--include/asm-i386/spinlock_types.h20
-rw-r--r--include/asm-ia64/spinlock.h69
-rw-r--r--include/asm-ia64/spinlock_types.h21
-rw-r--r--include/asm-m32r/spinlock.h127
-rw-r--r--include/asm-m32r/spinlock_types.h23
-rw-r--r--include/asm-mips/spinlock.h75
-rw-r--r--include/asm-mips/spinlock_types.h20
-rw-r--r--include/asm-parisc/atomic.h12
-rw-r--r--include/asm-parisc/bitops.h2
-rw-r--r--include/asm-parisc/cacheflush.h1
-rw-r--r--include/asm-parisc/processor.h1
-rw-r--r--include/asm-parisc/spinlock.h163
-rw-r--r--include/asm-parisc/spinlock_types.h21
-rw-r--r--include/asm-parisc/system.h24
-rw-r--r--include/asm-ppc/smp.h6
-rw-r--r--include/asm-ppc/spinlock.h91
-rw-r--r--include/asm-ppc/spinlock_types.h20
-rw-r--r--include/asm-ppc/system.h1
-rw-r--r--include/asm-ppc64/spinlock.h191
-rw-r--r--include/asm-ppc64/spinlock_types.h20
-rw-r--r--include/asm-s390/spinlock.h63
-rw-r--r--include/asm-s390/spinlock_types.h21
-rw-r--r--include/asm-sh/spinlock.h61
-rw-r--r--include/asm-sh/spinlock_types.h22
-rw-r--r--include/asm-sparc/spinlock.h140
-rw-r--r--include/asm-sparc/spinlock_types.h20
-rw-r--r--include/asm-sparc64/spinlock.h160
-rw-r--r--include/asm-sparc64/spinlock_types.h20
-rw-r--r--include/asm-um/page.h3
-rw-r--r--include/asm-um/pgtable.h16
-rw-r--r--include/asm-um/spinlock_types.h6
-rw-r--r--include/asm-x86_64/proto.h1
-rw-r--r--include/asm-x86_64/spinlock.h164
-rw-r--r--include/asm-x86_64/spinlock_types.h20
-rw-r--r--include/linux/bio.h7
-rw-r--r--include/linux/bit_spinlock.h77
-rw-r--r--include/linux/blkdev.h2
-rw-r--r--include/linux/chio.h2
-rw-r--r--include/linux/dmapool.h3
-rw-r--r--include/linux/fs.h2
-rw-r--r--include/linux/in6.h56
-rw-r--r--include/linux/input.h8
-rw-r--r--include/linux/ipv6.h2
-rw-r--r--include/linux/jbd.h1
-rw-r--r--include/linux/jiffies.h40
-rw-r--r--include/linux/radix-tree.h4
-rw-r--r--include/linux/reiserfs_fs.h6
-rw-r--r--include/linux/sched.h4
-rw-r--r--include/linux/slab.h3
-rw-r--r--include/linux/spinlock.h627
-rw-r--r--include/linux/spinlock_api_smp.h57
-rw-r--r--include/linux/spinlock_api_up.h80
-rw-r--r--include/linux/spinlock_types.h67
-rw-r--r--include/linux/spinlock_types_up.h51
-rw-r--r--include/linux/spinlock_up.h74
-rw-r--r--include/linux/time.h9
-rw-r--r--include/linux/writeback.h2
-rw-r--r--ipc/mqueue.c2
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/acct.c43
-rw-r--r--kernel/compat.c9
-rw-r--r--kernel/cpuset.c100
-rw-r--r--kernel/sched.c232
-rw-r--r--kernel/signal.c3
-rw-r--r--kernel/spinlock.c15
-rw-r--r--kernel/timer.c32
-rw-r--r--lib/Makefile1
-rw-r--r--lib/dec_and_lock.c3
-rw-r--r--lib/kernel_lock.c3
-rw-r--r--lib/radix-tree.c2
-rw-r--r--lib/sort.c5
-rw-r--r--lib/spinlock_debug.c257
-rw-r--r--mm/filemap.c17
-rw-r--r--mm/memory.c2
-rw-r--r--mm/oom_kill.c3
-rw-r--r--mm/page_alloc.c2
-rw-r--r--mm/slab.c4
-rw-r--r--mm/swap_state.c4
-rw-r--r--mm/swapfile.c3
-rw-r--r--net/dccp/ccids/ccid3.c166
-rw-r--r--net/dccp/ccids/ccid3.h2
-rw-r--r--net/dccp/ipv4.c4
-rw-r--r--net/dccp/output.c3
-rw-r--r--net/ipv4/tcp_output.c5
-rw-r--r--net/ipv6/exthdrs.c3
-rw-r--r--net/ipv6/netfilter/ip6t_rt.c14
-rw-r--r--scripts/Kbuild.include3
-rw-r--r--scripts/reference_discarded.pl7
-rw-r--r--sound/isa/sb/sb16_csp.c44
-rw-r--r--sound/oss/skeleton.c219
331 files changed, 6357 insertions, 4790 deletions
diff --git a/COPYING b/COPYING
index 2a7e338ec2fc..ca442d313d86 100644
--- a/COPYING
+++ b/COPYING
@@ -18,7 +18,7 @@
18 Version 2, June 1991 18 Version 2, June 1991
19 19
20 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 20 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
21 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 Everyone is permitted to copy and distribute verbatim copies 22 Everyone is permitted to copy and distribute verbatim copies
23 of this license document, but changing it is not allowed. 23 of this license document, but changing it is not allowed.
24 24
@@ -321,7 +321,7 @@ the "copyright" line and a pointer to where the full notice is found.
321 321
322 You should have received a copy of the GNU General Public License 322 You should have received a copy of the GNU General Public License
323 along with this program; if not, write to the Free Software 323 along with this program; if not, write to the Free Software
324 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 324 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
325 325
326 326
327Also add information on how to contact you by electronic and paper mail. 327Also add information on how to contact you by electronic and paper mail.
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX
index f6de52b01059..433cf5e9ae04 100644
--- a/Documentation/00-INDEX
+++ b/Documentation/00-INDEX
@@ -277,7 +277,7 @@ tty.txt
277unicode.txt 277unicode.txt
278 - info on the Unicode character/font mapping used in Linux. 278 - info on the Unicode character/font mapping used in Linux.
279uml/ 279uml/
280 - directory with infomation about User Mode Linux. 280 - directory with information about User Mode Linux.
281usb/ 281usb/
282 - directory with info regarding the Universal Serial Bus. 282 - directory with info regarding the Universal Serial Bus.
283video4linux/ 283video4linux/
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle
index f25b3953f513..22e5f9036f3c 100644
--- a/Documentation/CodingStyle
+++ b/Documentation/CodingStyle
@@ -236,6 +236,9 @@ ugly), but try to avoid excess. Instead, put the comments at the head
236of the function, telling people what it does, and possibly WHY it does 236of the function, telling people what it does, and possibly WHY it does
237it. 237it.
238 238
239When commenting the kernel API functions, please use the kerneldoc format.
240See the files Documentation/kernel-doc-nano-HOWTO.txt and scripts/kernel-doc
241for details.
239 242
240 Chapter 8: You've made a mess of it 243 Chapter 8: You've made a mess of it
241 244
diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt
index 6ee3cd6134df..1af0f2d50220 100644
--- a/Documentation/DMA-API.txt
+++ b/Documentation/DMA-API.txt
@@ -121,7 +121,7 @@ pool's device.
121 dma_addr_t addr); 121 dma_addr_t addr);
122 122
123This puts memory back into the pool. The pool is what was passed to 123This puts memory back into the pool. The pool is what was passed to
124the the pool allocation routine; the cpu and dma addresses are what 124the pool allocation routine; the cpu and dma addresses are what
125were returned when that routine allocated the memory being freed. 125were returned when that routine allocated the memory being freed.
126 126
127 127
diff --git a/Documentation/DocBook/journal-api.tmpl b/Documentation/DocBook/journal-api.tmpl
index 1ef6f43c6d8f..341aaa4ce481 100644
--- a/Documentation/DocBook/journal-api.tmpl
+++ b/Documentation/DocBook/journal-api.tmpl
@@ -116,7 +116,7 @@ filesystem. Almost.
116 116
117You still need to actually journal your filesystem changes, this 117You still need to actually journal your filesystem changes, this
118is done by wrapping them into transactions. Additionally you 118is done by wrapping them into transactions. Additionally you
119also need to wrap the modification of each of the the buffers 119also need to wrap the modification of each of the buffers
120with calls to the journal layer, so it knows what the modifications 120with calls to the journal layer, so it knows what the modifications
121you are actually making are. To do this use journal_start() which 121you are actually making are. To do this use journal_start() which
122returns a transaction handle. 122returns a transaction handle.
@@ -128,7 +128,7 @@ and its counterpart journal_stop(), which indicates the end of a transaction
128are nestable calls, so you can reenter a transaction if necessary, 128are nestable calls, so you can reenter a transaction if necessary,
129but remember you must call journal_stop() the same number of times as 129but remember you must call journal_stop() the same number of times as
130journal_start() before the transaction is completed (or more accurately 130journal_start() before the transaction is completed (or more accurately
131leaves the the update phase). Ext3/VFS makes use of this feature to simplify 131leaves the update phase). Ext3/VFS makes use of this feature to simplify
132quota support. 132quota support.
133</para> 133</para>
134 134
diff --git a/Documentation/DocBook/usb.tmpl b/Documentation/DocBook/usb.tmpl
index f3ef0bf435e9..705c442c7bf4 100644
--- a/Documentation/DocBook/usb.tmpl
+++ b/Documentation/DocBook/usb.tmpl
@@ -841,7 +841,7 @@ usbdev_ioctl (int fd, int ifno, unsigned request, void *param)
841 File modification time is not updated by this request. 841 File modification time is not updated by this request.
842 </para><para> 842 </para><para>
843 Those struct members are from some interface descriptor 843 Those struct members are from some interface descriptor
844 applying to the the current configuration. 844 applying to the current configuration.
845 The interface number is the bInterfaceNumber value, and 845 The interface number is the bInterfaceNumber value, and
846 the altsetting number is the bAlternateSetting value. 846 the altsetting number is the bAlternateSetting value.
847 (This resets each endpoint in the interface.) 847 (This resets each endpoint in the interface.)
diff --git a/Documentation/MSI-HOWTO.txt b/Documentation/MSI-HOWTO.txt
index d5032eb480aa..63edc5f847c4 100644
--- a/Documentation/MSI-HOWTO.txt
+++ b/Documentation/MSI-HOWTO.txt
@@ -430,7 +430,7 @@ which may result in system hang. The software driver of specific
430MSI-capable hardware is responsible for whether calling 430MSI-capable hardware is responsible for whether calling
431pci_enable_msi or not. A return of zero indicates the kernel 431pci_enable_msi or not. A return of zero indicates the kernel
432successfully initializes the MSI/MSI-X capability structure of the 432successfully initializes the MSI/MSI-X capability structure of the
433device funtion. The device function is now running on MSI/MSI-X mode. 433device function. The device function is now running on MSI/MSI-X mode.
434 434
4355.6 How to tell whether MSI/MSI-X is enabled on device function 4355.6 How to tell whether MSI/MSI-X is enabled on device function
436 436
diff --git a/Documentation/RCU/RTFP.txt b/Documentation/RCU/RTFP.txt
index 9c6d450138ea..fcbcbc35b122 100644
--- a/Documentation/RCU/RTFP.txt
+++ b/Documentation/RCU/RTFP.txt
@@ -2,7 +2,8 @@ Read the F-ing Papers!
2 2
3 3
4This document describes RCU-related publications, and is followed by 4This document describes RCU-related publications, and is followed by
5the corresponding bibtex entries. 5the corresponding bibtex entries. A number of the publications may
6be found at http://www.rdrop.com/users/paulmck/RCU/.
6 7
7The first thing resembling RCU was published in 1980, when Kung and Lehman 8The first thing resembling RCU was published in 1980, when Kung and Lehman
8[Kung80] recommended use of a garbage collector to defer destruction 9[Kung80] recommended use of a garbage collector to defer destruction
@@ -113,6 +114,10 @@ describing how to make RCU safe for soft-realtime applications [Sarma04c],
113and a paper describing SELinux performance with RCU [JamesMorris04b]. 114and a paper describing SELinux performance with RCU [JamesMorris04b].
114 115
115 116
1172005 has seen further adaptation of RCU to realtime use, permitting
118preemption of RCU realtime critical sections [PaulMcKenney05a,
119PaulMcKenney05b].
120
116Bibtex Entries 121Bibtex Entries
117 122
118@article{Kung80 123@article{Kung80
@@ -410,3 +415,32 @@ Oregon Health and Sciences University"
410\url{http://www.livejournal.com/users/james_morris/2153.html} 415\url{http://www.livejournal.com/users/james_morris/2153.html}
411[Viewed December 10, 2004]" 416[Viewed December 10, 2004]"
412} 417}
418
419@unpublished{PaulMcKenney05a
420,Author="Paul E. McKenney"
421,Title="{[RFC]} {RCU} and {CONFIG\_PREEMPT\_RT} progress"
422,month="May"
423,year="2005"
424,note="Available:
425\url{http://lkml.org/lkml/2005/5/9/185}
426[Viewed May 13, 2005]"
427,annotation="
428 First publication of working lock-based deferred free patches
429 for the CONFIG_PREEMPT_RT environment.
430"
431}
432
433@conference{PaulMcKenney05b
434,Author="Paul E. McKenney and Dipankar Sarma"
435,Title="Towards Hard Realtime Response from the Linux Kernel on SMP Hardware"
436,Booktitle="linux.conf.au 2005"
437,month="April"
438,year="2005"
439,address="Canberra, Australia"
440,note="Available:
441\url{http://www.rdrop.com/users/paulmck/RCU/realtimeRCU.2005.04.23a.pdf}
442[Viewed May 13, 2005]"
443,annotation="
444 Realtime turns into making RCU yet more realtime friendly.
445"
446}
diff --git a/Documentation/RCU/UP.txt b/Documentation/RCU/UP.txt
index 3bfb84b3b7db..aab4a9ec3931 100644
--- a/Documentation/RCU/UP.txt
+++ b/Documentation/RCU/UP.txt
@@ -8,7 +8,7 @@ is that since there is only one CPU, it should not be necessary to
8wait for anything else to get done, since there are no other CPUs for 8wait for anything else to get done, since there are no other CPUs for
9anything else to be happening on. Although this approach will -sort- -of- 9anything else to be happening on. Although this approach will -sort- -of-
10work a surprising amount of the time, it is a very bad idea in general. 10work a surprising amount of the time, it is a very bad idea in general.
11This document presents two examples that demonstrate exactly how bad an 11This document presents three examples that demonstrate exactly how bad an
12idea this is. 12idea this is.
13 13
14 14
@@ -26,6 +26,9 @@ from softirq, the list scan would find itself referencing a newly freed
26element B. This situation can greatly decrease the life expectancy of 26element B. This situation can greatly decrease the life expectancy of
27your kernel. 27your kernel.
28 28
29This same problem can occur if call_rcu() is invoked from a hardware
30interrupt handler.
31
29 32
30Example 2: Function-Call Fatality 33Example 2: Function-Call Fatality
31 34
@@ -44,8 +47,37 @@ its arguments would cause it to fail to make the fundamental guarantee
44underlying RCU, namely that call_rcu() defers invoking its arguments until 47underlying RCU, namely that call_rcu() defers invoking its arguments until
45all RCU read-side critical sections currently executing have completed. 48all RCU read-side critical sections currently executing have completed.
46 49
47Quick Quiz: why is it -not- legal to invoke synchronize_rcu() in 50Quick Quiz #1: why is it -not- legal to invoke synchronize_rcu() in
48this case? 51 this case?
52
53
54Example 3: Death by Deadlock
55
56Suppose that call_rcu() is invoked while holding a lock, and that the
57callback function must acquire this same lock. In this case, if
58call_rcu() were to directly invoke the callback, the result would
59be self-deadlock.
60
61In some cases, it would possible to restructure to code so that
62the call_rcu() is delayed until after the lock is released. However,
63there are cases where this can be quite ugly:
64
651. If a number of items need to be passed to call_rcu() within
66 the same critical section, then the code would need to create
67 a list of them, then traverse the list once the lock was
68 released.
69
702. In some cases, the lock will be held across some kernel API,
71 so that delaying the call_rcu() until the lock is released
72 requires that the data item be passed up via a common API.
73 It is far better to guarantee that callbacks are invoked
74 with no locks held than to have to modify such APIs to allow
75 arbitrary data items to be passed back up through them.
76
77If call_rcu() directly invokes the callback, painful locking restrictions
78or API changes would be required.
79
80Quick Quiz #2: What locking restriction must RCU callbacks respect?
49 81
50 82
51Summary 83Summary
@@ -53,12 +85,35 @@ Summary
53Permitting call_rcu() to immediately invoke its arguments or permitting 85Permitting call_rcu() to immediately invoke its arguments or permitting
54synchronize_rcu() to immediately return breaks RCU, even on a UP system. 86synchronize_rcu() to immediately return breaks RCU, even on a UP system.
55So do not do it! Even on a UP system, the RCU infrastructure -must- 87So do not do it! Even on a UP system, the RCU infrastructure -must-
56respect grace periods. 88respect grace periods, and -must- invoke callbacks from a known environment
57 89in which no locks are held.
58 90
59Answer to Quick Quiz 91
60 92Answer to Quick Quiz #1:
61The calling function is scanning an RCU-protected linked list, and 93 Why is it -not- legal to invoke synchronize_rcu() in this case?
62is therefore within an RCU read-side critical section. Therefore, 94
63the called function has been invoked within an RCU read-side critical 95 Because the calling function is scanning an RCU-protected linked
64section, and is not permitted to block. 96 list, and is therefore within an RCU read-side critical section.
97 Therefore, the called function has been invoked within an RCU
98 read-side critical section, and is not permitted to block.
99
100Answer to Quick Quiz #2:
101 What locking restriction must RCU callbacks respect?
102
103 Any lock that is acquired within an RCU callback must be
104 acquired elsewhere using an _irq variant of the spinlock
105 primitive. For example, if "mylock" is acquired by an
106 RCU callback, then a process-context acquisition of this
107 lock must use something like spin_lock_irqsave() to
108 acquire the lock.
109
110 If the process-context code were to simply use spin_lock(),
111 then, since RCU callbacks can be invoked from softirq context,
112 the callback might be called from a softirq that interrupted
113 the process-context critical section. This would result in
114 self-deadlock.
115
116 This restriction might seem gratuitous, since very few RCU
117 callbacks acquire locks directly. However, a great many RCU
118 callbacks do acquire locks -indirectly-, for example, via
119 the kfree() primitive.
diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt
index 8f3fb77c9cd3..e118a7c1a092 100644
--- a/Documentation/RCU/checklist.txt
+++ b/Documentation/RCU/checklist.txt
@@ -43,6 +43,10 @@ over a rather long period of time, but improvements are always welcome!
43 rcu_read_lock_bh()) in the read-side critical sections, 43 rcu_read_lock_bh()) in the read-side critical sections,
44 and are also an excellent aid to readability. 44 and are also an excellent aid to readability.
45 45
46 As a rough rule of thumb, any dereference of an RCU-protected
47 pointer must be covered by rcu_read_lock() or rcu_read_lock_bh()
48 or by the appropriate update-side lock.
49
463. Does the update code tolerate concurrent accesses? 503. Does the update code tolerate concurrent accesses?
47 51
48 The whole point of RCU is to permit readers to run without 52 The whole point of RCU is to permit readers to run without
@@ -90,7 +94,11 @@ over a rather long period of time, but improvements are always welcome!
90 94
91 The rcu_dereference() primitive is used by the various 95 The rcu_dereference() primitive is used by the various
92 "_rcu()" list-traversal primitives, such as the 96 "_rcu()" list-traversal primitives, such as the
93 list_for_each_entry_rcu(). 97 list_for_each_entry_rcu(). Note that it is perfectly
98 legal (if redundant) for update-side code to use
99 rcu_dereference() and the "_rcu()" list-traversal
100 primitives. This is particularly useful in code
101 that is common to readers and updaters.
94 102
95 b. If the list macros are being used, the list_add_tail_rcu() 103 b. If the list macros are being used, the list_add_tail_rcu()
96 and list_add_rcu() primitives must be used in order 104 and list_add_rcu() primitives must be used in order
@@ -150,16 +158,9 @@ over a rather long period of time, but improvements are always welcome!
150 158
151 Use of the _rcu() list-traversal primitives outside of an 159 Use of the _rcu() list-traversal primitives outside of an
152 RCU read-side critical section causes no harm other than 160 RCU read-side critical section causes no harm other than
153 a slight performance degradation on Alpha CPUs and some 161 a slight performance degradation on Alpha CPUs. It can
154 confusion on the part of people trying to read the code. 162 also be quite helpful in reducing code bloat when common
155 163 code is shared between readers and updaters.
156 Another way of thinking of this is "If you are holding the
157 lock that prevents the data structure from changing, why do
158 you also need RCU-based protection?" That said, there may
159 well be situations where use of the _rcu() list-traversal
160 primitives while the update-side lock is held results in
161 simpler and more maintainable code. The jury is still out
162 on this question.
163 164
16410. Conversely, if you are in an RCU read-side critical section, 16510. Conversely, if you are in an RCU read-side critical section,
165 you -must- use the "_rcu()" variants of the list macros. 166 you -must- use the "_rcu()" variants of the list macros.
diff --git a/Documentation/RCU/rcu.txt b/Documentation/RCU/rcu.txt
index eb444006683e..6fa092251586 100644
--- a/Documentation/RCU/rcu.txt
+++ b/Documentation/RCU/rcu.txt
@@ -64,6 +64,54 @@ o I hear that RCU is patented? What is with that?
64 Of these, one was allowed to lapse by the assignee, and the 64 Of these, one was allowed to lapse by the assignee, and the
65 others have been contributed to the Linux kernel under GPL. 65 others have been contributed to the Linux kernel under GPL.
66 66
67o I hear that RCU needs work in order to support realtime kernels?
68
69 Yes, work in progress.
70
67o Where can I find more information on RCU? 71o Where can I find more information on RCU?
68 72
69 See the RTFP.txt file in this directory. 73 See the RTFP.txt file in this directory.
74 Or point your browser at http://www.rdrop.com/users/paulmck/RCU/.
75
76o What are all these files in this directory?
77
78
79 NMI-RCU.txt
80
81 Describes how to use RCU to implement dynamic
82 NMI handlers, which can be revectored on the fly,
83 without rebooting.
84
85 RTFP.txt
86
87 List of RCU-related publications and web sites.
88
89 UP.txt
90
91 Discussion of RCU usage in UP kernels.
92
93 arrayRCU.txt
94
95 Describes how to use RCU to protect arrays, with
96 resizeable arrays whose elements reference other
97 data structures being of the most interest.
98
99 checklist.txt
100
101 Lists things to check for when inspecting code that
102 uses RCU.
103
104 listRCU.txt
105
106 Describes how to use RCU to protect linked lists.
107 This is the simplest and most common use of RCU
108 in the Linux kernel.
109
110 rcu.txt
111
112 You are reading it!
113
114 whatisRCU.txt
115
116 Overview of how the RCU implementation works. Along
117 the way, presents a conceptual view of RCU.
diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt
new file mode 100644
index 000000000000..354d89c78377
--- /dev/null
+++ b/Documentation/RCU/whatisRCU.txt
@@ -0,0 +1,902 @@
1What is RCU?
2
3RCU is a synchronization mechanism that was added to the Linux kernel
4during the 2.5 development effort that is optimized for read-mostly
5situations. Although RCU is actually quite simple once you understand it,
6getting there can sometimes be a challenge. Part of the problem is that
7most of the past descriptions of RCU have been written with the mistaken
8assumption that there is "one true way" to describe RCU. Instead,
9the experience has been that different people must take different paths
10to arrive at an understanding of RCU. This document provides several
11different paths, as follows:
12
131. RCU OVERVIEW
142. WHAT IS RCU'S CORE API?
153. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
164. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
175. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
186. ANALOGY WITH READER-WRITER LOCKING
197. FULL LIST OF RCU APIs
208. ANSWERS TO QUICK QUIZZES
21
22People who prefer starting with a conceptual overview should focus on
23Section 1, though most readers will profit by reading this section at
24some point. People who prefer to start with an API that they can then
25experiment with should focus on Section 2. People who prefer to start
26with example uses should focus on Sections 3 and 4. People who need to
27understand the RCU implementation should focus on Section 5, then dive
28into the kernel source code. People who reason best by analogy should
29focus on Section 6. Section 7 serves as an index to the docbook API
30documentation, and Section 8 is the traditional answer key.
31
32So, start with the section that makes the most sense to you and your
33preferred method of learning. If you need to know everything about
34everything, feel free to read the whole thing -- but if you are really
35that type of person, you have perused the source code and will therefore
36never need this document anyway. ;-)
37
38
391. RCU OVERVIEW
40
41The basic idea behind RCU is to split updates into "removal" and
42"reclamation" phases. The removal phase removes references to data items
43within a data structure (possibly by replacing them with references to
44new versions of these data items), and can run concurrently with readers.
45The reason that it is safe to run the removal phase concurrently with
46readers is the semantics of modern CPUs guarantee that readers will see
47either the old or the new version of the data structure rather than a
48partially updated reference. The reclamation phase does the work of reclaiming
49(e.g., freeing) the data items removed from the data structure during the
50removal phase. Because reclaiming data items can disrupt any readers
51concurrently referencing those data items, the reclamation phase must
52not start until readers no longer hold references to those data items.
53
54Splitting the update into removal and reclamation phases permits the
55updater to perform the removal phase immediately, and to defer the
56reclamation phase until all readers active during the removal phase have
57completed, either by blocking until they finish or by registering a
58callback that is invoked after they finish. Only readers that are active
59during the removal phase need be considered, because any reader starting
60after the removal phase will be unable to gain a reference to the removed
61data items, and therefore cannot be disrupted by the reclamation phase.
62
63So the typical RCU update sequence goes something like the following:
64
65a. Remove pointers to a data structure, so that subsequent
66 readers cannot gain a reference to it.
67
68b. Wait for all previous readers to complete their RCU read-side
69 critical sections.
70
71c. At this point, there cannot be any readers who hold references
72 to the data structure, so it now may safely be reclaimed
73 (e.g., kfree()d).
74
75Step (b) above is the key idea underlying RCU's deferred destruction.
76The ability to wait until all readers are done allows RCU readers to
77use much lighter-weight synchronization, in some cases, absolutely no
78synchronization at all. In contrast, in more conventional lock-based
79schemes, readers must use heavy-weight synchronization in order to
80prevent an updater from deleting the data structure out from under them.
81This is because lock-based updaters typically update data items in place,
82and must therefore exclude readers. In contrast, RCU-based updaters
83typically take advantage of the fact that writes to single aligned
84pointers are atomic on modern CPUs, allowing atomic insertion, removal,
85and replacement of data items in a linked structure without disrupting
86readers. Concurrent RCU readers can then continue accessing the old
87versions, and can dispense with the atomic operations, memory barriers,
88and communications cache misses that are so expensive on present-day
89SMP computer systems, even in absence of lock contention.
90
91In the three-step procedure shown above, the updater is performing both
92the removal and the reclamation step, but it is often helpful for an
93entirely different thread to do the reclamation, as is in fact the case
94in the Linux kernel's directory-entry cache (dcache). Even if the same
95thread performs both the update step (step (a) above) and the reclamation
96step (step (c) above), it is often helpful to think of them separately.
97For example, RCU readers and updaters need not communicate at all,
98but RCU provides implicit low-overhead communication between readers
99and reclaimers, namely, in step (b) above.
100
101So how the heck can a reclaimer tell when a reader is done, given
102that readers are not doing any sort of synchronization operations???
103Read on to learn about how RCU's API makes this easy.
104
105
1062. WHAT IS RCU'S CORE API?
107
108The core RCU API is quite small:
109
110a. rcu_read_lock()
111b. rcu_read_unlock()
112c. synchronize_rcu() / call_rcu()
113d. rcu_assign_pointer()
114e. rcu_dereference()
115
116There are many other members of the RCU API, but the rest can be
117expressed in terms of these five, though most implementations instead
118express synchronize_rcu() in terms of the call_rcu() callback API.
119
120The five core RCU APIs are described below, the other 18 will be enumerated
121later. See the kernel docbook documentation for more info, or look directly
122at the function header comments.
123
124rcu_read_lock()
125
126 void rcu_read_lock(void);
127
128 Used by a reader to inform the reclaimer that the reader is
129 entering an RCU read-side critical section. It is illegal
130 to block while in an RCU read-side critical section, though
131 kernels built with CONFIG_PREEMPT_RCU can preempt RCU read-side
132 critical sections. Any RCU-protected data structure accessed
133 during an RCU read-side critical section is guaranteed to remain
134 unreclaimed for the full duration of that critical section.
135 Reference counts may be used in conjunction with RCU to maintain
136 longer-term references to data structures.
137
138rcu_read_unlock()
139
140 void rcu_read_unlock(void);
141
142 Used by a reader to inform the reclaimer that the reader is
143 exiting an RCU read-side critical section. Note that RCU
144 read-side critical sections may be nested and/or overlapping.
145
146synchronize_rcu()
147
148 void synchronize_rcu(void);
149
150 Marks the end of updater code and the beginning of reclaimer
151 code. It does this by blocking until all pre-existing RCU
152 read-side critical sections on all CPUs have completed.
153 Note that synchronize_rcu() will -not- necessarily wait for
154 any subsequent RCU read-side critical sections to complete.
155 For example, consider the following sequence of events:
156
157 CPU 0 CPU 1 CPU 2
158 ----------------- ------------------------- ---------------
159 1. rcu_read_lock()
160 2. enters synchronize_rcu()
161 3. rcu_read_lock()
162 4. rcu_read_unlock()
163 5. exits synchronize_rcu()
164 6. rcu_read_unlock()
165
166 To reiterate, synchronize_rcu() waits only for ongoing RCU
167 read-side critical sections to complete, not necessarily for
168 any that begin after synchronize_rcu() is invoked.
169
170 Of course, synchronize_rcu() does not necessarily return
171 -immediately- after the last pre-existing RCU read-side critical
172 section completes. For one thing, there might well be scheduling
173 delays. For another thing, many RCU implementations process
174 requests in batches in order to improve efficiencies, which can
175 further delay synchronize_rcu().
176
177 Since synchronize_rcu() is the API that must figure out when
178 readers are done, its implementation is key to RCU. For RCU
179 to be useful in all but the most read-intensive situations,
180 synchronize_rcu()'s overhead must also be quite small.
181
182 The call_rcu() API is a callback form of synchronize_rcu(),
183 and is described in more detail in a later section. Instead of
184 blocking, it registers a function and argument which are invoked
185 after all ongoing RCU read-side critical sections have completed.
186 This callback variant is particularly useful in situations where
187 it is illegal to block.
188
189rcu_assign_pointer()
190
191 typeof(p) rcu_assign_pointer(p, typeof(p) v);
192
193 Yes, rcu_assign_pointer() -is- implemented as a macro, though it
194 would be cool to be able to declare a function in this manner.
195 (Compiler experts will no doubt disagree.)
196
197 The updater uses this function to assign a new value to an
198 RCU-protected pointer, in order to safely communicate the change
199 in value from the updater to the reader. This function returns
200 the new value, and also executes any memory-barrier instructions
201 required for a given CPU architecture.
202
203 Perhaps more important, it serves to document which pointers
204 are protected by RCU. That said, rcu_assign_pointer() is most
205 frequently used indirectly, via the _rcu list-manipulation
206 primitives such as list_add_rcu().
207
208rcu_dereference()
209
210 typeof(p) rcu_dereference(p);
211
212 Like rcu_assign_pointer(), rcu_dereference() must be implemented
213 as a macro.
214
215 The reader uses rcu_dereference() to fetch an RCU-protected
216 pointer, which returns a value that may then be safely
217 dereferenced. Note that rcu_deference() does not actually
218 dereference the pointer, instead, it protects the pointer for
219 later dereferencing. It also executes any needed memory-barrier
220 instructions for a given CPU architecture. Currently, only Alpha
221 needs memory barriers within rcu_dereference() -- on other CPUs,
222 it compiles to nothing, not even a compiler directive.
223
224 Common coding practice uses rcu_dereference() to copy an
225 RCU-protected pointer to a local variable, then dereferences
226 this local variable, for example as follows:
227
228 p = rcu_dereference(head.next);
229 return p->data;
230
231 However, in this case, one could just as easily combine these
232 into one statement:
233
234 return rcu_dereference(head.next)->data;
235
236 If you are going to be fetching multiple fields from the
237 RCU-protected structure, using the local variable is of
238 course preferred. Repeated rcu_dereference() calls look
239 ugly and incur unnecessary overhead on Alpha CPUs.
240
241 Note that the value returned by rcu_dereference() is valid
242 only within the enclosing RCU read-side critical section.
243 For example, the following is -not- legal:
244
245 rcu_read_lock();
246 p = rcu_dereference(head.next);
247 rcu_read_unlock();
248 x = p->address;
249 rcu_read_lock();
250 y = p->data;
251 rcu_read_unlock();
252
253 Holding a reference from one RCU read-side critical section
254 to another is just as illegal as holding a reference from
255 one lock-based critical section to another! Similarly,
256 using a reference outside of the critical section in which
257 it was acquired is just as illegal as doing so with normal
258 locking.
259
260 As with rcu_assign_pointer(), an important function of
261 rcu_dereference() is to document which pointers are protected
262 by RCU. And, again like rcu_assign_pointer(), rcu_dereference()
263 is typically used indirectly, via the _rcu list-manipulation
264 primitives, such as list_for_each_entry_rcu().
265
266The following diagram shows how each API communicates among the
267reader, updater, and reclaimer.
268
269
270 rcu_assign_pointer()
271 +--------+
272 +---------------------->| reader |---------+
273 | +--------+ |
274 | | |
275 | | | Protect:
276 | | | rcu_read_lock()
277 | | | rcu_read_unlock()
278 | rcu_dereference() | |
279 +---------+ | |
280 | updater |<---------------------+ |
281 +---------+ V
282 | +-----------+
283 +----------------------------------->| reclaimer |
284 +-----------+
285 Defer:
286 synchronize_rcu() & call_rcu()
287
288
289The RCU infrastructure observes the time sequence of rcu_read_lock(),
290rcu_read_unlock(), synchronize_rcu(), and call_rcu() invocations in
291order to determine when (1) synchronize_rcu() invocations may return
292to their callers and (2) call_rcu() callbacks may be invoked. Efficient
293implementations of the RCU infrastructure make heavy use of batching in
294order to amortize their overhead over many uses of the corresponding APIs.
295
296There are no fewer than three RCU mechanisms in the Linux kernel; the
297diagram above shows the first one, which is by far the most commonly used.
298The rcu_dereference() and rcu_assign_pointer() primitives are used for
299all three mechanisms, but different defer and protect primitives are
300used as follows:
301
302 Defer Protect
303
304a. synchronize_rcu() rcu_read_lock() / rcu_read_unlock()
305 call_rcu()
306
307b. call_rcu_bh() rcu_read_lock_bh() / rcu_read_unlock_bh()
308
309c. synchronize_sched() preempt_disable() / preempt_enable()
310 local_irq_save() / local_irq_restore()
311 hardirq enter / hardirq exit
312 NMI enter / NMI exit
313
314These three mechanisms are used as follows:
315
316a. RCU applied to normal data structures.
317
318b. RCU applied to networking data structures that may be subjected
319 to remote denial-of-service attacks.
320
321c. RCU applied to scheduler and interrupt/NMI-handler tasks.
322
323Again, most uses will be of (a). The (b) and (c) cases are important
324for specialized uses, but are relatively uncommon.
325
326
3273. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
328
329This section shows a simple use of the core RCU API to protect a
330global pointer to a dynamically allocated structure. More typical
331uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
332
333 struct foo {
334 int a;
335 char b;
336 long c;
337 };
338 DEFINE_SPINLOCK(foo_mutex);
339
340 struct foo *gbl_foo;
341
342 /*
343 * Create a new struct foo that is the same as the one currently
344 * pointed to by gbl_foo, except that field "a" is replaced
345 * with "new_a". Points gbl_foo to the new structure, and
346 * frees up the old structure after a grace period.
347 *
348 * Uses rcu_assign_pointer() to ensure that concurrent readers
349 * see the initialized version of the new structure.
350 *
351 * Uses synchronize_rcu() to ensure that any readers that might
352 * have references to the old structure complete before freeing
353 * the old structure.
354 */
355 void foo_update_a(int new_a)
356 {
357 struct foo *new_fp;
358 struct foo *old_fp;
359
360 new_fp = kmalloc(sizeof(*fp), GFP_KERNEL);
361 spin_lock(&foo_mutex);
362 old_fp = gbl_foo;
363 *new_fp = *old_fp;
364 new_fp->a = new_a;
365 rcu_assign_pointer(gbl_foo, new_fp);
366 spin_unlock(&foo_mutex);
367 synchronize_rcu();
368 kfree(old_fp);
369 }
370
371 /*
372 * Return the value of field "a" of the current gbl_foo
373 * structure. Use rcu_read_lock() and rcu_read_unlock()
374 * to ensure that the structure does not get deleted out
375 * from under us, and use rcu_dereference() to ensure that
376 * we see the initialized version of the structure (important
377 * for DEC Alpha and for people reading the code).
378 */
379 int foo_get_a(void)
380 {
381 int retval;
382
383 rcu_read_lock();
384 retval = rcu_dereference(gbl_foo)->a;
385 rcu_read_unlock();
386 return retval;
387 }
388
389So, to sum up:
390
391o Use rcu_read_lock() and rcu_read_unlock() to guard RCU
392 read-side critical sections.
393
394o Within an RCU read-side critical section, use rcu_dereference()
395 to dereference RCU-protected pointers.
396
397o Use some solid scheme (such as locks or semaphores) to
398 keep concurrent updates from interfering with each other.
399
400o Use rcu_assign_pointer() to update an RCU-protected pointer.
401 This primitive protects concurrent readers from the updater,
402 -not- concurrent updates from each other! You therefore still
403 need to use locking (or something similar) to keep concurrent
404 rcu_assign_pointer() primitives from interfering with each other.
405
406o Use synchronize_rcu() -after- removing a data element from an
407 RCU-protected data structure, but -before- reclaiming/freeing
408 the data element, in order to wait for the completion of all
409 RCU read-side critical sections that might be referencing that
410 data item.
411
412See checklist.txt for additional rules to follow when using RCU.
413
414
4154. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
416
417In the example above, foo_update_a() blocks until a grace period elapses.
418This is quite simple, but in some cases one cannot afford to wait so
419long -- there might be other high-priority work to be done.
420
421In such cases, one uses call_rcu() rather than synchronize_rcu().
422The call_rcu() API is as follows:
423
424 void call_rcu(struct rcu_head * head,
425 void (*func)(struct rcu_head *head));
426
427This function invokes func(head) after a grace period has elapsed.
428This invocation might happen from either softirq or process context,
429so the function is not permitted to block. The foo struct needs to
430have an rcu_head structure added, perhaps as follows:
431
432 struct foo {
433 int a;
434 char b;
435 long c;
436 struct rcu_head rcu;
437 };
438
439The foo_update_a() function might then be written as follows:
440
441 /*
442 * Create a new struct foo that is the same as the one currently
443 * pointed to by gbl_foo, except that field "a" is replaced
444 * with "new_a". Points gbl_foo to the new structure, and
445 * frees up the old structure after a grace period.
446 *
447 * Uses rcu_assign_pointer() to ensure that concurrent readers
448 * see the initialized version of the new structure.
449 *
450 * Uses call_rcu() to ensure that any readers that might have
451 * references to the old structure complete before freeing the
452 * old structure.
453 */
454 void foo_update_a(int new_a)
455 {
456 struct foo *new_fp;
457 struct foo *old_fp;
458
459 new_fp = kmalloc(sizeof(*fp), GFP_KERNEL);
460 spin_lock(&foo_mutex);
461 old_fp = gbl_foo;
462 *new_fp = *old_fp;
463 new_fp->a = new_a;
464 rcu_assign_pointer(gbl_foo, new_fp);
465 spin_unlock(&foo_mutex);
466 call_rcu(&old_fp->rcu, foo_reclaim);
467 }
468
469The foo_reclaim() function might appear as follows:
470
471 void foo_reclaim(struct rcu_head *rp)
472 {
473 struct foo *fp = container_of(rp, struct foo, rcu);
474
475 kfree(fp);
476 }
477
478The container_of() primitive is a macro that, given a pointer into a
479struct, the type of the struct, and the pointed-to field within the
480struct, returns a pointer to the beginning of the struct.
481
482The use of call_rcu() permits the caller of foo_update_a() to
483immediately regain control, without needing to worry further about the
484old version of the newly updated element. It also clearly shows the
485RCU distinction between updater, namely foo_update_a(), and reclaimer,
486namely foo_reclaim().
487
488The summary of advice is the same as for the previous section, except
489that we are now using call_rcu() rather than synchronize_rcu():
490
491o Use call_rcu() -after- removing a data element from an
492 RCU-protected data structure in order to register a callback
493 function that will be invoked after the completion of all RCU
494 read-side critical sections that might be referencing that
495 data item.
496
497Again, see checklist.txt for additional rules governing the use of RCU.
498
499
5005. WHAT ARE SOME SIMPLE IMPLEMENTATIONS OF RCU?
501
502One of the nice things about RCU is that it has extremely simple "toy"
503implementations that are a good first step towards understanding the
504production-quality implementations in the Linux kernel. This section
505presents two such "toy" implementations of RCU, one that is implemented
506in terms of familiar locking primitives, and another that more closely
507resembles "classic" RCU. Both are way too simple for real-world use,
508lacking both functionality and performance. However, they are useful
509in getting a feel for how RCU works. See kernel/rcupdate.c for a
510production-quality implementation, and see:
511
512 http://www.rdrop.com/users/paulmck/RCU
513
514for papers describing the Linux kernel RCU implementation. The OLS'01
515and OLS'02 papers are a good introduction, and the dissertation provides
516more details on the current implementation.
517
518
5195A. "TOY" IMPLEMENTATION #1: LOCKING
520
521This section presents a "toy" RCU implementation that is based on
522familiar locking primitives. Its overhead makes it a non-starter for
523real-life use, as does its lack of scalability. It is also unsuitable
524for realtime use, since it allows scheduling latency to "bleed" from
525one read-side critical section to another.
526
527However, it is probably the easiest implementation to relate to, so is
528a good starting point.
529
530It is extremely simple:
531
532 static DEFINE_RWLOCK(rcu_gp_mutex);
533
534 void rcu_read_lock(void)
535 {
536 read_lock(&rcu_gp_mutex);
537 }
538
539 void rcu_read_unlock(void)
540 {
541 read_unlock(&rcu_gp_mutex);
542 }
543
544 void synchronize_rcu(void)
545 {
546 write_lock(&rcu_gp_mutex);
547 write_unlock(&rcu_gp_mutex);
548 }
549
550[You can ignore rcu_assign_pointer() and rcu_dereference() without
551missing much. But here they are anyway. And whatever you do, don't
552forget about them when submitting patches making use of RCU!]
553
554 #define rcu_assign_pointer(p, v) ({ \
555 smp_wmb(); \
556 (p) = (v); \
557 })
558
559 #define rcu_dereference(p) ({ \
560 typeof(p) _________p1 = p; \
561 smp_read_barrier_depends(); \
562 (_________p1); \
563 })
564
565
566The rcu_read_lock() and rcu_read_unlock() primitive read-acquire
567and release a global reader-writer lock. The synchronize_rcu()
568primitive write-acquires this same lock, then immediately releases
569it. This means that once synchronize_rcu() exits, all RCU read-side
570critical sections that were in progress before synchonize_rcu() was
571called are guaranteed to have completed -- there is no way that
572synchronize_rcu() would have been able to write-acquire the lock
573otherwise.
574
575It is possible to nest rcu_read_lock(), since reader-writer locks may
576be recursively acquired. Note also that rcu_read_lock() is immune
577from deadlock (an important property of RCU). The reason for this is
578that the only thing that can block rcu_read_lock() is a synchronize_rcu().
579But synchronize_rcu() does not acquire any locks while holding rcu_gp_mutex,
580so there can be no deadlock cycle.
581
582Quick Quiz #1: Why is this argument naive? How could a deadlock
583 occur when using this algorithm in a real-world Linux
584 kernel? How could this deadlock be avoided?
585
586
5875B. "TOY" EXAMPLE #2: CLASSIC RCU
588
589This section presents a "toy" RCU implementation that is based on
590"classic RCU". It is also short on performance (but only for updates) and
591on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT
592kernels. The definitions of rcu_dereference() and rcu_assign_pointer()
593are the same as those shown in the preceding section, so they are omitted.
594
595 void rcu_read_lock(void) { }
596
597 void rcu_read_unlock(void) { }
598
599 void synchronize_rcu(void)
600 {
601 int cpu;
602
603 for_each_cpu(cpu)
604 run_on(cpu);
605 }
606
607Note that rcu_read_lock() and rcu_read_unlock() do absolutely nothing.
608This is the great strength of classic RCU in a non-preemptive kernel:
609read-side overhead is precisely zero, at least on non-Alpha CPUs.
610And there is absolutely no way that rcu_read_lock() can possibly
611participate in a deadlock cycle!
612
613The implementation of synchronize_rcu() simply schedules itself on each
614CPU in turn. The run_on() primitive can be implemented straightforwardly
615in terms of the sched_setaffinity() primitive. Of course, a somewhat less
616"toy" implementation would restore the affinity upon completion rather
617than just leaving all tasks running on the last CPU, but when I said
618"toy", I meant -toy-!
619
620So how the heck is this supposed to work???
621
622Remember that it is illegal to block while in an RCU read-side critical
623section. Therefore, if a given CPU executes a context switch, we know
624that it must have completed all preceding RCU read-side critical sections.
625Once -all- CPUs have executed a context switch, then -all- preceding
626RCU read-side critical sections will have completed.
627
628So, suppose that we remove a data item from its structure and then invoke
629synchronize_rcu(). Once synchronize_rcu() returns, we are guaranteed
630that there are no RCU read-side critical sections holding a reference
631to that data item, so we can safely reclaim it.
632
633Quick Quiz #2: Give an example where Classic RCU's read-side
634 overhead is -negative-.
635
636Quick Quiz #3: If it is illegal to block in an RCU read-side
637 critical section, what the heck do you do in
638 PREEMPT_RT, where normal spinlocks can block???
639
640
6416. ANALOGY WITH READER-WRITER LOCKING
642
643Although RCU can be used in many different ways, a very common use of
644RCU is analogous to reader-writer locking. The following unified
645diff shows how closely related RCU and reader-writer locking can be.
646
647 @@ -13,15 +14,15 @@
648 struct list_head *lp;
649 struct el *p;
650
651 - read_lock();
652 - list_for_each_entry(p, head, lp) {
653 + rcu_read_lock();
654 + list_for_each_entry_rcu(p, head, lp) {
655 if (p->key == key) {
656 *result = p->data;
657 - read_unlock();
658 + rcu_read_unlock();
659 return 1;
660 }
661 }
662 - read_unlock();
663 + rcu_read_unlock();
664 return 0;
665 }
666
667 @@ -29,15 +30,16 @@
668 {
669 struct el *p;
670
671 - write_lock(&listmutex);
672 + spin_lock(&listmutex);
673 list_for_each_entry(p, head, lp) {
674 if (p->key == key) {
675 list_del(&p->list);
676 - write_unlock(&listmutex);
677 + spin_unlock(&listmutex);
678 + synchronize_rcu();
679 kfree(p);
680 return 1;
681 }
682 }
683 - write_unlock(&listmutex);
684 + spin_unlock(&listmutex);
685 return 0;
686 }
687
688Or, for those who prefer a side-by-side listing:
689
690 1 struct el { 1 struct el {
691 2 struct list_head list; 2 struct list_head list;
692 3 long key; 3 long key;
693 4 spinlock_t mutex; 4 spinlock_t mutex;
694 5 int data; 5 int data;
695 6 /* Other data fields */ 6 /* Other data fields */
696 7 }; 7 };
697 8 spinlock_t listmutex; 8 spinlock_t listmutex;
698 9 struct el head; 9 struct el head;
699
700 1 int search(long key, int *result) 1 int search(long key, int *result)
701 2 { 2 {
702 3 struct list_head *lp; 3 struct list_head *lp;
703 4 struct el *p; 4 struct el *p;
704 5 5
705 6 read_lock(); 6 rcu_read_lock();
706 7 list_for_each_entry(p, head, lp) { 7 list_for_each_entry_rcu(p, head, lp) {
707 8 if (p->key == key) { 8 if (p->key == key) {
708 9 *result = p->data; 9 *result = p->data;
70910 read_unlock(); 10 rcu_read_unlock();
71011 return 1; 11 return 1;
71112 } 12 }
71213 } 13 }
71314 read_unlock(); 14 rcu_read_unlock();
71415 return 0; 15 return 0;
71516 } 16 }
716
717 1 int delete(long key) 1 int delete(long key)
718 2 { 2 {
719 3 struct el *p; 3 struct el *p;
720 4 4
721 5 write_lock(&listmutex); 5 spin_lock(&listmutex);
722 6 list_for_each_entry(p, head, lp) { 6 list_for_each_entry(p, head, lp) {
723 7 if (p->key == key) { 7 if (p->key == key) {
724 8 list_del(&p->list); 8 list_del(&p->list);
725 9 write_unlock(&listmutex); 9 spin_unlock(&listmutex);
726 10 synchronize_rcu();
72710 kfree(p); 11 kfree(p);
72811 return 1; 12 return 1;
72912 } 13 }
73013 } 14 }
73114 write_unlock(&listmutex); 15 spin_unlock(&listmutex);
73215 return 0; 16 return 0;
73316 } 17 }
734
735Either way, the differences are quite small. Read-side locking moves
736to rcu_read_lock() and rcu_read_unlock, update-side locking moves from
737from a reader-writer lock to a simple spinlock, and a synchronize_rcu()
738precedes the kfree().
739
740However, there is one potential catch: the read-side and update-side
741critical sections can now run concurrently. In many cases, this will
742not be a problem, but it is necessary to check carefully regardless.
743For example, if multiple independent list updates must be seen as
744a single atomic update, converting to RCU will require special care.
745
746Also, the presence of synchronize_rcu() means that the RCU version of
747delete() can now block. If this is a problem, there is a callback-based
748mechanism that never blocks, namely call_rcu(), that can be used in
749place of synchronize_rcu().
750
751
7527. FULL LIST OF RCU APIs
753
754The RCU APIs are documented in docbook-format header comments in the
755Linux-kernel source code, but it helps to have a full list of the
756APIs, since there does not appear to be a way to categorize them
757in docbook. Here is the list, by category.
758
759Markers for RCU read-side critical sections:
760
761 rcu_read_lock
762 rcu_read_unlock
763 rcu_read_lock_bh
764 rcu_read_unlock_bh
765
766RCU pointer/list traversal:
767
768 rcu_dereference
769 list_for_each_rcu (to be deprecated in favor of
770 list_for_each_entry_rcu)
771 list_for_each_safe_rcu (deprecated, not used)
772 list_for_each_entry_rcu
773 list_for_each_continue_rcu (to be deprecated in favor of new
774 list_for_each_entry_continue_rcu)
775 hlist_for_each_rcu (to be deprecated in favor of
776 hlist_for_each_entry_rcu)
777 hlist_for_each_entry_rcu
778
779RCU pointer update:
780
781 rcu_assign_pointer
782 list_add_rcu
783 list_add_tail_rcu
784 list_del_rcu
785 list_replace_rcu
786 hlist_del_rcu
787 hlist_add_head_rcu
788
789RCU grace period:
790
791 synchronize_kernel (deprecated)
792 synchronize_net
793 synchronize_sched
794 synchronize_rcu
795 call_rcu
796 call_rcu_bh
797
798See the comment headers in the source code (or the docbook generated
799from them) for more information.
800
801
8028. ANSWERS TO QUICK QUIZZES
803
804Quick Quiz #1: Why is this argument naive? How could a deadlock
805 occur when using this algorithm in a real-world Linux
806 kernel? [Referring to the lock-based "toy" RCU
807 algorithm.]
808
809Answer: Consider the following sequence of events:
810
811 1. CPU 0 acquires some unrelated lock, call it
812 "problematic_lock".
813
814 2. CPU 1 enters synchronize_rcu(), write-acquiring
815 rcu_gp_mutex.
816
817 3. CPU 0 enters rcu_read_lock(), but must wait
818 because CPU 1 holds rcu_gp_mutex.
819
820 4. CPU 1 is interrupted, and the irq handler
821 attempts to acquire problematic_lock.
822
823 The system is now deadlocked.
824
825 One way to avoid this deadlock is to use an approach like
826 that of CONFIG_PREEMPT_RT, where all normal spinlocks
827 become blocking locks, and all irq handlers execute in
828 the context of special tasks. In this case, in step 4
829 above, the irq handler would block, allowing CPU 1 to
830 release rcu_gp_mutex, avoiding the deadlock.
831
832 Even in the absence of deadlock, this RCU implementation
833 allows latency to "bleed" from readers to other
834 readers through synchronize_rcu(). To see this,
835 consider task A in an RCU read-side critical section
836 (thus read-holding rcu_gp_mutex), task B blocked
837 attempting to write-acquire rcu_gp_mutex, and
838 task C blocked in rcu_read_lock() attempting to
839 read_acquire rcu_gp_mutex. Task A's RCU read-side
840 latency is holding up task C, albeit indirectly via
841 task B.
842
843 Realtime RCU implementations therefore use a counter-based
844 approach where tasks in RCU read-side critical sections
845 cannot be blocked by tasks executing synchronize_rcu().
846
847Quick Quiz #2: Give an example where Classic RCU's read-side
848 overhead is -negative-.
849
850Answer: Imagine a single-CPU system with a non-CONFIG_PREEMPT
851 kernel where a routing table is used by process-context
852 code, but can be updated by irq-context code (for example,
853 by an "ICMP REDIRECT" packet). The usual way of handling
854 this would be to have the process-context code disable
855 interrupts while searching the routing table. Use of
856 RCU allows such interrupt-disabling to be dispensed with.
857 Thus, without RCU, you pay the cost of disabling interrupts,
858 and with RCU you don't.
859
860 One can argue that the overhead of RCU in this
861 case is negative with respect to the single-CPU
862 interrupt-disabling approach. Others might argue that
863 the overhead of RCU is merely zero, and that replacing
864 the positive overhead of the interrupt-disabling scheme
865 with the zero-overhead RCU scheme does not constitute
866 negative overhead.
867
868 In real life, of course, things are more complex. But
869 even the theoretical possibility of negative overhead for
870 a synchronization primitive is a bit unexpected. ;-)
871
872Quick Quiz #3: If it is illegal to block in an RCU read-side
873 critical section, what the heck do you do in
874 PREEMPT_RT, where normal spinlocks can block???
875
876Answer: Just as PREEMPT_RT permits preemption of spinlock
877 critical sections, it permits preemption of RCU
878 read-side critical sections. It also permits
879 spinlocks blocking while in RCU read-side critical
880 sections.
881
882 Why the apparent inconsistency? Because it is it
883 possible to use priority boosting to keep the RCU
884 grace periods short if need be (for example, if running
885 short of memory). In contrast, if blocking waiting
886 for (say) network reception, there is no way to know
887 what should be boosted. Especially given that the
888 process we need to boost might well be a human being
889 who just went out for a pizza or something. And although
890 a computer-operated cattle prod might arouse serious
891 interest, it might also provoke serious objections.
892 Besides, how does the computer know what pizza parlor
893 the human being went to???
894
895
896ACKNOWLEDGEMENTS
897
898My thanks to the people who helped make this human-readable, including
899Jon Walpole, Josh Triplett, Serge Hallyn, and Suzanne Wood.
900
901
902For more information, see http://www.rdrop.com/users/paulmck/RCU.
diff --git a/Documentation/cpu-freq/cpufreq-stats.txt b/Documentation/cpu-freq/cpufreq-stats.txt
index e2d1e760b4ba..6a82948ff4bd 100644
--- a/Documentation/cpu-freq/cpufreq-stats.txt
+++ b/Documentation/cpu-freq/cpufreq-stats.txt
@@ -36,7 +36,7 @@ cpufreq stats provides following statistics (explained in detail below).
36 36
37All the statistics will be from the time the stats driver has been inserted 37All the statistics will be from the time the stats driver has been inserted
38to the time when a read of a particular statistic is done. Obviously, stats 38to the time when a read of a particular statistic is done. Obviously, stats
39driver will not have any information about the the frequcny transitions before 39driver will not have any information about the frequency transitions before
40the stats driver insertion. 40the stats driver insertion.
41 41
42-------------------------------------------------------------------------------- 42--------------------------------------------------------------------------------
diff --git a/Documentation/cpusets.txt b/Documentation/cpusets.txt
index 47f4114fbf54..d17b7d2dd771 100644
--- a/Documentation/cpusets.txt
+++ b/Documentation/cpusets.txt
@@ -277,7 +277,7 @@ rewritten to the 'tasks' file of its cpuset. This is done to avoid
277impacting the scheduler code in the kernel with a check for changes 277impacting the scheduler code in the kernel with a check for changes
278in a tasks processor placement. 278in a tasks processor placement.
279 279
280There is an exception to the above. If hotplug funtionality is used 280There is an exception to the above. If hotplug functionality is used
281to remove all the CPUs that are currently assigned to a cpuset, 281to remove all the CPUs that are currently assigned to a cpuset,
282then the kernel will automatically update the cpus_allowed of all 282then the kernel will automatically update the cpus_allowed of all
283tasks attached to CPUs in that cpuset to allow all CPUs. When memory 283tasks attached to CPUs in that cpuset to allow all CPUs. When memory
diff --git a/Documentation/crypto/descore-readme.txt b/Documentation/crypto/descore-readme.txt
index 166474c2ee0b..16e9e6350755 100644
--- a/Documentation/crypto/descore-readme.txt
+++ b/Documentation/crypto/descore-readme.txt
@@ -1,4 +1,4 @@
1Below is the orginal README file from the descore.shar package. 1Below is the original README file from the descore.shar package.
2------------------------------------------------------------------------------ 2------------------------------------------------------------------------------
3 3
4des - fast & portable DES encryption & decryption. 4des - fast & portable DES encryption & decryption.
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
index 5f95d4b3cab1..784e08c1c80a 100644
--- a/Documentation/feature-removal-schedule.txt
+++ b/Documentation/feature-removal-schedule.txt
@@ -17,14 +17,6 @@ Who: Greg Kroah-Hartman <greg@kroah.com>
17 17
18--------------------------- 18---------------------------
19 19
20What: ACPI S4bios support
21When: May 2005
22Why: Noone uses it, and it probably does not work, anyway. swsusp is
23 faster, more reliable, and people are actually using it.
24Who: Pavel Machek <pavel@suse.cz>
25
26---------------------------
27
28What: io_remap_page_range() (macro or function) 20What: io_remap_page_range() (macro or function)
29When: September 2005 21When: September 2005
30Why: Replaced by io_remap_pfn_range() which allows more memory space 22Why: Replaced by io_remap_pfn_range() which allows more memory space
diff --git a/Documentation/ioctl/cdrom.txt b/Documentation/ioctl/cdrom.txt
index 4ccdcc6fe364..8ec32cc49eb1 100644
--- a/Documentation/ioctl/cdrom.txt
+++ b/Documentation/ioctl/cdrom.txt
@@ -878,7 +878,7 @@ DVD_READ_STRUCT Read structure
878 878
879 error returns: 879 error returns:
880 EINVAL physical.layer_num exceeds number of layers 880 EINVAL physical.layer_num exceeds number of layers
881 EIO Recieved invalid response from drive 881 EIO Received invalid response from drive
882 882
883 883
884 884
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index d2f0c67ba1fb..db2603ceabba 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -549,6 +549,7 @@ running once the system is up.
549 keyboard and can not control its state 549 keyboard and can not control its state
550 (Don't attempt to blink the leds) 550 (Don't attempt to blink the leds)
551 i8042.noaux [HW] Don't check for auxiliary (== mouse) port 551 i8042.noaux [HW] Don't check for auxiliary (== mouse) port
552 i8042.nokbd [HW] Don't check/create keyboard port
552 i8042.nomux [HW] Don't check presence of an active multiplexing 553 i8042.nomux [HW] Don't check presence of an active multiplexing
553 controller 554 controller
554 i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX 555 i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX
diff --git a/Documentation/mono.txt b/Documentation/mono.txt
index 6739ab9615ef..807a0c7b4737 100644
--- a/Documentation/mono.txt
+++ b/Documentation/mono.txt
@@ -30,7 +30,7 @@ other program after you have done the following:
30 Read the file 'binfmt_misc.txt' in this directory to know 30 Read the file 'binfmt_misc.txt' in this directory to know
31 more about the configuration process. 31 more about the configuration process.
32 32
333) Add the following enries to /etc/rc.local or similar script 333) Add the following entries to /etc/rc.local or similar script
34 to be run at system startup: 34 to be run at system startup:
35 35
36# Insert BINFMT_MISC module into the kernel 36# Insert BINFMT_MISC module into the kernel
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt
index 24d029455baa..a55f0f95b171 100644
--- a/Documentation/networking/bonding.txt
+++ b/Documentation/networking/bonding.txt
@@ -1241,7 +1241,7 @@ traffic while still maintaining carrier on.
1241 1241
1242 If running SNMP agents, the bonding driver should be loaded 1242 If running SNMP agents, the bonding driver should be loaded
1243before any network drivers participating in a bond. This requirement 1243before any network drivers participating in a bond. This requirement
1244is due to the the interface index (ipAdEntIfIndex) being associated to 1244is due to the interface index (ipAdEntIfIndex) being associated to
1245the first interface found with a given IP address. That is, there is 1245the first interface found with a given IP address. That is, there is
1246only one ipAdEntIfIndex for each IP address. For example, if eth0 and 1246only one ipAdEntIfIndex for each IP address. For example, if eth0 and
1247eth1 are slaves of bond0 and the driver for eth0 is loaded before the 1247eth1 are slaves of bond0 and the driver for eth0 is loaded before the
@@ -1937,7 +1937,7 @@ switches currently available support 802.3ad.
1937 If not explicitly configured (with ifconfig or ip link), the 1937 If not explicitly configured (with ifconfig or ip link), the
1938MAC address of the bonding device is taken from its first slave 1938MAC address of the bonding device is taken from its first slave
1939device. This MAC address is then passed to all following slaves and 1939device. This MAC address is then passed to all following slaves and
1940remains persistent (even if the the first slave is removed) until the 1940remains persistent (even if the first slave is removed) until the
1941bonding device is brought down or reconfigured. 1941bonding device is brought down or reconfigured.
1942 1942
1943 If you wish to change the MAC address, you can set it with 1943 If you wish to change the MAC address, you can set it with
diff --git a/Documentation/networking/wan-router.txt b/Documentation/networking/wan-router.txt
index aea20cd2a56e..c96897aa08b6 100644
--- a/Documentation/networking/wan-router.txt
+++ b/Documentation/networking/wan-router.txt
@@ -355,7 +355,7 @@ REVISION HISTORY
355 There is no functional difference between the two packages 355 There is no functional difference between the two packages
356 356
3572.0.7 Aug 26, 1999 o Merged X25API code into WANPIPE. 3572.0.7 Aug 26, 1999 o Merged X25API code into WANPIPE.
358 o Fixed a memeory leak for X25API 358 o Fixed a memory leak for X25API
359 o Updated the X25API code for 2.2.X kernels. 359 o Updated the X25API code for 2.2.X kernels.
360 o Improved NEM handling. 360 o Improved NEM handling.
361 361
@@ -514,7 +514,7 @@ beta2-2.2.0 Jan 8 2001
514 o Patches for 2.4.0 kernel 514 o Patches for 2.4.0 kernel
515 o Patches for 2.2.18 kernel 515 o Patches for 2.2.18 kernel
516 o Minor updates to PPP and CHLDC drivers. 516 o Minor updates to PPP and CHLDC drivers.
517 Note: No functinal difference. 517 Note: No functional difference.
518 518
519beta3-2.2.9 Jan 10 2001 519beta3-2.2.9 Jan 10 2001
520 o I missed the 2.2.18 kernel patches in beta2-2.2.0 520 o I missed the 2.2.18 kernel patches in beta2-2.2.0
diff --git a/Documentation/pci.txt b/Documentation/pci.txt
index 76d28d033657..711210b38f5f 100644
--- a/Documentation/pci.txt
+++ b/Documentation/pci.txt
@@ -84,7 +84,7 @@ Each entry consists of:
84 84
85Most drivers don't need to use the driver_data field. Best practice 85Most drivers don't need to use the driver_data field. Best practice
86for use of driver_data is to use it as an index into a static list of 86for use of driver_data is to use it as an index into a static list of
87equivalant device types, not to use it as a pointer. 87equivalent device types, not to use it as a pointer.
88 88
89Have a table entry {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID} 89Have a table entry {PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID}
90to have probe() called for every PCI device known to the system. 90to have probe() called for every PCI device known to the system.
diff --git a/Documentation/powerpc/eeh-pci-error-recovery.txt b/Documentation/powerpc/eeh-pci-error-recovery.txt
index 2bfe71beec5b..e75d7474322c 100644
--- a/Documentation/powerpc/eeh-pci-error-recovery.txt
+++ b/Documentation/powerpc/eeh-pci-error-recovery.txt
@@ -134,7 +134,7 @@ pci_get_device_by_addr() will find the pci device associated
134with that address (if any). 134with that address (if any).
135 135
136The default include/asm-ppc64/io.h macros readb(), inb(), insb(), 136The default include/asm-ppc64/io.h macros readb(), inb(), insb(),
137etc. include a check to see if the the i/o read returned all-0xff's. 137etc. include a check to see if the i/o read returned all-0xff's.
138If so, these make a call to eeh_dn_check_failure(), which in turn 138If so, these make a call to eeh_dn_check_failure(), which in turn
139asks the firmware if the all-ff's value is the sign of a true EEH 139asks the firmware if the all-ff's value is the sign of a true EEH
140error. If it is not, processing continues as normal. The grand 140error. If it is not, processing continues as normal. The grand
diff --git a/Documentation/s390/s390dbf.txt b/Documentation/s390/s390dbf.txt
index e24fdeada970..e321a8ed2a2d 100644
--- a/Documentation/s390/s390dbf.txt
+++ b/Documentation/s390/s390dbf.txt
@@ -468,7 +468,7 @@ The hex_ascii view shows the data field in hex and ascii representation
468The raw view returns a bytestream as the debug areas are stored in memory. 468The raw view returns a bytestream as the debug areas are stored in memory.
469 469
470The sprintf view formats the debug entries in the same way as the sprintf 470The sprintf view formats the debug entries in the same way as the sprintf
471function would do. The sprintf event/expection fuctions write to the 471function would do. The sprintf event/expection functions write to the
472debug entry a pointer to the format string (size = sizeof(long)) 472debug entry a pointer to the format string (size = sizeof(long))
473and for each vararg a long value. So e.g. for a debug entry with a format 473and for each vararg a long value. So e.g. for a debug entry with a format
474string plus two varargs one would need to allocate a (3 * sizeof(long)) 474string plus two varargs one would need to allocate a (3 * sizeof(long))
diff --git a/Documentation/scsi/ibmmca.txt b/Documentation/scsi/ibmmca.txt
index 2814491600ff..2ffb3ae0ef4d 100644
--- a/Documentation/scsi/ibmmca.txt
+++ b/Documentation/scsi/ibmmca.txt
@@ -344,7 +344,7 @@
344 /proc/scsi/ibmmca/<host_no>. ibmmca_proc_info() provides this information. 344 /proc/scsi/ibmmca/<host_no>. ibmmca_proc_info() provides this information.
345 345
346 This table is quite informative for interested users. It shows the load 346 This table is quite informative for interested users. It shows the load
347 of commands on the subsystem and wether you are running the bypassed 347 of commands on the subsystem and whether you are running the bypassed
348 (software) or integrated (hardware) SCSI-command set (see below). The 348 (software) or integrated (hardware) SCSI-command set (see below). The
349 amount of accesses is shown. Read, write, modeselect is shown separately 349 amount of accesses is shown. Read, write, modeselect is shown separately
350 in order to help debugging problems with CD-ROMs or tapedrives. 350 in order to help debugging problems with CD-ROMs or tapedrives.
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index 5c49ba07e709..ebfcdf28485f 100644
--- a/Documentation/sound/alsa/ALSA-Configuration.txt
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt
@@ -1459,7 +1459,7 @@ devices where %i is sound card number from zero to seven.
1459To auto-load an ALSA driver for OSS services, define the string 1459To auto-load an ALSA driver for OSS services, define the string
1460'sound-slot-%i' where %i means the slot number for OSS, which 1460'sound-slot-%i' where %i means the slot number for OSS, which
1461corresponds to the card index of ALSA. Usually, define this 1461corresponds to the card index of ALSA. Usually, define this
1462as the the same card module. 1462as the same card module.
1463 1463
1464An example configuration for a single emu10k1 card is like below: 1464An example configuration for a single emu10k1 card is like below:
1465----- /etc/modprobe.conf 1465----- /etc/modprobe.conf
diff --git a/Documentation/sysrq.txt b/Documentation/sysrq.txt
index 136d817c01ba..baf17b381588 100644
--- a/Documentation/sysrq.txt
+++ b/Documentation/sysrq.txt
@@ -171,7 +171,7 @@ the header 'include/linux/sysrq.h', this will define everything else you need.
171Next, you must create a sysrq_key_op struct, and populate it with A) the key 171Next, you must create a sysrq_key_op struct, and populate it with A) the key
172handler function you will use, B) a help_msg string, that will print when SysRQ 172handler function you will use, B) a help_msg string, that will print when SysRQ
173prints help, and C) an action_msg string, that will print right before your 173prints help, and C) an action_msg string, that will print right before your
174handler is called. Your handler must conform to the protoype in 'sysrq.h'. 174handler is called. Your handler must conform to the prototype in 'sysrq.h'.
175 175
176After the sysrq_key_op is created, you can call the macro 176After the sysrq_key_op is created, you can call the macro
177register_sysrq_key(int key, struct sysrq_key_op *op_p) that is defined in 177register_sysrq_key(int key, struct sysrq_key_op *op_p) that is defined in
diff --git a/Documentation/uml/UserModeLinux-HOWTO.txt b/Documentation/uml/UserModeLinux-HOWTO.txt
index 0c7b654fec99..544430e39980 100644
--- a/Documentation/uml/UserModeLinux-HOWTO.txt
+++ b/Documentation/uml/UserModeLinux-HOWTO.txt
@@ -2176,7 +2176,7 @@
2176 If you want to access files on the host machine from inside UML, you 2176 If you want to access files on the host machine from inside UML, you
2177 can treat it as a separate machine and either nfs mount directories 2177 can treat it as a separate machine and either nfs mount directories
2178 from the host or copy files into the virtual machine with scp or rcp. 2178 from the host or copy files into the virtual machine with scp or rcp.
2179 However, since UML is running on the the host, it can access those 2179 However, since UML is running on the host, it can access those
2180 files just like any other process and make them available inside the 2180 files just like any other process and make them available inside the
2181 virtual machine without needing to use the network. 2181 virtual machine without needing to use the network.
2182 2182
diff --git a/Documentation/usb/gadget_serial.txt b/Documentation/usb/gadget_serial.txt
index a938c3dd13d6..815f5c2301ff 100644
--- a/Documentation/usb/gadget_serial.txt
+++ b/Documentation/usb/gadget_serial.txt
@@ -20,7 +20,7 @@ License along with this program; if not, write to the Free
20Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21MA 02111-1307 USA. 21MA 02111-1307 USA.
22 22
23This document and the the gadget serial driver itself are 23This document and the gadget serial driver itself are
24Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com). 24Copyright (C) 2004 by Al Borchers (alborchers@steinerpoint.com).
25 25
26If you have questions, problems, or suggestions for this driver 26If you have questions, problems, or suggestions for this driver
diff --git a/Documentation/video4linux/Zoran b/Documentation/video4linux/Zoran
index 01425c21986b..52c94bd7dca1 100644
--- a/Documentation/video4linux/Zoran
+++ b/Documentation/video4linux/Zoran
@@ -222,7 +222,7 @@ was introduced in 1991, is used in the DC10 old
222can generate: PAL , NTSC , SECAM 222can generate: PAL , NTSC , SECAM
223 223
224The adv717x, should be able to produce PAL N. But you find nothing PAL N 224The adv717x, should be able to produce PAL N. But you find nothing PAL N
225specific in the the registers. Seem that you have to reuse a other standard 225specific in the registers. Seem that you have to reuse a other standard
226to generate PAL N, maybe it would work if you use the PAL M settings. 226to generate PAL N, maybe it would work if you use the PAL M settings.
227 227
228========================== 228==========================
diff --git a/Kbuild b/Kbuild
index 1880e6f760aa..79003918f37f 100644
--- a/Kbuild
+++ b/Kbuild
@@ -4,7 +4,7 @@
4# 1) Generate asm-offsets.h 4# 1) Generate asm-offsets.h
5 5
6##### 6#####
7# 1) Generate asm-offsets.h 7# 1) Generate asm-offsets.h
8# 8#
9 9
10offsets-file := include/asm-$(ARCH)/asm-offsets.h 10offsets-file := include/asm-$(ARCH)/asm-offsets.h
@@ -22,6 +22,7 @@ sed-$(CONFIG_MIPS) := "/^@@@/s///p"
22 22
23quiet_cmd_offsets = GEN $@ 23quiet_cmd_offsets = GEN $@
24define cmd_offsets 24define cmd_offsets
25 mkdir -p $(dir $@); \
25 cat $< | \ 26 cat $< | \
26 (set -e; \ 27 (set -e; \
27 echo "#ifndef __ASM_OFFSETS_H__"; \ 28 echo "#ifndef __ASM_OFFSETS_H__"; \
@@ -43,6 +44,6 @@ arch/$(ARCH)/kernel/asm-offsets.s: arch/$(ARCH)/kernel/asm-offsets.c FORCE
43 $(Q)mkdir -p $(dir $@) 44 $(Q)mkdir -p $(dir $@)
44 $(call if_changed_dep,cc_s_c) 45 $(call if_changed_dep,cc_s_c)
45 46
46$(srctree)/$(offsets-file): arch/$(ARCH)/kernel/asm-offsets.s Kbuild 47$(obj)/$(offsets-file): arch/$(ARCH)/kernel/asm-offsets.s Kbuild
47 $(call cmd,offsets) 48 $(call cmd,offsets)
48 49
diff --git a/Makefile b/Makefile
index 2402430c87e6..382298f37adf 100644
--- a/Makefile
+++ b/Makefile
@@ -334,7 +334,7 @@ KALLSYMS = scripts/kallsyms
334PERL = perl 334PERL = perl
335CHECK = sparse 335CHECK = sparse
336 336
337CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ 337CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ $(CF)
338MODFLAGS = -DMODULE 338MODFLAGS = -DMODULE
339CFLAGS_MODULE = $(MODFLAGS) 339CFLAGS_MODULE = $(MODFLAGS)
340AFLAGS_MODULE = $(MODFLAGS) 340AFLAGS_MODULE = $(MODFLAGS)
@@ -382,6 +382,9 @@ RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CV
382scripts_basic: 382scripts_basic:
383 $(Q)$(MAKE) $(build)=scripts/basic 383 $(Q)$(MAKE) $(build)=scripts/basic
384 384
385# To avoid any implicit rule to kick in, define an empty command.
386scripts/basic/%: scripts_basic ;
387
385.PHONY: outputmakefile 388.PHONY: outputmakefile
386# outputmakefile generate a Makefile to be placed in output directory, if 389# outputmakefile generate a Makefile to be placed in output directory, if
387# using a seperate output directory. This allows convinient use 390# using a seperate output directory. This allows convinient use
@@ -444,9 +447,8 @@ ifeq ($(config-targets),1)
444include $(srctree)/arch/$(ARCH)/Makefile 447include $(srctree)/arch/$(ARCH)/Makefile
445export KBUILD_DEFCONFIG 448export KBUILD_DEFCONFIG
446 449
447config: scripts_basic outputmakefile FORCE 450config %config: scripts_basic outputmakefile FORCE
448 $(Q)$(MAKE) $(build)=scripts/kconfig $@ 451 $(Q)mkdir -p include/linux
449%config: scripts_basic outputmakefile FORCE
450 $(Q)$(MAKE) $(build)=scripts/kconfig $@ 452 $(Q)$(MAKE) $(build)=scripts/kconfig $@
451 453
452else 454else
@@ -641,8 +643,13 @@ quiet_cmd_vmlinux__ ?= LD $@
641# Generate new vmlinux version 643# Generate new vmlinux version
642quiet_cmd_vmlinux_version = GEN .version 644quiet_cmd_vmlinux_version = GEN .version
643 cmd_vmlinux_version = set -e; \ 645 cmd_vmlinux_version = set -e; \
644 . $(srctree)/scripts/mkversion > .tmp_version; \ 646 if [ ! -r .version ]; then \
645 mv -f .tmp_version .version; \ 647 rm -f .version; \
648 echo 1 >.version; \
649 else \
650 mv .version .old_version; \
651 expr 0$$(cat .old_version) + 1 >.version; \
652 fi; \
646 $(MAKE) $(build)=init 653 $(MAKE) $(build)=init
647 654
648# Generate System.map 655# Generate System.map
@@ -756,6 +763,7 @@ endif # ifdef CONFIG_KALLSYMS
756# vmlinux image - including updated kernel symbols 763# vmlinux image - including updated kernel symbols
757vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE 764vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
758 $(call if_changed_rule,vmlinux__) 765 $(call if_changed_rule,vmlinux__)
766 $(Q)rm -f .old_version
759 767
760# The actual objects are generated when descending, 768# The actual objects are generated when descending,
761# make sure no implicit rule kicks in 769# make sure no implicit rule kicks in
@@ -806,7 +814,7 @@ ifneq ($(KBUILD_MODULES),)
806endif 814endif
807 815
808prepare0: prepare prepare1 FORCE 816prepare0: prepare prepare1 FORCE
809 $(Q)$(MAKE) $(build)=$(srctree) 817 $(Q)$(MAKE) $(build)=.
810 818
811# All the preparing.. 819# All the preparing..
812prepare-all: prepare0 820prepare-all: prepare0
@@ -848,7 +856,7 @@ include/asm:
848 856
849# Split autoconf.h into include/linux/config/* 857# Split autoconf.h into include/linux/config/*
850 858
851include/config/MARKER: include/linux/autoconf.h 859include/config/MARKER: scripts/basic/split-include include/linux/autoconf.h
852 @echo ' SPLIT include/linux/autoconf.h -> include/config/*' 860 @echo ' SPLIT include/linux/autoconf.h -> include/config/*'
853 @scripts/basic/split-include include/linux/autoconf.h include/config 861 @scripts/basic/split-include include/linux/autoconf.h include/config
854 @touch $@ 862 @touch $@
@@ -1053,6 +1061,7 @@ help:
1053 @echo ' rpm - Build a kernel as an RPM package' 1061 @echo ' rpm - Build a kernel as an RPM package'
1054 @echo ' tags/TAGS - Generate tags file for editors' 1062 @echo ' tags/TAGS - Generate tags file for editors'
1055 @echo ' cscope - Generate cscope index' 1063 @echo ' cscope - Generate cscope index'
1064 @echo ' kernelrelease - Output the release version string'
1056 @echo '' 1065 @echo ''
1057 @echo 'Static analysers' 1066 @echo 'Static analysers'
1058 @echo ' buildcheck - List dangling references to vmlinux discarded sections' 1067 @echo ' buildcheck - List dangling references to vmlinux discarded sections'
diff --git a/REPORTING-BUGS b/REPORTING-BUGS
index 224c34741d32..f9da827a0c18 100644
--- a/REPORTING-BUGS
+++ b/REPORTING-BUGS
@@ -9,7 +9,7 @@ screen please read "Documentation/oops-tracing.txt" before posting your
9bug report. This explains what you should do with the "Oops" information 9bug report. This explains what you should do with the "Oops" information
10to make it useful to the recipient. 10to make it useful to the recipient.
11 11
12 Send the output the maintainer of the kernel area that seems to 12 Send the output to the maintainer of the kernel area that seems to
13be involved with the problem. Don't worry too much about getting the 13be involved with the problem. Don't worry too much about getting the
14wrong person. If you are unsure send it to the person responsible for the 14wrong person. If you are unsure send it to the person responsible for the
15code relevant to what you were doing. If it occurs repeatably try and 15code relevant to what you were doing. If it occurs repeatably try and
@@ -18,15 +18,15 @@ The list of maintainers is in the MAINTAINERS file in this directory.
18 18
19 If it is a security bug, please copy the Security Contact listed 19 If it is a security bug, please copy the Security Contact listed
20in the MAINTAINERS file. They can help coordinate bugfix and disclosure. 20in the MAINTAINERS file. They can help coordinate bugfix and disclosure.
21See Documentation/SecurityBugs for more infomation. 21See Documentation/SecurityBugs for more information.
22 22
23 If you are totally stumped as to whom to send the report, send it to 23 If you are totally stumped as to whom to send the report, send it to
24linux-kernel@vger.kernel.org. (For more information on the linux-kernel 24linux-kernel@vger.kernel.org. (For more information on the linux-kernel
25mailing list see http://www.tux.org/lkml/). 25mailing list see http://www.tux.org/lkml/).
26 26
27This is a suggested format for a bug report sent to the Linux kernel mailing 27This is a suggested format for a bug report sent to the Linux kernel mailing
28list. Having a standardized bug report form makes it easier for you not to 28list. Having a standardized bug report form makes it easier for you not to
29overlook things, and easier for the developers to find the pieces of 29overlook things, and easier for the developers to find the pieces of
30information they're really interested in. Don't feel you have to follow it. 30information they're really interested in. Don't feel you have to follow it.
31 31
32 First run the ver_linux script included as scripts/ver_linux, which 32 First run the ver_linux script included as scripts/ver_linux, which
@@ -35,9 +35,9 @@ the command "sh scripts/ver_linux".
35 35
36Use that information to fill in all fields of the bug report form, and 36Use that information to fill in all fields of the bug report form, and
37post it to the mailing list with a subject of "PROBLEM: <one line 37post it to the mailing list with a subject of "PROBLEM: <one line
38summary from [1.]>" for easy identification by the developers 38summary from [1.]>" for easy identification by the developers.
39 39
40[1.] One line summary of the problem: 40[1.] One line summary of the problem:
41[2.] Full description of the problem/report: 41[2.] Full description of the problem/report:
42[3.] Keywords (i.e., modules, networking, kernel): 42[3.] Keywords (i.e., modules, networking, kernel):
43[4.] Kernel version (from /proc/version): 43[4.] Kernel version (from /proc/version):
diff --git a/arch/alpha/kernel/alpha_ksyms.c b/arch/alpha/kernel/alpha_ksyms.c
index fc5ef90c4fc9..24ae9a366073 100644
--- a/arch/alpha/kernel/alpha_ksyms.c
+++ b/arch/alpha/kernel/alpha_ksyms.c
@@ -185,15 +185,6 @@ EXPORT_SYMBOL(smp_num_cpus);
185EXPORT_SYMBOL(smp_call_function); 185EXPORT_SYMBOL(smp_call_function);
186EXPORT_SYMBOL(smp_call_function_on_cpu); 186EXPORT_SYMBOL(smp_call_function_on_cpu);
187EXPORT_SYMBOL(_atomic_dec_and_lock); 187EXPORT_SYMBOL(_atomic_dec_and_lock);
188#ifdef CONFIG_DEBUG_SPINLOCK
189EXPORT_SYMBOL(_raw_spin_unlock);
190EXPORT_SYMBOL(debug_spin_lock);
191EXPORT_SYMBOL(debug_spin_trylock);
192#endif
193#ifdef CONFIG_DEBUG_RWLOCK
194EXPORT_SYMBOL(_raw_write_lock);
195EXPORT_SYMBOL(_raw_read_lock);
196#endif
197EXPORT_SYMBOL(cpu_present_mask); 188EXPORT_SYMBOL(cpu_present_mask);
198#endif /* CONFIG_SMP */ 189#endif /* CONFIG_SMP */
199 190
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
index 2b034182a0ca..0636116210d2 100644
--- a/arch/alpha/kernel/osf_sys.c
+++ b/arch/alpha/kernel/osf_sys.c
@@ -1154,8 +1154,7 @@ osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remai
1154 1154
1155 ticks = timeval_to_jiffies(&tmp); 1155 ticks = timeval_to_jiffies(&tmp);
1156 1156
1157 current->state = TASK_INTERRUPTIBLE; 1157 ticks = schedule_timeout_interruptible(ticks);
1158 ticks = schedule_timeout(ticks);
1159 1158
1160 if (remain) { 1159 if (remain) {
1161 jiffies_to_timeval(ticks, &tmp); 1160 jiffies_to_timeval(ticks, &tmp);
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index e211aa7404e6..da0be3465791 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -989,175 +989,3 @@ flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
989 989
990 preempt_enable(); 990 preempt_enable();
991} 991}
992
993#ifdef CONFIG_DEBUG_SPINLOCK
994void
995_raw_spin_unlock(spinlock_t * lock)
996{
997 mb();
998 lock->lock = 0;
999
1000 lock->on_cpu = -1;
1001 lock->previous = NULL;
1002 lock->task = NULL;
1003 lock->base_file = "none";
1004 lock->line_no = 0;
1005}
1006
1007void
1008debug_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
1009{
1010 long tmp;
1011 long stuck;
1012 void *inline_pc = __builtin_return_address(0);
1013 unsigned long started = jiffies;
1014 int printed = 0;
1015 int cpu = smp_processor_id();
1016
1017 stuck = 1L << 30;
1018 try_again:
1019
1020 /* Use sub-sections to put the actual loop at the end
1021 of this object file's text section so as to perfect
1022 branch prediction. */
1023 __asm__ __volatile__(
1024 "1: ldl_l %0,%1\n"
1025 " subq %2,1,%2\n"
1026 " blbs %0,2f\n"
1027 " or %0,1,%0\n"
1028 " stl_c %0,%1\n"
1029 " beq %0,3f\n"
1030 "4: mb\n"
1031 ".subsection 2\n"
1032 "2: ldl %0,%1\n"
1033 " subq %2,1,%2\n"
1034 "3: blt %2,4b\n"
1035 " blbs %0,2b\n"
1036 " br 1b\n"
1037 ".previous"
1038 : "=r" (tmp), "=m" (lock->lock), "=r" (stuck)
1039 : "m" (lock->lock), "2" (stuck) : "memory");
1040
1041 if (stuck < 0) {
1042 printk(KERN_WARNING
1043 "%s:%d spinlock stuck in %s at %p(%d)"
1044 " owner %s at %p(%d) %s:%d\n",
1045 base_file, line_no,
1046 current->comm, inline_pc, cpu,
1047 lock->task->comm, lock->previous,
1048 lock->on_cpu, lock->base_file, lock->line_no);
1049 stuck = 1L << 36;
1050 printed = 1;
1051 goto try_again;
1052 }
1053
1054 /* Exiting. Got the lock. */
1055 lock->on_cpu = cpu;
1056 lock->previous = inline_pc;
1057 lock->task = current;
1058 lock->base_file = base_file;
1059 lock->line_no = line_no;
1060
1061 if (printed) {
1062 printk(KERN_WARNING
1063 "%s:%d spinlock grabbed in %s at %p(%d) %ld ticks\n",
1064 base_file, line_no, current->comm, inline_pc,
1065 cpu, jiffies - started);
1066 }
1067}
1068
1069int
1070debug_spin_trylock(spinlock_t * lock, const char *base_file, int line_no)
1071{
1072 int ret;
1073 if ((ret = !test_and_set_bit(0, lock))) {
1074 lock->on_cpu = smp_processor_id();
1075 lock->previous = __builtin_return_address(0);
1076 lock->task = current;
1077 } else {
1078 lock->base_file = base_file;
1079 lock->line_no = line_no;
1080 }
1081 return ret;
1082}
1083#endif /* CONFIG_DEBUG_SPINLOCK */
1084
1085#ifdef CONFIG_DEBUG_RWLOCK
1086void _raw_write_lock(rwlock_t * lock)
1087{
1088 long regx, regy;
1089 int stuck_lock, stuck_reader;
1090 void *inline_pc = __builtin_return_address(0);
1091
1092 try_again:
1093
1094 stuck_lock = 1<<30;
1095 stuck_reader = 1<<30;
1096
1097 __asm__ __volatile__(
1098 "1: ldl_l %1,%0\n"
1099 " blbs %1,6f\n"
1100 " blt %1,8f\n"
1101 " mov 1,%1\n"
1102 " stl_c %1,%0\n"
1103 " beq %1,6f\n"
1104 "4: mb\n"
1105 ".subsection 2\n"
1106 "6: blt %3,4b # debug\n"
1107 " subl %3,1,%3 # debug\n"
1108 " ldl %1,%0\n"
1109 " blbs %1,6b\n"
1110 "8: blt %4,4b # debug\n"
1111 " subl %4,1,%4 # debug\n"
1112 " ldl %1,%0\n"
1113 " blt %1,8b\n"
1114 " br 1b\n"
1115 ".previous"
1116 : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (regy),
1117 "=&r" (stuck_lock), "=&r" (stuck_reader)
1118 : "m" (*(volatile int *)lock), "3" (stuck_lock), "4" (stuck_reader) : "memory");
1119
1120 if (stuck_lock < 0) {
1121 printk(KERN_WARNING "write_lock stuck at %p\n", inline_pc);
1122 goto try_again;
1123 }
1124 if (stuck_reader < 0) {
1125 printk(KERN_WARNING "write_lock stuck on readers at %p\n",
1126 inline_pc);
1127 goto try_again;
1128 }
1129}
1130
1131void _raw_read_lock(rwlock_t * lock)
1132{
1133 long regx;
1134 int stuck_lock;
1135 void *inline_pc = __builtin_return_address(0);
1136
1137 try_again:
1138
1139 stuck_lock = 1<<30;
1140
1141 __asm__ __volatile__(
1142 "1: ldl_l %1,%0;"
1143 " blbs %1,6f;"
1144 " subl %1,2,%1;"
1145 " stl_c %1,%0;"
1146 " beq %1,6f;"
1147 "4: mb\n"
1148 ".subsection 2\n"
1149 "6: ldl %1,%0;"
1150 " blt %2,4b # debug\n"
1151 " subl %2,1,%2 # debug\n"
1152 " blbs %1,6b;"
1153 " br 1b\n"
1154 ".previous"
1155 : "=m" (*(volatile int *)lock), "=&r" (regx), "=&r" (stuck_lock)
1156 : "m" (*(volatile int *)lock), "2" (stuck_lock) : "memory");
1157
1158 if (stuck_lock < 0) {
1159 printk(KERN_WARNING "read_lock stuck at %p\n", inline_pc);
1160 goto try_again;
1161 }
1162}
1163#endif /* CONFIG_DEBUG_RWLOCK */
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 0f2899b4159d..11fff042aa81 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -326,8 +326,8 @@ config SMP
326 processor machines. On a single processor machine, the kernel will 326 processor machines. On a single processor machine, the kernel will
327 run faster if you say N here. 327 run faster if you say N here.
328 328
329 See also the <file:Documentation/smp.tex>, 329 See also the <file:Documentation/smp.txt>,
330 <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>, 330 <file:Documentation/i386/IO-APIC.txt>,
331 <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at 331 <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
332 <http://www.linuxdoc.org/docs.html#howto>. 332 <http://www.linuxdoc.org/docs.html#howto>.
333 333
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index 45a5709eaaa4..5d3acff8c596 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -53,7 +53,7 @@ config DEBUG_LL
53 bool "Kernel low-level debugging functions" 53 bool "Kernel low-level debugging functions"
54 depends on DEBUG_KERNEL 54 depends on DEBUG_KERNEL
55 help 55 help
56 Say Y here to include definitions of printascii, printchar, printhex 56 Say Y here to include definitions of printascii, printch, printhex
57 in the kernel. This is helpful if you are debugging code that 57 in the kernel. This is helpful if you are debugging code that
58 executes before the console is initialized. 58 executes before the console is initialized.
59 59
diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c
index 688a595598c8..d3a04c2a2c85 100644
--- a/arch/arm/common/scoop.c
+++ b/arch/arm/common/scoop.c
@@ -91,7 +91,7 @@ EXPORT_SYMBOL(read_scoop_reg);
91EXPORT_SYMBOL(write_scoop_reg); 91EXPORT_SYMBOL(write_scoop_reg);
92 92
93#ifdef CONFIG_PM 93#ifdef CONFIG_PM
94static int scoop_suspend(struct device *dev, uint32_t state, uint32_t level) 94static int scoop_suspend(struct device *dev, pm_message_t state, uint32_t level)
95{ 95{
96 if (level == SUSPEND_POWER_DOWN) { 96 if (level == SUSPEND_POWER_DOWN) {
97 struct scoop_dev *sdev = dev_get_drvdata(dev); 97 struct scoop_dev *sdev = dev_get_drvdata(dev);
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
index db07ce42b3b2..949ec4427f21 100644
--- a/arch/arm/kernel/calls.S
+++ b/arch/arm/kernel/calls.S
@@ -10,7 +10,7 @@
10 * This file is included twice in entry-common.S 10 * This file is included twice in entry-common.S
11 */ 11 */
12#ifndef NR_syscalls 12#ifndef NR_syscalls
13#define NR_syscalls 320 13#define NR_syscalls 328
14#else 14#else
15 15
16__syscall_start: 16__syscall_start:
@@ -333,6 +333,9 @@ __syscall_start:
333 .long sys_inotify_init 333 .long sys_inotify_init
334 .long sys_inotify_add_watch 334 .long sys_inotify_add_watch
335 .long sys_inotify_rm_watch 335 .long sys_inotify_rm_watch
336 .long sys_mbind_wrapper
337/* 320 */ .long sys_get_mempolicy
338 .long sys_set_mempolicy
336__syscall_end: 339__syscall_end:
337 340
338 .rept NR_syscalls - (__syscall_end - __syscall_start) / 4 341 .rept NR_syscalls - (__syscall_end - __syscall_start) / 4
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 6281d488ac97..db302c6e5343 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -269,6 +269,10 @@ sys_arm_fadvise64_64_wrapper:
269 str r5, [sp, #4] @ push r5 to stack 269 str r5, [sp, #4] @ push r5 to stack
270 b sys_arm_fadvise64_64 270 b sys_arm_fadvise64_64
271 271
272sys_mbind_wrapper:
273 str r5, [sp, #4]
274 b sys_mbind
275
272/* 276/*
273 * Note: off_4k (r5) is always units of 4K. If we can't do the requested 277 * Note: off_4k (r5) is always units of 4K. If we can't do the requested
274 * offset, we return EINVAL. 278 * offset, we return EINVAL.
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
index 29185acdd9e1..07b5dd453565 100644
--- a/arch/arm/mach-pxa/corgi.c
+++ b/arch/arm/mach-pxa/corgi.c
@@ -131,27 +131,12 @@ static struct platform_device corgits_device = {
131/* 131/*
132 * MMC/SD Device 132 * MMC/SD Device
133 * 133 *
134 * The card detect interrupt isn't debounced so we delay it by HZ/4 134 * The card detect interrupt isn't debounced so we delay it by 250ms
135 * to give the card a chance to fully insert/eject. 135 * to give the card a chance to fully insert/eject.
136 */ 136 */
137static struct mmc_detect { 137static struct pxamci_platform_data corgi_mci_platform_data;
138 struct timer_list detect_timer;
139 void *devid;
140} mmc_detect;
141 138
142static void mmc_detect_callback(unsigned long data) 139static int corgi_mci_init(struct device *dev, irqreturn_t (*corgi_detect_int)(int, void *, struct pt_regs *), void *data)
143{
144 mmc_detect_change(mmc_detect.devid);
145}
146
147static irqreturn_t corgi_mmc_detect_int(int irq, void *devid, struct pt_regs *regs)
148{
149 mmc_detect.devid=devid;
150 mod_timer(&mmc_detect.detect_timer, jiffies + HZ/4);
151 return IRQ_HANDLED;
152}
153
154static int corgi_mci_init(struct device *dev, irqreturn_t (*unused_detect_int)(int, void *, struct pt_regs *), void *data)
155{ 140{
156 int err; 141 int err;
157 142
@@ -161,11 +146,9 @@ static int corgi_mci_init(struct device *dev, irqreturn_t (*unused_detect_int)(i
161 pxa_gpio_mode(CORGI_GPIO_nSD_DETECT | GPIO_IN); 146 pxa_gpio_mode(CORGI_GPIO_nSD_DETECT | GPIO_IN);
162 pxa_gpio_mode(CORGI_GPIO_SD_PWR | GPIO_OUT); 147 pxa_gpio_mode(CORGI_GPIO_SD_PWR | GPIO_OUT);
163 148
164 init_timer(&mmc_detect.detect_timer); 149 corgi_mci_platform_data.detect_delay = msecs_to_jiffies(250);
165 mmc_detect.detect_timer.function = mmc_detect_callback;
166 mmc_detect.detect_timer.data = (unsigned long) &mmc_detect;
167 150
168 err = request_irq(CORGI_IRQ_GPIO_nSD_DETECT, corgi_mmc_detect_int, SA_INTERRUPT, 151 err = request_irq(CORGI_IRQ_GPIO_nSD_DETECT, corgi_detect_int, SA_INTERRUPT,
169 "MMC card detect", data); 152 "MMC card detect", data);
170 if (err) { 153 if (err) {
171 printk(KERN_ERR "corgi_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); 154 printk(KERN_ERR "corgi_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
@@ -198,7 +181,6 @@ static int corgi_mci_get_ro(struct device *dev)
198static void corgi_mci_exit(struct device *dev, void *data) 181static void corgi_mci_exit(struct device *dev, void *data)
199{ 182{
200 free_irq(CORGI_IRQ_GPIO_nSD_DETECT, data); 183 free_irq(CORGI_IRQ_GPIO_nSD_DETECT, data);
201 del_timer(&mmc_detect.detect_timer);
202} 184}
203 185
204static struct pxamci_platform_data corgi_mci_platform_data = { 186static struct pxamci_platform_data corgi_mci_platform_data = {
diff --git a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S
index 44d886c745ec..7c74fe0dc93c 100644
--- a/arch/i386/kernel/acpi/wakeup.S
+++ b/arch/i386/kernel/acpi/wakeup.S
@@ -304,12 +304,6 @@ ret_point:
304 call restore_processor_state 304 call restore_processor_state
305 ret 305 ret
306 306
307ENTRY(do_suspend_lowlevel_s4bios)
308 call save_processor_state
309 call save_registers
310 call acpi_enter_sleep_state_s4bios
311 ret
312
313ALIGN 307ALIGN
314# saved registers 308# saved registers
315saved_gdt: .long 0,0 309saved_gdt: .long 0,0
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
index 46ce9b248f55..9ad43be9a01f 100644
--- a/arch/i386/kernel/cpu/common.c
+++ b/arch/i386/kernel/cpu/common.c
@@ -151,7 +151,7 @@ static char __devinit *table_lookup_model(struct cpuinfo_x86 *c)
151} 151}
152 152
153 153
154void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early) 154static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
155{ 155{
156 char *v = c->x86_vendor_id; 156 char *v = c->x86_vendor_id;
157 int i; 157 int i;
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
index 1efdc76ae96d..35d3ce26a544 100644
--- a/arch/i386/kernel/io_apic.c
+++ b/arch/i386/kernel/io_apic.c
@@ -573,8 +573,7 @@ static int balanced_irq(void *unused)
573 } 573 }
574 574
575 for ( ; ; ) { 575 for ( ; ; ) {
576 set_current_state(TASK_INTERRUPTIBLE); 576 time_remaining = schedule_timeout_interruptible(time_remaining);
577 time_remaining = schedule_timeout(time_remaining);
578 try_to_freeze(); 577 try_to_freeze();
579 if (time_after(jiffies, 578 if (time_after(jiffies,
580 prev_balance_time+balanced_irq_interval)) { 579 prev_balance_time+balanced_irq_interval)) {
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
index 5e4893d2b9f2..c70cd2a08304 100644
--- a/arch/i386/kernel/smpboot.c
+++ b/arch/i386/kernel/smpboot.c
@@ -1330,8 +1330,7 @@ void __cpu_die(unsigned int cpu)
1330 printk ("CPU %d is now offline\n", cpu); 1330 printk ("CPU %d is now offline\n", cpu);
1331 return; 1331 return;
1332 } 1332 }
1333 current->state = TASK_UNINTERRUPTIBLE; 1333 msleep(100);
1334 schedule_timeout(HZ/10);
1335 } 1334 }
1336 printk(KERN_ERR "CPU %u didn't die...\n", cpu); 1335 printk(KERN_ERR "CPU %u didn't die...\n", cpu);
1337} 1336}
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S
index 13b9c62cbbb4..4710195b6b74 100644
--- a/arch/i386/kernel/vmlinux.lds.S
+++ b/arch/i386/kernel/vmlinux.lds.S
@@ -144,12 +144,7 @@ SECTIONS
144 *(.exitcall.exit) 144 *(.exitcall.exit)
145 } 145 }
146 146
147 /* Stabs debugging sections. */ 147 STABS_DEBUG
148 .stab 0 : { *(.stab) } 148
149 .stabstr 0 : { *(.stabstr) } 149 DWARF_DEBUG
150 .stab.excl 0 : { *(.stab.excl) }
151 .stab.exclstr 0 : { *(.stab.exclstr) }
152 .stab.index 0 : { *(.stab.index) }
153 .stab.indexstr 0 : { *(.stab.indexstr) }
154 .comment 0 : { *(.comment) }
155} 150}
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
index 4ebbf3974381..8d484204a3ff 100644
--- a/arch/ia64/kernel/mca.c
+++ b/arch/ia64/kernel/mca.c
@@ -491,12 +491,7 @@ init_handler_platform (pal_min_state_area_t *ms,
491 unw_init_from_interruption(&info, current, pt, sw); 491 unw_init_from_interruption(&info, current, pt, sw);
492 ia64_do_show_stack(&info, NULL); 492 ia64_do_show_stack(&info, NULL);
493 493
494#ifdef CONFIG_SMP 494 if (read_trylock(&tasklist_lock)) {
495 /* read_trylock() would be handy... */
496 if (!tasklist_lock.write_lock)
497 read_lock(&tasklist_lock);
498#endif
499 {
500 struct task_struct *g, *t; 495 struct task_struct *g, *t;
501 do_each_thread (g, t) { 496 do_each_thread (g, t) {
502 if (t == current) 497 if (t == current)
@@ -506,10 +501,6 @@ init_handler_platform (pal_min_state_area_t *ms,
506 show_stack(t, NULL); 501 show_stack(t, NULL);
507 } while_each_thread (g, t); 502 } while_each_thread (g, t);
508 } 503 }
509#ifdef CONFIG_SMP
510 if (!tasklist_lock.write_lock)
511 read_unlock(&tasklist_lock);
512#endif
513 504
514 printk("\nINIT dump complete. Please reboot now.\n"); 505 printk("\nINIT dump complete. Please reboot now.\n");
515 while (1); /* hang city if no debugger */ 506 while (1); /* hang city if no debugger */
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig
index 7622d4ec5f08..1ef3987ebc6a 100644
--- a/arch/m32r/Kconfig
+++ b/arch/m32r/Kconfig
@@ -242,8 +242,8 @@ config SMP
242 Y to "Enhanced Real Time Clock Support", below. The "Advanced Power 242 Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
243 Management" code will be disabled if you say Y here. 243 Management" code will be disabled if you say Y here.
244 244
245 See also the <file:Documentation/smp.tex>, 245 See also the <file:Documentation/smp.txt>,
246 <file:Documentation/smp.txt> and the SMP-HOWTO available at 246 and the SMP-HOWTO available at
247 <http://www.linuxdoc.org/docs.html#howto>. 247 <http://www.linuxdoc.org/docs.html#howto>.
248 248
249 If you don't know what to do here, say N. 249 If you don't know what to do here, say N.
diff --git a/arch/m32r/kernel/smp.c b/arch/m32r/kernel/smp.c
index 48b187f2d2b3..a4576ac7e870 100644
--- a/arch/m32r/kernel/smp.c
+++ b/arch/m32r/kernel/smp.c
@@ -892,7 +892,6 @@ unsigned long send_IPI_mask_phys(cpumask_t physid_mask, int ipi_num,
892 int try) 892 int try)
893{ 893{
894 spinlock_t *ipilock; 894 spinlock_t *ipilock;
895 unsigned long flags = 0;
896 volatile unsigned long *ipicr_addr; 895 volatile unsigned long *ipicr_addr;
897 unsigned long ipicr_val; 896 unsigned long ipicr_val;
898 unsigned long my_physid_mask; 897 unsigned long my_physid_mask;
@@ -916,50 +915,27 @@ unsigned long send_IPI_mask_phys(cpumask_t physid_mask, int ipi_num,
916 * write IPICRi (send IPIi) 915 * write IPICRi (send IPIi)
917 * unlock ipi_lock[i] 916 * unlock ipi_lock[i]
918 */ 917 */
918 spin_lock(ipilock);
919 __asm__ __volatile__ ( 919 __asm__ __volatile__ (
920 ";; LOCK ipi_lock[i] \n\t" 920 ";; CHECK IPICRi == 0 \n\t"
921 ".fillinsn \n" 921 ".fillinsn \n"
922 "1: \n\t" 922 "1: \n\t"
923 "mvfc %1, psw \n\t" 923 "ld %0, @%1 \n\t"
924 "clrpsw #0x40 -> nop \n\t" 924 "and %0, %4 \n\t"
925 DCACHE_CLEAR("r4", "r5", "%2") 925 "beqz %0, 2f \n\t"
926 "lock r4, @%2 \n\t" 926 "bnez %3, 3f \n\t"
927 "addi r4, #-1 \n\t"
928 "unlock r4, @%2 \n\t"
929 "mvtc %1, psw \n\t"
930 "bnez r4, 2f \n\t"
931 LOCK_SECTION_START(".balign 4 \n\t")
932 ".fillinsn \n"
933 "2: \n\t"
934 "ld r4, @%2 \n\t"
935 "blez r4, 2b \n\t"
936 "bra 1b \n\t" 927 "bra 1b \n\t"
937 LOCK_SECTION_END
938 ";; CHECK IPICRi == 0 \n\t"
939 ".fillinsn \n"
940 "3: \n\t"
941 "ld %0, @%3 \n\t"
942 "and %0, %6 \n\t"
943 "beqz %0, 4f \n\t"
944 "bnez %5, 5f \n\t"
945 "bra 3b \n\t"
946 ";; WRITE IPICRi (send IPIi) \n\t" 928 ";; WRITE IPICRi (send IPIi) \n\t"
947 ".fillinsn \n" 929 ".fillinsn \n"
948 "4: \n\t" 930 "2: \n\t"
949 "st %4, @%3 \n\t" 931 "st %2, @%1 \n\t"
950 ";; UNLOCK ipi_lock[i] \n\t"
951 ".fillinsn \n" 932 ".fillinsn \n"
952 "5: \n\t" 933 "3: \n\t"
953 "ldi r4, #1 \n\t"
954 "st r4, @%2 \n\t"
955 : "=&r"(ipicr_val) 934 : "=&r"(ipicr_val)
956 : "r"(flags), "r"(&ipilock->slock), "r"(ipicr_addr), 935 : "r"(ipicr_addr), "r"(mask), "r"(try), "r"(my_physid_mask)
957 "r"(mask), "r"(try), "r"(my_physid_mask) 936 : "memory"
958 : "memory", "r4"
959#ifdef CONFIG_CHIP_M32700_TS1
960 , "r5"
961#endif /* CONFIG_CHIP_M32700_TS1 */
962 ); 937 );
938 spin_unlock(ipilock);
963 939
964 return ipicr_val; 940 return ipicr_val;
965} 941}
diff --git a/arch/mips/kernel/irixsig.c b/arch/mips/kernel/irixsig.c
index 4c114ae21793..eff89322ba50 100644
--- a/arch/mips/kernel/irixsig.c
+++ b/arch/mips/kernel/irixsig.c
@@ -440,18 +440,6 @@ struct irix5_siginfo {
440 } stuff; 440 } stuff;
441}; 441};
442 442
443static inline unsigned long timespectojiffies(struct timespec *value)
444{
445 unsigned long sec = (unsigned) value->tv_sec;
446 long nsec = value->tv_nsec;
447
448 if (sec > (LONG_MAX / HZ))
449 return LONG_MAX;
450 nsec += 1000000000L / HZ - 1;
451 nsec /= 1000000000L / HZ;
452 return HZ * sec + nsec;
453}
454
455asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info, 443asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info,
456 struct timespec *tp) 444 struct timespec *tp)
457{ 445{
@@ -489,14 +477,13 @@ asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info,
489 error = -EINVAL; 477 error = -EINVAL;
490 goto out; 478 goto out;
491 } 479 }
492 expire = timespectojiffies(tp)+(tp->tv_sec||tp->tv_nsec); 480 expire = timespec_to_jiffies(tp) + (tp->tv_sec||tp->tv_nsec);
493 } 481 }
494 482
495 while(1) { 483 while(1) {
496 long tmp = 0; 484 long tmp = 0;
497 485
498 current->state = TASK_INTERRUPTIBLE; 486 expire = schedule_timeout_interruptible(expire);
499 expire = schedule_timeout(expire);
500 487
501 for (i=0; i<=4; i++) 488 for (i=0; i<=4; i++)
502 tmp |= (current->pending.signal.sig[i] & kset.sig[i]); 489 tmp |= (current->pending.signal.sig[i] & kset.sig[i]);
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c
index b46595462717..4de155699c4f 100644
--- a/arch/mips/kernel/sysirix.c
+++ b/arch/mips/kernel/sysirix.c
@@ -1032,8 +1032,7 @@ bad:
1032 1032
1033asmlinkage int irix_sginap(int ticks) 1033asmlinkage int irix_sginap(int ticks)
1034{ 1034{
1035 current->state = TASK_INTERRUPTIBLE; 1035 schedule_timeout_interruptible(ticks);
1036 schedule_timeout(ticks);
1037 return 0; 1036 return 0;
1038} 1037}
1039 1038
diff --git a/arch/mips/lib/dec_and_lock.c b/arch/mips/lib/dec_and_lock.c
index e44e9579bd36..fd82c84a93b7 100644
--- a/arch/mips/lib/dec_and_lock.c
+++ b/arch/mips/lib/dec_and_lock.c
@@ -20,14 +20,7 @@
20 * has a cmpxchg, and where atomic->value is an int holding 20 * has a cmpxchg, and where atomic->value is an int holding
21 * the value of the atomic (i.e. the high bits aren't used 21 * the value of the atomic (i.e. the high bits aren't used
22 * for a lock or anything like that). 22 * for a lock or anything like that).
23 *
24 * N.B. ATOMIC_DEC_AND_LOCK gets defined in include/linux/spinlock.h
25 * if spinlocks are empty and thus atomic_dec_and_lock is defined
26 * to be atomic_dec_and_test - in that case we don't need it
27 * defined here as well.
28 */ 23 */
29
30#ifndef ATOMIC_DEC_AND_LOCK
31int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock) 24int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
32{ 25{
33 int counter; 26 int counter;
@@ -52,4 +45,3 @@ int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
52} 45}
53 46
54EXPORT_SYMBOL(_atomic_dec_and_lock); 47EXPORT_SYMBOL(_atomic_dec_and_lock);
55#endif /* ATOMIC_DEC_AND_LOCK */
diff --git a/arch/parisc/lib/Makefile b/arch/parisc/lib/Makefile
index 7bf705676297..5f2e6904d14a 100644
--- a/arch/parisc/lib/Makefile
+++ b/arch/parisc/lib/Makefile
@@ -5,5 +5,3 @@
5lib-y := lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o 5lib-y := lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o
6 6
7obj-y := iomap.o 7obj-y := iomap.o
8
9lib-$(CONFIG_SMP) += debuglocks.o
diff --git a/arch/parisc/lib/bitops.c b/arch/parisc/lib/bitops.c
index 2de182f6fe8a..90f400b10282 100644
--- a/arch/parisc/lib/bitops.c
+++ b/arch/parisc/lib/bitops.c
@@ -13,8 +13,8 @@
13#include <asm/atomic.h> 13#include <asm/atomic.h>
14 14
15#ifdef CONFIG_SMP 15#ifdef CONFIG_SMP
16spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = { 16raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = {
17 [0 ... (ATOMIC_HASH_SIZE-1)] = SPIN_LOCK_UNLOCKED 17 [0 ... (ATOMIC_HASH_SIZE-1)] = __RAW_SPIN_LOCK_UNLOCKED
18}; 18};
19#endif 19#endif
20 20
diff --git a/arch/parisc/lib/debuglocks.c b/arch/parisc/lib/debuglocks.c
deleted file mode 100644
index 1b33fe6e5b7a..000000000000
--- a/arch/parisc/lib/debuglocks.c
+++ /dev/null
@@ -1,277 +0,0 @@
1/*
2 * Debugging versions of SMP locking primitives.
3 *
4 * Copyright (C) 2004 Thibaut VARENE <varenet@parisc-linux.org>
5 *
6 * Some code stollen from alpha & sparc64 ;)
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 * We use pdc_printf() throughout the file for all output messages, to avoid
23 * losing messages because of disabled interrupts. Since we're using these
24 * messages for debugging purposes, it makes sense not to send them to the
25 * linux console.
26 */
27
28
29#include <linux/config.h>
30#include <linux/kernel.h>
31#include <linux/sched.h>
32#include <linux/spinlock.h>
33#include <linux/hardirq.h> /* in_interrupt() */
34#include <asm/system.h>
35#include <asm/hardirq.h> /* in_interrupt() */
36#include <asm/pdc.h>
37
38#undef INIT_STUCK
39#define INIT_STUCK 1L << 30
40
41#ifdef CONFIG_DEBUG_SPINLOCK
42
43
44void _dbg_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
45{
46 volatile unsigned int *a;
47 long stuck = INIT_STUCK;
48 void *inline_pc = __builtin_return_address(0);
49 unsigned long started = jiffies;
50 int printed = 0;
51 int cpu = smp_processor_id();
52
53try_again:
54
55 /* Do the actual locking */
56 /* <T-Bone> ggg: we can't get stuck on the outter loop?
57 * <ggg> T-Bone: We can hit the outer loop
58 * alot if multiple CPUs are constantly racing for a lock
59 * and the backplane is NOT fair about which CPU sees
60 * the update first. But it won't hang since every failed
61 * attempt will drop us back into the inner loop and
62 * decrement `stuck'.
63 * <ggg> K-class and some of the others are NOT fair in the HW
64 * implementation so we could see false positives.
65 * But fixing the lock contention is easier than
66 * fixing the HW to be fair.
67 * <tausq> __ldcw() returns 1 if we get the lock; otherwise we
68 * spin until the value of the lock changes, or we time out.
69 */
70 mb();
71 a = __ldcw_align(lock);
72 while (stuck && (__ldcw(a) == 0))
73 while ((*a == 0) && --stuck);
74 mb();
75
76 if (unlikely(stuck <= 0)) {
77 pdc_printf(
78 "%s:%d: spin_lock(%s/%p) stuck in %s at %p(%d)"
79 " owned by %s:%d in %s at %p(%d)\n",
80 base_file, line_no, lock->module, lock,
81 current->comm, inline_pc, cpu,
82 lock->bfile, lock->bline, lock->task->comm,
83 lock->previous, lock->oncpu);
84 stuck = INIT_STUCK;
85 printed = 1;
86 goto try_again;
87 }
88
89 /* Exiting. Got the lock. */
90 lock->oncpu = cpu;
91 lock->previous = inline_pc;
92 lock->task = current;
93 lock->bfile = (char *)base_file;
94 lock->bline = line_no;
95
96 if (unlikely(printed)) {
97 pdc_printf(
98 "%s:%d: spin_lock grabbed in %s at %p(%d) %ld ticks\n",
99 base_file, line_no, current->comm, inline_pc,
100 cpu, jiffies - started);
101 }
102}
103
104void _dbg_spin_unlock(spinlock_t * lock, const char *base_file, int line_no)
105{
106 CHECK_LOCK(lock);
107 volatile unsigned int *a;
108 mb();
109 a = __ldcw_align(lock);
110 if (unlikely((*a != 0) && lock->babble)) {
111 lock->babble--;
112 pdc_printf(
113 "%s:%d: spin_unlock(%s:%p) not locked\n",
114 base_file, line_no, lock->module, lock);
115 }
116 *a = 1;
117 mb();
118}
119
120int _dbg_spin_trylock(spinlock_t * lock, const char *base_file, int line_no)
121{
122 int ret;
123 volatile unsigned int *a;
124 mb();
125 a = __ldcw_align(lock);
126 ret = (__ldcw(a) != 0);
127 mb();
128 if (ret) {
129 lock->oncpu = smp_processor_id();
130 lock->previous = __builtin_return_address(0);
131 lock->task = current;
132 } else {
133 lock->bfile = (char *)base_file;
134 lock->bline = line_no;
135 }
136 return ret;
137}
138
139#endif /* CONFIG_DEBUG_SPINLOCK */
140
141#ifdef CONFIG_DEBUG_RWLOCK
142
143/* Interrupts trouble detailed explanation, thx Grant:
144 *
145 * o writer (wants to modify data) attempts to acquire the rwlock
146 * o He gets the write lock.
147 * o Interupts are still enabled, we take an interrupt with the
148 * write still holding the lock.
149 * o interrupt handler tries to acquire the rwlock for read.
150 * o deadlock since the writer can't release it at this point.
151 *
152 * In general, any use of spinlocks that competes between "base"
153 * level and interrupt level code will risk deadlock. Interrupts
154 * need to be disabled in the base level routines to avoid it.
155 * Or more precisely, only the IRQ the base level routine
156 * is competing with for the lock. But it's more efficient/faster
157 * to just disable all interrupts on that CPU to guarantee
158 * once it gets the lock it can release it quickly too.
159 */
160
161void _dbg_write_lock(rwlock_t *rw, const char *bfile, int bline)
162{
163 void *inline_pc = __builtin_return_address(0);
164 unsigned long started = jiffies;
165 long stuck = INIT_STUCK;
166 int printed = 0;
167 int cpu = smp_processor_id();
168
169 if(unlikely(in_interrupt())) { /* acquiring write lock in interrupt context, bad idea */
170 pdc_printf("write_lock caller: %s:%d, IRQs enabled,\n", bfile, bline);
171 BUG();
172 }
173
174 /* Note: if interrupts are disabled (which is most likely), the printk
175 will never show on the console. We might need a polling method to flush
176 the dmesg buffer anyhow. */
177
178retry:
179 _raw_spin_lock(&rw->lock);
180
181 if(rw->counter != 0) {
182 /* this basically never happens */
183 _raw_spin_unlock(&rw->lock);
184
185 stuck--;
186 if ((unlikely(stuck <= 0)) && (rw->counter < 0)) {
187 pdc_printf(
188 "%s:%d: write_lock stuck on writer"
189 " in %s at %p(%d) %ld ticks\n",
190 bfile, bline, current->comm, inline_pc,
191 cpu, jiffies - started);
192 stuck = INIT_STUCK;
193 printed = 1;
194 }
195 else if (unlikely(stuck <= 0)) {
196 pdc_printf(
197 "%s:%d: write_lock stuck on reader"
198 " in %s at %p(%d) %ld ticks\n",
199 bfile, bline, current->comm, inline_pc,
200 cpu, jiffies - started);
201 stuck = INIT_STUCK;
202 printed = 1;
203 }
204
205 while(rw->counter != 0);
206
207 goto retry;
208 }
209
210 /* got it. now leave without unlocking */
211 rw->counter = -1; /* remember we are locked */
212
213 if (unlikely(printed)) {
214 pdc_printf(
215 "%s:%d: write_lock grabbed in %s at %p(%d) %ld ticks\n",
216 bfile, bline, current->comm, inline_pc,
217 cpu, jiffies - started);
218 }
219}
220
221int _dbg_write_trylock(rwlock_t *rw, const char *bfile, int bline)
222{
223#if 0
224 void *inline_pc = __builtin_return_address(0);
225 int cpu = smp_processor_id();
226#endif
227
228 if(unlikely(in_interrupt())) { /* acquiring write lock in interrupt context, bad idea */
229 pdc_printf("write_lock caller: %s:%d, IRQs enabled,\n", bfile, bline);
230 BUG();
231 }
232
233 /* Note: if interrupts are disabled (which is most likely), the printk
234 will never show on the console. We might need a polling method to flush
235 the dmesg buffer anyhow. */
236
237 _raw_spin_lock(&rw->lock);
238
239 if(rw->counter != 0) {
240 /* this basically never happens */
241 _raw_spin_unlock(&rw->lock);
242 return 0;
243 }
244
245 /* got it. now leave without unlocking */
246 rw->counter = -1; /* remember we are locked */
247#if 0
248 pdc_printf("%s:%d: try write_lock grabbed in %s at %p(%d)\n",
249 bfile, bline, current->comm, inline_pc, cpu);
250#endif
251 return 1;
252}
253
254void _dbg_read_lock(rwlock_t * rw, const char *bfile, int bline)
255{
256#if 0
257 void *inline_pc = __builtin_return_address(0);
258 unsigned long started = jiffies;
259 int cpu = smp_processor_id();
260#endif
261 unsigned long flags;
262
263 local_irq_save(flags);
264 _raw_spin_lock(&rw->lock);
265
266 rw->counter++;
267#if 0
268 pdc_printf(
269 "%s:%d: read_lock grabbed in %s at %p(%d) %ld ticks\n",
270 bfile, bline, current->comm, inline_pc,
271 cpu, jiffies - started);
272#endif
273 _raw_spin_unlock(&rw->lock);
274 local_irq_restore(flags);
275}
276
277#endif /* CONFIG_DEBUG_RWLOCK */
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig
index e3f1ce33e642..347ea284140b 100644
--- a/arch/ppc/Kconfig
+++ b/arch/ppc/Kconfig
@@ -265,6 +265,15 @@ config PPC601_SYNC_FIX
265 265
266 If in doubt, say Y here. 266 If in doubt, say Y here.
267 267
268config HOTPLUG_CPU
269 bool "Support for enabling/disabling CPUs"
270 depends on SMP && HOTPLUG && EXPERIMENTAL && PPC_PMAC
271 ---help---
272 Say Y here to be able to disable and re-enable individual
273 CPUs at runtime on SMP machines.
274
275 Say N if you are unsure.
276
268source arch/ppc/platforms/4xx/Kconfig 277source arch/ppc/platforms/4xx/Kconfig
269source arch/ppc/platforms/85xx/Kconfig 278source arch/ppc/platforms/85xx/Kconfig
270 279
diff --git a/arch/ppc/Makefile b/arch/ppc/Makefile
index 4b3fe395ffa4..6dd7b50e0669 100644
--- a/arch/ppc/Makefile
+++ b/arch/ppc/Makefile
@@ -21,13 +21,14 @@ CC := $(CC) -m32
21endif 21endif
22 22
23LDFLAGS_vmlinux := -Ttext $(KERNELLOAD) -Bstatic 23LDFLAGS_vmlinux := -Ttext $(KERNELLOAD) -Bstatic
24CPPFLAGS += -Iarch/$(ARCH) -Iinclude3 24# The -Iarch/$(ARCH)/include is temporary while we are merging
25CPPFLAGS += -Iarch/$(ARCH) -Iarch/$(ARCH)/include
25AFLAGS += -Iarch/$(ARCH) 26AFLAGS += -Iarch/$(ARCH)
26CFLAGS += -Iarch/$(ARCH) -msoft-float -pipe \ 27CFLAGS += -Iarch/$(ARCH) -msoft-float -pipe \
27 -ffixed-r2 -mmultiple 28 -ffixed-r2 -mmultiple
28CPP = $(CC) -E $(CFLAGS) 29CPP = $(CC) -E $(CFLAGS)
29# Temporary hack until we have migrated to asm-powerpc 30# Temporary hack until we have migrated to asm-powerpc
30LINUXINCLUDE += -Iinclude3 31LINUXINCLUDE += -Iarch/$(ARCH)/include
31 32
32CHECKFLAGS += -D__powerpc__ 33CHECKFLAGS += -D__powerpc__
33 34
@@ -103,15 +104,16 @@ endef
103 104
104archclean: 105archclean:
105 $(Q)$(MAKE) $(clean)=arch/ppc/boot 106 $(Q)$(MAKE) $(clean)=arch/ppc/boot
106 $(Q)rm -rf include3 107 # Temporary hack until we have migrated to asm-powerpc
108 $(Q)rm -rf arch/$(ARCH)/include
107 109
108prepare: checkbin 110prepare: checkbin
109 111
110# Temporary hack until we have migrated to asm-powerpc 112# Temporary hack until we have migrated to asm-powerpc
111include/asm: include3/asm 113include/asm: arch/$(ARCH)/include/asm
112include3/asm: 114arch/$(ARCH)/include/asm:
113 $(Q)if [ ! -d include3 ]; then mkdir -p include3; fi 115 $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
114 $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm 116 $(Q)ln -fsn $(srctree)/include/asm-powerpc arch/$(ARCH)/include/asm
115 117
116# Use the file '.tmp_gas_check' for binutils tests, as gas won't output 118# Use the file '.tmp_gas_check' for binutils tests, as gas won't output
117# to stdout and these checks are run even on install targets. 119# to stdout and these checks are run even on install targets.
diff --git a/arch/ppc/kernel/cpu_setup_6xx.S b/arch/ppc/kernel/cpu_setup_6xx.S
index 1f37b7eafac2..ba396438ede3 100644
--- a/arch/ppc/kernel/cpu_setup_6xx.S
+++ b/arch/ppc/kernel/cpu_setup_6xx.S
@@ -12,7 +12,6 @@
12#include <linux/config.h> 12#include <linux/config.h>
13#include <asm/processor.h> 13#include <asm/processor.h>
14#include <asm/page.h> 14#include <asm/page.h>
15#include <asm/ppc_asm.h>
16#include <asm/cputable.h> 15#include <asm/cputable.h>
17#include <asm/ppc_asm.h> 16#include <asm/ppc_asm.h>
18#include <asm/asm-offsets.h> 17#include <asm/asm-offsets.h>
diff --git a/arch/ppc/kernel/cpu_setup_power4.S b/arch/ppc/kernel/cpu_setup_power4.S
index 304589aebdbc..7e4fbb653724 100644
--- a/arch/ppc/kernel/cpu_setup_power4.S
+++ b/arch/ppc/kernel/cpu_setup_power4.S
@@ -14,7 +14,6 @@
14#include <asm/page.h> 14#include <asm/page.h>
15#include <asm/ppc_asm.h> 15#include <asm/ppc_asm.h>
16#include <asm/cputable.h> 16#include <asm/cputable.h>
17#include <asm/ppc_asm.h>
18#include <asm/asm-offsets.h> 17#include <asm/asm-offsets.h>
19#include <asm/cache.h> 18#include <asm/cache.h>
20 19
diff --git a/arch/ppc/kernel/dma-mapping.c b/arch/ppc/kernel/dma-mapping.c
index e0c631cf96b0..b566d982806c 100644
--- a/arch/ppc/kernel/dma-mapping.c
+++ b/arch/ppc/kernel/dma-mapping.c
@@ -393,7 +393,7 @@ EXPORT_SYMBOL(__dma_sync);
393 * __dma_sync_page() implementation for systems using highmem. 393 * __dma_sync_page() implementation for systems using highmem.
394 * In this case, each page of a buffer must be kmapped/kunmapped 394 * In this case, each page of a buffer must be kmapped/kunmapped
395 * in order to have a virtual address for __dma_sync(). This must 395 * in order to have a virtual address for __dma_sync(). This must
396 * not sleep so kmap_atmomic()/kunmap_atomic() are used. 396 * not sleep so kmap_atomic()/kunmap_atomic() are used.
397 * 397 *
398 * Note: yes, it is possible and correct to have a buffer extend 398 * Note: yes, it is possible and correct to have a buffer extend
399 * beyond the first page. 399 * beyond the first page.
diff --git a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S
index 55daf1210f32..1960fb8c259c 100644
--- a/arch/ppc/kernel/head.S
+++ b/arch/ppc/kernel/head.S
@@ -1023,23 +1023,21 @@ __secondary_start_gemini:
1023 andc r4,r4,r3 1023 andc r4,r4,r3
1024 mtspr SPRN_HID0,r4 1024 mtspr SPRN_HID0,r4
1025 sync 1025 sync
1026 bl gemini_prom_init
1027 b __secondary_start 1026 b __secondary_start
1028#endif /* CONFIG_GEMINI */ 1027#endif /* CONFIG_GEMINI */
1029 .globl __secondary_start_psurge 1028
1030__secondary_start_psurge: 1029 .globl __secondary_start_pmac_0
1031 li r24,1 /* cpu # */ 1030__secondary_start_pmac_0:
1032 b __secondary_start_psurge99 1031 /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */
1033 .globl __secondary_start_psurge2 1032 li r24,0
1034__secondary_start_psurge2: 1033 b 1f
1035 li r24,2 /* cpu # */ 1034 li r24,1
1036 b __secondary_start_psurge99 1035 b 1f
1037 .globl __secondary_start_psurge3 1036 li r24,2
1038__secondary_start_psurge3: 1037 b 1f
1039 li r24,3 /* cpu # */ 1038 li r24,3
1040 b __secondary_start_psurge99 10391:
1041__secondary_start_psurge99: 1040 /* on powersurge, we come in here with IR=0 and DR=1, and DBAT 0
1042 /* we come in here with IR=0 and DR=1, and DBAT 0
1043 set to map the 0xf0000000 - 0xffffffff region */ 1041 set to map the 0xf0000000 - 0xffffffff region */
1044 mfmsr r0 1042 mfmsr r0
1045 rlwinm r0,r0,0,28,26 /* clear DR (0x10) */ 1043 rlwinm r0,r0,0,28,26 /* clear DR (0x10) */
diff --git a/arch/ppc/kernel/idle.c b/arch/ppc/kernel/idle.c
index 53547b6de45b..fba29c876b62 100644
--- a/arch/ppc/kernel/idle.c
+++ b/arch/ppc/kernel/idle.c
@@ -22,6 +22,7 @@
22#include <linux/ptrace.h> 22#include <linux/ptrace.h>
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/sysctl.h> 24#include <linux/sysctl.h>
25#include <linux/cpu.h>
25 26
26#include <asm/pgtable.h> 27#include <asm/pgtable.h>
27#include <asm/uaccess.h> 28#include <asm/uaccess.h>
@@ -35,6 +36,7 @@
35void default_idle(void) 36void default_idle(void)
36{ 37{
37 void (*powersave)(void); 38 void (*powersave)(void);
39 int cpu = smp_processor_id();
38 40
39 powersave = ppc_md.power_save; 41 powersave = ppc_md.power_save;
40 42
@@ -44,7 +46,7 @@ void default_idle(void)
44#ifdef CONFIG_SMP 46#ifdef CONFIG_SMP
45 else { 47 else {
46 set_thread_flag(TIF_POLLING_NRFLAG); 48 set_thread_flag(TIF_POLLING_NRFLAG);
47 while (!need_resched()) 49 while (!need_resched() && !cpu_is_offline(cpu))
48 barrier(); 50 barrier();
49 clear_thread_flag(TIF_POLLING_NRFLAG); 51 clear_thread_flag(TIF_POLLING_NRFLAG);
50 } 52 }
@@ -52,6 +54,8 @@ void default_idle(void)
52 } 54 }
53 if (need_resched()) 55 if (need_resched())
54 schedule(); 56 schedule();
57 if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
58 cpu_die();
55} 59}
56 60
57/* 61/*
diff --git a/arch/ppc/kernel/smp.c b/arch/ppc/kernel/smp.c
index e70b587b9e51..726fe7ce1747 100644
--- a/arch/ppc/kernel/smp.c
+++ b/arch/ppc/kernel/smp.c
@@ -45,6 +45,7 @@ cpumask_t cpu_online_map;
45cpumask_t cpu_possible_map; 45cpumask_t cpu_possible_map;
46int smp_hw_index[NR_CPUS]; 46int smp_hw_index[NR_CPUS];
47struct thread_info *secondary_ti; 47struct thread_info *secondary_ti;
48static struct task_struct *idle_tasks[NR_CPUS];
48 49
49EXPORT_SYMBOL(cpu_online_map); 50EXPORT_SYMBOL(cpu_online_map);
50EXPORT_SYMBOL(cpu_possible_map); 51EXPORT_SYMBOL(cpu_possible_map);
@@ -286,7 +287,8 @@ static void __devinit smp_store_cpu_info(int id)
286 287
287void __init smp_prepare_cpus(unsigned int max_cpus) 288void __init smp_prepare_cpus(unsigned int max_cpus)
288{ 289{
289 int num_cpus, i; 290 int num_cpus, i, cpu;
291 struct task_struct *p;
290 292
291 /* Fixup boot cpu */ 293 /* Fixup boot cpu */
292 smp_store_cpu_info(smp_processor_id()); 294 smp_store_cpu_info(smp_processor_id());
@@ -308,6 +310,17 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
308 310
309 if (smp_ops->space_timers) 311 if (smp_ops->space_timers)
310 smp_ops->space_timers(num_cpus); 312 smp_ops->space_timers(num_cpus);
313
314 for_each_cpu(cpu) {
315 if (cpu == smp_processor_id())
316 continue;
317 /* create a process for the processor */
318 p = fork_idle(cpu);
319 if (IS_ERR(p))
320 panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
321 p->thread_info->cpu = cpu;
322 idle_tasks[cpu] = p;
323 }
311} 324}
312 325
313void __devinit smp_prepare_boot_cpu(void) 326void __devinit smp_prepare_boot_cpu(void)
@@ -334,12 +347,17 @@ int __devinit start_secondary(void *unused)
334 set_dec(tb_ticks_per_jiffy); 347 set_dec(tb_ticks_per_jiffy);
335 cpu_callin_map[cpu] = 1; 348 cpu_callin_map[cpu] = 1;
336 349
337 printk("CPU %i done callin...\n", cpu); 350 printk("CPU %d done callin...\n", cpu);
338 smp_ops->setup_cpu(cpu); 351 smp_ops->setup_cpu(cpu);
339 printk("CPU %i done setup...\n", cpu); 352 printk("CPU %d done setup...\n", cpu);
340 local_irq_enable();
341 smp_ops->take_timebase(); 353 smp_ops->take_timebase();
342 printk("CPU %i done timebase take...\n", cpu); 354 printk("CPU %d done timebase take...\n", cpu);
355
356 spin_lock(&call_lock);
357 cpu_set(cpu, cpu_online_map);
358 spin_unlock(&call_lock);
359
360 local_irq_enable();
343 361
344 cpu_idle(); 362 cpu_idle();
345 return 0; 363 return 0;
@@ -347,17 +365,11 @@ int __devinit start_secondary(void *unused)
347 365
348int __cpu_up(unsigned int cpu) 366int __cpu_up(unsigned int cpu)
349{ 367{
350 struct task_struct *p;
351 char buf[32]; 368 char buf[32];
352 int c; 369 int c;
353 370
354 /* create a process for the processor */ 371 secondary_ti = idle_tasks[cpu]->thread_info;
355 /* only regs.msr is actually used, and 0 is OK for it */ 372 mb();
356 p = fork_idle(cpu);
357 if (IS_ERR(p))
358 panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
359 secondary_ti = p->thread_info;
360 p->thread_info->cpu = cpu;
361 373
362 /* 374 /*
363 * There was a cache flush loop here to flush the cache 375 * There was a cache flush loop here to flush the cache
@@ -389,7 +401,11 @@ int __cpu_up(unsigned int cpu)
389 printk("Processor %d found.\n", cpu); 401 printk("Processor %d found.\n", cpu);
390 402
391 smp_ops->give_timebase(); 403 smp_ops->give_timebase();
392 cpu_set(cpu, cpu_online_map); 404
405 /* Wait until cpu puts itself in the online map */
406 while (!cpu_online(cpu))
407 cpu_relax();
408
393 return 0; 409 return 0;
394} 410}
395 411
diff --git a/arch/ppc/kernel/traps.c b/arch/ppc/kernel/traps.c
index 8356d544fa60..961ede87be72 100644
--- a/arch/ppc/kernel/traps.c
+++ b/arch/ppc/kernel/traps.c
@@ -118,6 +118,28 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
118 info.si_code = code; 118 info.si_code = code;
119 info.si_addr = (void __user *) addr; 119 info.si_addr = (void __user *) addr;
120 force_sig_info(signr, &info, current); 120 force_sig_info(signr, &info, current);
121
122 /*
123 * Init gets no signals that it doesn't have a handler for.
124 * That's all very well, but if it has caused a synchronous
125 * exception and we ignore the resulting signal, it will just
126 * generate the same exception over and over again and we get
127 * nowhere. Better to kill it and let the kernel panic.
128 */
129 if (current->pid == 1) {
130 __sighandler_t handler;
131
132 spin_lock_irq(&current->sighand->siglock);
133 handler = current->sighand->action[signr-1].sa.sa_handler;
134 spin_unlock_irq(&current->sighand->siglock);
135 if (handler == SIG_DFL) {
136 /* init has generated a synchronous exception
137 and it doesn't have a handler for the signal */
138 printk(KERN_CRIT "init has generated signal %d "
139 "but has no handler for it\n", signr);
140 do_exit(signr);
141 }
142 }
121} 143}
122 144
123/* 145/*
diff --git a/arch/ppc/lib/Makefile b/arch/ppc/lib/Makefile
index 1c380e67d435..f1e1fb4144f0 100644
--- a/arch/ppc/lib/Makefile
+++ b/arch/ppc/lib/Makefile
@@ -4,6 +4,5 @@
4 4
5obj-y := checksum.o string.o strcase.o dec_and_lock.o div64.o 5obj-y := checksum.o string.o strcase.o dec_and_lock.o div64.o
6 6
7obj-$(CONFIG_SMP) += locks.o
8obj-$(CONFIG_8xx) += rheap.o 7obj-$(CONFIG_8xx) += rheap.o
9obj-$(CONFIG_CPM2) += rheap.o 8obj-$(CONFIG_CPM2) += rheap.o
diff --git a/arch/ppc/lib/dec_and_lock.c b/arch/ppc/lib/dec_and_lock.c
index 4ee888070d91..b18f0d9a00fc 100644
--- a/arch/ppc/lib/dec_and_lock.c
+++ b/arch/ppc/lib/dec_and_lock.c
@@ -11,14 +11,7 @@
11 * has a cmpxchg, and where atomic->value is an int holding 11 * has a cmpxchg, and where atomic->value is an int holding
12 * the value of the atomic (i.e. the high bits aren't used 12 * the value of the atomic (i.e. the high bits aren't used
13 * for a lock or anything like that). 13 * for a lock or anything like that).
14 *
15 * N.B. ATOMIC_DEC_AND_LOCK gets defined in include/linux/spinlock.h
16 * if spinlocks are empty and thus atomic_dec_and_lock is defined
17 * to be atomic_dec_and_test - in that case we don't need it
18 * defined here as well.
19 */ 14 */
20
21#ifndef ATOMIC_DEC_AND_LOCK
22int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock) 15int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
23{ 16{
24 int counter; 17 int counter;
@@ -43,4 +36,3 @@ int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
43} 36}
44 37
45EXPORT_SYMBOL(_atomic_dec_and_lock); 38EXPORT_SYMBOL(_atomic_dec_and_lock);
46#endif /* ATOMIC_DEC_AND_LOCK */
diff --git a/arch/ppc/mm/fault.c b/arch/ppc/mm/fault.c
index 57d9930843ac..ee5e9f25baf9 100644
--- a/arch/ppc/mm/fault.c
+++ b/arch/ppc/mm/fault.c
@@ -278,11 +278,7 @@ bad_area:
278 278
279 /* User mode accesses cause a SIGSEGV */ 279 /* User mode accesses cause a SIGSEGV */
280 if (user_mode(regs)) { 280 if (user_mode(regs)) {
281 info.si_signo = SIGSEGV; 281 _exception(SIGSEGV, regs, code, address);
282 info.si_errno = 0;
283 info.si_code = code;
284 info.si_addr = (void __user *) address;
285 force_sig_info(SIGSEGV, &info, current);
286 return 0; 282 return 0;
287 } 283 }
288 284
diff --git a/arch/ppc/platforms/pmac_sleep.S b/arch/ppc/platforms/pmac_sleep.S
index 8d67adc76925..88419c77ac43 100644
--- a/arch/ppc/platforms/pmac_sleep.S
+++ b/arch/ppc/platforms/pmac_sleep.S
@@ -161,6 +161,8 @@ _GLOBAL(low_sleep_handler)
161 addi r3,r3,sleep_storage@l 161 addi r3,r3,sleep_storage@l
162 stw r5,0(r3) 162 stw r5,0(r3)
163 163
164 .globl low_cpu_die
165low_cpu_die:
164 /* Flush & disable all caches */ 166 /* Flush & disable all caches */
165 bl flush_disable_caches 167 bl flush_disable_caches
166 168
diff --git a/arch/ppc/platforms/pmac_smp.c b/arch/ppc/platforms/pmac_smp.c
index 8e049dab4e63..794a23994b82 100644
--- a/arch/ppc/platforms/pmac_smp.c
+++ b/arch/ppc/platforms/pmac_smp.c
@@ -33,6 +33,7 @@
33#include <linux/spinlock.h> 33#include <linux/spinlock.h>
34#include <linux/errno.h> 34#include <linux/errno.h>
35#include <linux/hardirq.h> 35#include <linux/hardirq.h>
36#include <linux/cpu.h>
36 37
37#include <asm/ptrace.h> 38#include <asm/ptrace.h>
38#include <asm/atomic.h> 39#include <asm/atomic.h>
@@ -55,9 +56,7 @@
55 * Powersurge (old powermac SMP) support. 56 * Powersurge (old powermac SMP) support.
56 */ 57 */
57 58
58extern void __secondary_start_psurge(void); 59extern void __secondary_start_pmac_0(void);
59extern void __secondary_start_psurge2(void); /* Temporary horrible hack */
60extern void __secondary_start_psurge3(void); /* Temporary horrible hack */
61 60
62/* Addresses for powersurge registers */ 61/* Addresses for powersurge registers */
63#define HAMMERHEAD_BASE 0xf8000000 62#define HAMMERHEAD_BASE 0xf8000000
@@ -119,7 +118,7 @@ static volatile int sec_tb_reset = 0;
119static unsigned int pri_tb_hi, pri_tb_lo; 118static unsigned int pri_tb_hi, pri_tb_lo;
120static unsigned int pri_tb_stamp; 119static unsigned int pri_tb_stamp;
121 120
122static void __init core99_init_caches(int cpu) 121static void __devinit core99_init_caches(int cpu)
123{ 122{
124 if (!cpu_has_feature(CPU_FTR_L2CR)) 123 if (!cpu_has_feature(CPU_FTR_L2CR))
125 return; 124 return;
@@ -346,7 +345,7 @@ static int __init smp_psurge_probe(void)
346 345
347static void __init smp_psurge_kick_cpu(int nr) 346static void __init smp_psurge_kick_cpu(int nr)
348{ 347{
349 void (*start)(void) = __secondary_start_psurge; 348 unsigned long start = __pa(__secondary_start_pmac_0) + nr * 8;
350 unsigned long a; 349 unsigned long a;
351 350
352 /* may need to flush here if secondary bats aren't setup */ 351 /* may need to flush here if secondary bats aren't setup */
@@ -356,17 +355,7 @@ static void __init smp_psurge_kick_cpu(int nr)
356 355
357 if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu", 0x353); 356 if (ppc_md.progress) ppc_md.progress("smp_psurge_kick_cpu", 0x353);
358 357
359 /* setup entry point of secondary processor */ 358 out_be32(psurge_start, start);
360 switch (nr) {
361 case 2:
362 start = __secondary_start_psurge2;
363 break;
364 case 3:
365 start = __secondary_start_psurge3;
366 break;
367 }
368
369 out_be32(psurge_start, __pa(start));
370 mb(); 359 mb();
371 360
372 psurge_set_ipi(nr); 361 psurge_set_ipi(nr);
@@ -500,14 +489,14 @@ static int __init smp_core99_probe(void)
500 return ncpus; 489 return ncpus;
501} 490}
502 491
503static void __init smp_core99_kick_cpu(int nr) 492static void __devinit smp_core99_kick_cpu(int nr)
504{ 493{
505 unsigned long save_vector, new_vector; 494 unsigned long save_vector, new_vector;
506 unsigned long flags; 495 unsigned long flags;
507 496
508 volatile unsigned long *vector 497 volatile unsigned long *vector
509 = ((volatile unsigned long *)(KERNELBASE+0x100)); 498 = ((volatile unsigned long *)(KERNELBASE+0x100));
510 if (nr < 1 || nr > 3) 499 if (nr < 0 || nr > 3)
511 return; 500 return;
512 if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu", 0x346); 501 if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu", 0x346);
513 502
@@ -518,19 +507,9 @@ static void __init smp_core99_kick_cpu(int nr)
518 save_vector = *vector; 507 save_vector = *vector;
519 508
520 /* Setup fake reset vector that does 509 /* Setup fake reset vector that does
521 * b __secondary_start_psurge - KERNELBASE 510 * b __secondary_start_pmac_0 + nr*8 - KERNELBASE
522 */ 511 */
523 switch(nr) { 512 new_vector = (unsigned long) __secondary_start_pmac_0 + nr * 8;
524 case 1:
525 new_vector = (unsigned long)__secondary_start_psurge;
526 break;
527 case 2:
528 new_vector = (unsigned long)__secondary_start_psurge2;
529 break;
530 case 3:
531 new_vector = (unsigned long)__secondary_start_psurge3;
532 break;
533 }
534 *vector = 0x48000002 + new_vector - KERNELBASE; 513 *vector = 0x48000002 + new_vector - KERNELBASE;
535 514
536 /* flush data cache and inval instruction cache */ 515 /* flush data cache and inval instruction cache */
@@ -554,7 +533,7 @@ static void __init smp_core99_kick_cpu(int nr)
554 if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu done", 0x347); 533 if (ppc_md.progress) ppc_md.progress("smp_core99_kick_cpu done", 0x347);
555} 534}
556 535
557static void __init smp_core99_setup_cpu(int cpu_nr) 536static void __devinit smp_core99_setup_cpu(int cpu_nr)
558{ 537{
559 /* Setup L2/L3 */ 538 /* Setup L2/L3 */
560 if (cpu_nr != 0) 539 if (cpu_nr != 0)
@@ -668,3 +647,47 @@ struct smp_ops_t core99_smp_ops __pmacdata = {
668 .give_timebase = smp_core99_give_timebase, 647 .give_timebase = smp_core99_give_timebase,
669 .take_timebase = smp_core99_take_timebase, 648 .take_timebase = smp_core99_take_timebase,
670}; 649};
650
651#ifdef CONFIG_HOTPLUG_CPU
652
653int __cpu_disable(void)
654{
655 cpu_clear(smp_processor_id(), cpu_online_map);
656
657 /* XXX reset cpu affinity here */
658 openpic_set_priority(0xf);
659 asm volatile("mtdec %0" : : "r" (0x7fffffff));
660 mb();
661 udelay(20);
662 asm volatile("mtdec %0" : : "r" (0x7fffffff));
663 return 0;
664}
665
666extern void low_cpu_die(void) __attribute__((noreturn)); /* in pmac_sleep.S */
667static int cpu_dead[NR_CPUS];
668
669void cpu_die(void)
670{
671 local_irq_disable();
672 cpu_dead[smp_processor_id()] = 1;
673 mb();
674 low_cpu_die();
675}
676
677void __cpu_die(unsigned int cpu)
678{
679 int timeout;
680
681 timeout = 1000;
682 while (!cpu_dead[cpu]) {
683 if (--timeout == 0) {
684 printk("CPU %u refused to die!\n", cpu);
685 break;
686 }
687 msleep(1);
688 }
689 cpu_callin_map[cpu] = 0;
690 cpu_dead[cpu] = 0;
691}
692
693#endif
diff --git a/arch/ppc/syslib/cpc700_pic.c b/arch/ppc/syslib/cpc700_pic.c
index 774709807538..75fe8eb10693 100644
--- a/arch/ppc/syslib/cpc700_pic.c
+++ b/arch/ppc/syslib/cpc700_pic.c
@@ -90,14 +90,10 @@ cpc700_mask_and_ack_irq(unsigned int irq)
90} 90}
91 91
92static struct hw_interrupt_type cpc700_pic = { 92static struct hw_interrupt_type cpc700_pic = {
93 "CPC700 PIC", 93 .typename = "CPC700 PIC",
94 NULL, 94 .enable = cpc700_unmask_irq,
95 NULL, 95 .disable = cpc700_mask_irq,
96 cpc700_unmask_irq, 96 .ack = cpc700_mask_and_ack_irq,
97 cpc700_mask_irq,
98 cpc700_mask_and_ack_irq,
99 NULL,
100 NULL
101}; 97};
102 98
103__init static void 99__init static void
diff --git a/arch/ppc/syslib/i8259.c b/arch/ppc/syslib/i8259.c
index b9391e650141..5c7908c20e43 100644
--- a/arch/ppc/syslib/i8259.c
+++ b/arch/ppc/syslib/i8259.c
@@ -129,14 +129,11 @@ static void i8259_end_irq(unsigned int irq)
129} 129}
130 130
131struct hw_interrupt_type i8259_pic = { 131struct hw_interrupt_type i8259_pic = {
132 " i8259 ", 132 .typename = " i8259 ",
133 NULL, 133 .enable = i8259_unmask_irq,
134 NULL, 134 .disable = i8259_mask_irq,
135 i8259_unmask_irq, 135 .ack = i8259_mask_and_ack_irq,
136 i8259_mask_irq, 136 .end = i8259_end_irq,
137 i8259_mask_and_ack_irq,
138 i8259_end_irq,
139 NULL
140}; 137};
141 138
142static struct resource pic1_iores = { 139static struct resource pic1_iores = {
diff --git a/arch/ppc/syslib/open_pic2.c b/arch/ppc/syslib/open_pic2.c
index 7e272c51a497..2e0ea92144f6 100644
--- a/arch/ppc/syslib/open_pic2.c
+++ b/arch/ppc/syslib/open_pic2.c
@@ -82,13 +82,11 @@ static void openpic2_end_irq(unsigned int irq_nr);
82static void openpic2_ack_irq(unsigned int irq_nr); 82static void openpic2_ack_irq(unsigned int irq_nr);
83 83
84struct hw_interrupt_type open_pic2 = { 84struct hw_interrupt_type open_pic2 = {
85 " OpenPIC2 ", 85 .typename = " OpenPIC2 ",
86 NULL, 86 .enable = openpic2_enable_irq,
87 NULL, 87 .disable = openpic2_disable_irq,
88 openpic2_enable_irq, 88 .ack = openpic2_ack_irq,
89 openpic2_disable_irq, 89 .end = openpic2_end_irq,
90 openpic2_ack_irq,
91 openpic2_end_irq,
92}; 90};
93 91
94/* 92/*
diff --git a/arch/ppc/syslib/ppc403_pic.c b/arch/ppc/syslib/ppc403_pic.c
index 06cb0af2a58d..ce4d1deb86e9 100644
--- a/arch/ppc/syslib/ppc403_pic.c
+++ b/arch/ppc/syslib/ppc403_pic.c
@@ -34,13 +34,10 @@ static void ppc403_aic_disable(unsigned int irq);
34static void ppc403_aic_disable_and_ack(unsigned int irq); 34static void ppc403_aic_disable_and_ack(unsigned int irq);
35 35
36static struct hw_interrupt_type ppc403_aic = { 36static struct hw_interrupt_type ppc403_aic = {
37 "403GC AIC", 37 .typename = "403GC AIC",
38 NULL, 38 .enable = ppc403_aic_enable,
39 NULL, 39 .disable = ppc403_aic_disable,
40 ppc403_aic_enable, 40 .ack = ppc403_aic_disable_and_ack,
41 ppc403_aic_disable,
42 ppc403_aic_disable_and_ack,
43 0
44}; 41};
45 42
46int 43int
diff --git a/arch/ppc/syslib/xilinx_pic.c b/arch/ppc/syslib/xilinx_pic.c
index e0bd66f0847a..2cbcad278cef 100644
--- a/arch/ppc/syslib/xilinx_pic.c
+++ b/arch/ppc/syslib/xilinx_pic.c
@@ -79,14 +79,11 @@ xilinx_intc_end(unsigned int irq)
79} 79}
80 80
81static struct hw_interrupt_type xilinx_intc = { 81static struct hw_interrupt_type xilinx_intc = {
82 "Xilinx Interrupt Controller", 82 .typename = "Xilinx Interrupt Controller",
83 NULL, 83 .enable = xilinx_intc_enable,
84 NULL, 84 .disable = xilinx_intc_disable,
85 xilinx_intc_enable, 85 .ack = xilinx_intc_disable_and_ack,
86 xilinx_intc_disable, 86 .end = xilinx_intc_end,
87 xilinx_intc_disable_and_ack,
88 xilinx_intc_end,
89 0
90}; 87};
91 88
92int 89int
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile
index 0a23aeacba88..17d2c1eac3b8 100644
--- a/arch/ppc64/Makefile
+++ b/arch/ppc64/Makefile
@@ -56,7 +56,7 @@ LDFLAGS_vmlinux := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
56CFLAGS += -msoft-float -pipe -mminimal-toc -mtraceback=none \ 56CFLAGS += -msoft-float -pipe -mminimal-toc -mtraceback=none \
57 -mcall-aixdesc 57 -mcall-aixdesc
58# Temporary hack until we have migrated to asm-powerpc 58# Temporary hack until we have migrated to asm-powerpc
59CPPFLAGS += -Iinclude3 59CPPFLAGS += -Iarch/$(ARCH)/include
60 60
61GCC_VERSION := $(call cc-version) 61GCC_VERSION := $(call cc-version)
62GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;) 62GCC_BROKEN_VEC := $(shell if [ $(GCC_VERSION) -lt 0400 ] ; then echo "y"; fi ;)
@@ -115,14 +115,15 @@ all: $(KBUILD_IMAGE)
115 115
116archclean: 116archclean:
117 $(Q)$(MAKE) $(clean)=$(boot) 117 $(Q)$(MAKE) $(clean)=$(boot)
118 $(Q)rm -rf include3 118 # Temporary hack until we have migrated to asm-powerpc
119 $(Q)rm -rf arch/$(ARCH)/include
119 120
120 121
121# Temporary hack until we have migrated to asm-powerpc 122# Temporary hack until we have migrated to asm-powerpc
122include/asm: include3/asm 123include/asm: arch/$(ARCH)/include/asm
123include3/asm: 124arch/$(ARCH)/include/asm:
124 $(Q)if [ ! -d include3 ]; then mkdir -p include3; fi; 125 $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
125 $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm 126 $(Q)ln -fsn $(srctree)/include/asm-powerpc arch/$(ARCH)/include/asm
126 127
127define archhelp 128define archhelp
128 echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)' 129 echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)'
diff --git a/arch/ppc64/kernel/cpu_setup_power4.S b/arch/ppc64/kernel/cpu_setup_power4.S
index bfce609e8e6b..1fb673c511ff 100644
--- a/arch/ppc64/kernel/cpu_setup_power4.S
+++ b/arch/ppc64/kernel/cpu_setup_power4.S
@@ -12,7 +12,6 @@
12#include <linux/config.h> 12#include <linux/config.h>
13#include <asm/processor.h> 13#include <asm/processor.h>
14#include <asm/page.h> 14#include <asm/page.h>
15#include <asm/ppc_asm.h>
16#include <asm/cputable.h> 15#include <asm/cputable.h>
17#include <asm/ppc_asm.h> 16#include <asm/ppc_asm.h>
18#include <asm/asm-offsets.h> 17#include <asm/asm-offsets.h>
diff --git a/arch/ppc64/lib/dec_and_lock.c b/arch/ppc64/lib/dec_and_lock.c
index 6e8d8591708c..7b9d4da5cf92 100644
--- a/arch/ppc64/lib/dec_and_lock.c
+++ b/arch/ppc64/lib/dec_and_lock.c
@@ -20,14 +20,7 @@
20 * has a cmpxchg, and where atomic->value is an int holding 20 * has a cmpxchg, and where atomic->value is an int holding
21 * the value of the atomic (i.e. the high bits aren't used 21 * the value of the atomic (i.e. the high bits aren't used
22 * for a lock or anything like that). 22 * for a lock or anything like that).
23 *
24 * N.B. ATOMIC_DEC_AND_LOCK gets defined in include/linux/spinlock.h
25 * if spinlocks are empty and thus atomic_dec_and_lock is defined
26 * to be atomic_dec_and_test - in that case we don't need it
27 * defined here as well.
28 */ 23 */
29
30#ifndef ATOMIC_DEC_AND_LOCK
31int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock) 24int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
32{ 25{
33 int counter; 26 int counter;
@@ -52,4 +45,3 @@ int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
52} 45}
53 46
54EXPORT_SYMBOL(_atomic_dec_and_lock); 47EXPORT_SYMBOL(_atomic_dec_and_lock);
55#endif /* ATOMIC_DEC_AND_LOCK */
diff --git a/arch/ppc64/lib/locks.c b/arch/ppc64/lib/locks.c
index ef70ef91abe2..033643ab69e0 100644
--- a/arch/ppc64/lib/locks.c
+++ b/arch/ppc64/lib/locks.c
@@ -23,12 +23,12 @@
23/* waiting for a spinlock... */ 23/* waiting for a spinlock... */
24#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES) 24#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
25 25
26void __spin_yield(spinlock_t *lock) 26void __spin_yield(raw_spinlock_t *lock)
27{ 27{
28 unsigned int lock_value, holder_cpu, yield_count; 28 unsigned int lock_value, holder_cpu, yield_count;
29 struct paca_struct *holder_paca; 29 struct paca_struct *holder_paca;
30 30
31 lock_value = lock->lock; 31 lock_value = lock->slock;
32 if (lock_value == 0) 32 if (lock_value == 0)
33 return; 33 return;
34 holder_cpu = lock_value & 0xffff; 34 holder_cpu = lock_value & 0xffff;
@@ -38,7 +38,7 @@ void __spin_yield(spinlock_t *lock)
38 if ((yield_count & 1) == 0) 38 if ((yield_count & 1) == 0)
39 return; /* virtual cpu is currently running */ 39 return; /* virtual cpu is currently running */
40 rmb(); 40 rmb();
41 if (lock->lock != lock_value) 41 if (lock->slock != lock_value)
42 return; /* something has changed */ 42 return; /* something has changed */
43#ifdef CONFIG_PPC_ISERIES 43#ifdef CONFIG_PPC_ISERIES
44 HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc, 44 HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc,
@@ -54,7 +54,7 @@ void __spin_yield(spinlock_t *lock)
54 * This turns out to be the same for read and write locks, since 54 * This turns out to be the same for read and write locks, since
55 * we only know the holder if it is write-locked. 55 * we only know the holder if it is write-locked.
56 */ 56 */
57void __rw_yield(rwlock_t *rw) 57void __rw_yield(raw_rwlock_t *rw)
58{ 58{
59 int lock_value; 59 int lock_value;
60 unsigned int holder_cpu, yield_count; 60 unsigned int holder_cpu, yield_count;
@@ -82,9 +82,9 @@ void __rw_yield(rwlock_t *rw)
82} 82}
83#endif 83#endif
84 84
85void spin_unlock_wait(spinlock_t *lock) 85void __raw_spin_unlock_wait(raw_spinlock_t *lock)
86{ 86{
87 while (lock->lock) { 87 while (lock->slock) {
88 HMT_low(); 88 HMT_low();
89 if (SHARED_PROCESSOR) 89 if (SHARED_PROCESSOR)
90 __spin_yield(lock); 90 __spin_yield(lock);
@@ -92,4 +92,4 @@ void spin_unlock_wait(spinlock_t *lock)
92 HMT_medium(); 92 HMT_medium();
93} 93}
94 94
95EXPORT_SYMBOL(spin_unlock_wait); 95EXPORT_SYMBOL(__raw_spin_unlock_wait);
diff --git a/arch/s390/lib/spinlock.c b/arch/s390/lib/spinlock.c
index 888b5596c195..2dc14e9c8327 100644
--- a/arch/s390/lib/spinlock.c
+++ b/arch/s390/lib/spinlock.c
@@ -36,7 +36,7 @@ _diag44(void)
36} 36}
37 37
38void 38void
39_raw_spin_lock_wait(spinlock_t *lp, unsigned int pc) 39_raw_spin_lock_wait(raw_spinlock_t *lp, unsigned int pc)
40{ 40{
41 int count = spin_retry; 41 int count = spin_retry;
42 42
@@ -53,7 +53,7 @@ _raw_spin_lock_wait(spinlock_t *lp, unsigned int pc)
53EXPORT_SYMBOL(_raw_spin_lock_wait); 53EXPORT_SYMBOL(_raw_spin_lock_wait);
54 54
55int 55int
56_raw_spin_trylock_retry(spinlock_t *lp, unsigned int pc) 56_raw_spin_trylock_retry(raw_spinlock_t *lp, unsigned int pc)
57{ 57{
58 int count = spin_retry; 58 int count = spin_retry;
59 59
@@ -67,7 +67,7 @@ _raw_spin_trylock_retry(spinlock_t *lp, unsigned int pc)
67EXPORT_SYMBOL(_raw_spin_trylock_retry); 67EXPORT_SYMBOL(_raw_spin_trylock_retry);
68 68
69void 69void
70_raw_read_lock_wait(rwlock_t *rw) 70_raw_read_lock_wait(raw_rwlock_t *rw)
71{ 71{
72 unsigned int old; 72 unsigned int old;
73 int count = spin_retry; 73 int count = spin_retry;
@@ -86,7 +86,7 @@ _raw_read_lock_wait(rwlock_t *rw)
86EXPORT_SYMBOL(_raw_read_lock_wait); 86EXPORT_SYMBOL(_raw_read_lock_wait);
87 87
88int 88int
89_raw_read_trylock_retry(rwlock_t *rw) 89_raw_read_trylock_retry(raw_rwlock_t *rw)
90{ 90{
91 unsigned int old; 91 unsigned int old;
92 int count = spin_retry; 92 int count = spin_retry;
@@ -102,7 +102,7 @@ _raw_read_trylock_retry(rwlock_t *rw)
102EXPORT_SYMBOL(_raw_read_trylock_retry); 102EXPORT_SYMBOL(_raw_read_trylock_retry);
103 103
104void 104void
105_raw_write_lock_wait(rwlock_t *rw) 105_raw_write_lock_wait(raw_rwlock_t *rw)
106{ 106{
107 int count = spin_retry; 107 int count = spin_retry;
108 108
@@ -119,7 +119,7 @@ _raw_write_lock_wait(rwlock_t *rw)
119EXPORT_SYMBOL(_raw_write_lock_wait); 119EXPORT_SYMBOL(_raw_write_lock_wait);
120 120
121int 121int
122_raw_write_trylock_retry(rwlock_t *rw) 122_raw_write_trylock_retry(raw_rwlock_t *rw)
123{ 123{
124 int count = spin_retry; 124 int count = spin_retry;
125 125
diff --git a/arch/sh/boards/adx/irq_maskreg.c b/arch/sh/boards/adx/irq_maskreg.c
index ca91bb0f1f5c..c0973f8d57ba 100644
--- a/arch/sh/boards/adx/irq_maskreg.c
+++ b/arch/sh/boards/adx/irq_maskreg.c
@@ -37,13 +37,13 @@ static void end_maskreg_irq(unsigned int irq);
37 37
38/* hw_interrupt_type */ 38/* hw_interrupt_type */
39static struct hw_interrupt_type maskreg_irq_type = { 39static struct hw_interrupt_type maskreg_irq_type = {
40 " Mask Register", 40 .typename = " Mask Register",
41 startup_maskreg_irq, 41 .startup = startup_maskreg_irq,
42 shutdown_maskreg_irq, 42 .shutdown = shutdown_maskreg_irq,
43 enable_maskreg_irq, 43 .enable = enable_maskreg_irq,
44 disable_maskreg_irq, 44 .disable = disable_maskreg_irq,
45 mask_and_ack_maskreg, 45 .ack = mask_and_ack_maskreg,
46 end_maskreg_irq 46 .end = end_maskreg_irq
47}; 47};
48 48
49/* actual implementatin */ 49/* actual implementatin */
diff --git a/arch/sh/boards/bigsur/io.c b/arch/sh/boards/bigsur/io.c
index 697144de7419..a9fde781b21a 100644
--- a/arch/sh/boards/bigsur/io.c
+++ b/arch/sh/boards/bigsur/io.c
@@ -37,10 +37,6 @@ static u8 bigsur_iomap_lo_shift[BIGSUR_IOMAP_LO_NMAP];
37static u32 bigsur_iomap_hi[BIGSUR_IOMAP_HI_NMAP]; 37static u32 bigsur_iomap_hi[BIGSUR_IOMAP_HI_NMAP];
38static u8 bigsur_iomap_hi_shift[BIGSUR_IOMAP_HI_NMAP]; 38static u8 bigsur_iomap_hi_shift[BIGSUR_IOMAP_HI_NMAP];
39 39
40#ifndef MAX
41#define MAX(a,b) ((a)>(b)?(a):(b))
42#endif
43
44void bigsur_port_map(u32 baseport, u32 nports, u32 addr, u8 shift) 40void bigsur_port_map(u32 baseport, u32 nports, u32 addr, u8 shift)
45{ 41{
46 u32 port, endport = baseport + nports; 42 u32 port, endport = baseport + nports;
@@ -57,7 +53,7 @@ void bigsur_port_map(u32 baseport, u32 nports, u32 addr, u8 shift)
57 addr += (1<<(BIGSUR_IOMAP_LO_SHIFT)); 53 addr += (1<<(BIGSUR_IOMAP_LO_SHIFT));
58 } 54 }
59 55
60 for (port = MAX(baseport, BIGSUR_IOMAP_LO_THRESH) ; 56 for (port = max_t(u32, baseport, BIGSUR_IOMAP_LO_THRESH);
61 port < endport && port < BIGSUR_IOMAP_HI_THRESH ; 57 port < endport && port < BIGSUR_IOMAP_HI_THRESH ;
62 port += (1<<BIGSUR_IOMAP_HI_SHIFT)) { 58 port += (1<<BIGSUR_IOMAP_HI_SHIFT)) {
63 pr_debug(" maphi[0x%x] = 0x%08x\n", port, addr); 59 pr_debug(" maphi[0x%x] = 0x%08x\n", port, addr);
@@ -80,7 +76,7 @@ void bigsur_port_unmap(u32 baseport, u32 nports)
80 bigsur_iomap_lo[port>>BIGSUR_IOMAP_LO_SHIFT] = 0; 76 bigsur_iomap_lo[port>>BIGSUR_IOMAP_LO_SHIFT] = 0;
81 } 77 }
82 78
83 for (port = MAX(baseport, BIGSUR_IOMAP_LO_THRESH) ; 79 for (port = max_t(u32, baseport, BIGSUR_IOMAP_LO_THRESH);
84 port < endport && port < BIGSUR_IOMAP_HI_THRESH ; 80 port < endport && port < BIGSUR_IOMAP_HI_THRESH ;
85 port += (1<<BIGSUR_IOMAP_HI_SHIFT)) { 81 port += (1<<BIGSUR_IOMAP_HI_SHIFT)) {
86 bigsur_iomap_hi[port>>BIGSUR_IOMAP_HI_SHIFT] = 0; 82 bigsur_iomap_hi[port>>BIGSUR_IOMAP_HI_SHIFT] = 0;
diff --git a/arch/sh/boards/bigsur/irq.c b/arch/sh/boards/bigsur/irq.c
index c188fc32dc9a..6ddbcc77244d 100644
--- a/arch/sh/boards/bigsur/irq.c
+++ b/arch/sh/boards/bigsur/irq.c
@@ -228,23 +228,23 @@ static void shutdown_bigsur_irq(unsigned int irq)
228 228
229/* Define the IRQ structures for the L1 and L2 IRQ types */ 229/* Define the IRQ structures for the L1 and L2 IRQ types */
230static struct hw_interrupt_type bigsur_l1irq_type = { 230static struct hw_interrupt_type bigsur_l1irq_type = {
231 "BigSur-CPLD-Level1-IRQ", 231 .typename = "BigSur-CPLD-Level1-IRQ",
232 startup_bigsur_irq, 232 .startup = startup_bigsur_irq,
233 shutdown_bigsur_irq, 233 .shutdown = shutdown_bigsur_irq,
234 enable_bigsur_l1irq, 234 .enable = enable_bigsur_l1irq,
235 disable_bigsur_l1irq, 235 .disable = disable_bigsur_l1irq,
236 mask_and_ack_bigsur, 236 .ack = mask_and_ack_bigsur,
237 end_bigsur_irq 237 .end = end_bigsur_irq
238}; 238};
239 239
240static struct hw_interrupt_type bigsur_l2irq_type = { 240static struct hw_interrupt_type bigsur_l2irq_type = {
241 "BigSur-CPLD-Level2-IRQ", 241 .typename = "BigSur-CPLD-Level2-IRQ",
242 startup_bigsur_irq, 242 .startup = startup_bigsur_irq,
243 shutdown_bigsur_irq, 243 .shutdown =shutdown_bigsur_irq,
244 enable_bigsur_l2irq, 244 .enable = enable_bigsur_l2irq,
245 disable_bigsur_l2irq, 245 .disable = disable_bigsur_l2irq,
246 mask_and_ack_bigsur, 246 .ack = mask_and_ack_bigsur,
247 end_bigsur_irq 247 .end = end_bigsur_irq
248}; 248};
249 249
250 250
diff --git a/arch/sh/boards/cqreek/irq.c b/arch/sh/boards/cqreek/irq.c
index fa6cfe5a20a7..d1da0d844567 100644
--- a/arch/sh/boards/cqreek/irq.c
+++ b/arch/sh/boards/cqreek/irq.c
@@ -83,13 +83,13 @@ static void shutdown_cqreek_irq(unsigned int irq)
83} 83}
84 84
85static struct hw_interrupt_type cqreek_irq_type = { 85static struct hw_interrupt_type cqreek_irq_type = {
86 "CqREEK-IRQ", 86 .typename = "CqREEK-IRQ",
87 startup_cqreek_irq, 87 .startup = startup_cqreek_irq,
88 shutdown_cqreek_irq, 88 .shutdown = shutdown_cqreek_irq,
89 enable_cqreek_irq, 89 .enable = enable_cqreek_irq,
90 disable_cqreek_irq, 90 .disable = disable_cqreek_irq,
91 mask_and_ack_cqreek, 91 .ack = mask_and_ack_cqreek,
92 end_cqreek_irq 92 .end = end_cqreek_irq
93}; 93};
94 94
95int cqreek_has_ide, cqreek_has_isa; 95int cqreek_has_ide, cqreek_has_isa;
diff --git a/arch/sh/boards/harp/irq.c b/arch/sh/boards/harp/irq.c
index acd58489970f..52d0ba39031b 100644
--- a/arch/sh/boards/harp/irq.c
+++ b/arch/sh/boards/harp/irq.c
@@ -39,13 +39,13 @@ static unsigned int startup_harp_irq(unsigned int irq)
39} 39}
40 40
41static struct hw_interrupt_type harp_irq_type = { 41static struct hw_interrupt_type harp_irq_type = {
42 "Harp-IRQ", 42 .typename = "Harp-IRQ",
43 startup_harp_irq, 43 .startup = startup_harp_irq,
44 shutdown_harp_irq, 44 .shutdown = shutdown_harp_irq,
45 enable_harp_irq, 45 .enable = enable_harp_irq,
46 disable_harp_irq, 46 .disable = disable_harp_irq,
47 mask_and_ack_harp, 47 .ack = mask_and_ack_harp,
48 end_harp_irq 48 .end = end_harp_irq
49}; 49};
50 50
51static void disable_harp_irq(unsigned int irq) 51static void disable_harp_irq(unsigned int irq)
diff --git a/arch/sh/boards/overdrive/irq.c b/arch/sh/boards/overdrive/irq.c
index 23adc6be71e7..715e8feb3a68 100644
--- a/arch/sh/boards/overdrive/irq.c
+++ b/arch/sh/boards/overdrive/irq.c
@@ -86,13 +86,13 @@ static unsigned int startup_od_irq(unsigned int irq)
86} 86}
87 87
88static struct hw_interrupt_type od_irq_type = { 88static struct hw_interrupt_type od_irq_type = {
89 "Overdrive-IRQ", 89 .typename = "Overdrive-IRQ",
90 startup_od_irq, 90 .startup = startup_od_irq,
91 shutdown_od_irq, 91 .shutdown = shutdown_od_irq,
92 enable_od_irq, 92 .enable = enable_od_irq,
93 disable_od_irq, 93 .disable = disable_od_irq,
94 mask_and_ack_od, 94 .ack = mask_and_ack_od,
95 end_od_irq 95 .end = end_od_irq
96}; 96};
97 97
98static void disable_od_irq(unsigned int irq) 98static void disable_od_irq(unsigned int irq)
diff --git a/arch/sh/boards/renesas/hs7751rvoip/irq.c b/arch/sh/boards/renesas/hs7751rvoip/irq.c
index a7921f67a35f..ed4c5b50ea45 100644
--- a/arch/sh/boards/renesas/hs7751rvoip/irq.c
+++ b/arch/sh/boards/renesas/hs7751rvoip/irq.c
@@ -74,13 +74,13 @@ static void end_hs7751rvoip_irq(unsigned int irq)
74} 74}
75 75
76static struct hw_interrupt_type hs7751rvoip_irq_type = { 76static struct hw_interrupt_type hs7751rvoip_irq_type = {
77 "HS7751RVoIP IRQ", 77 .typename = "HS7751RVoIP IRQ",
78 startup_hs7751rvoip_irq, 78 .startup = startup_hs7751rvoip_irq,
79 shutdown_hs7751rvoip_irq, 79 .shutdown = shutdown_hs7751rvoip_irq,
80 enable_hs7751rvoip_irq, 80 .enable = enable_hs7751rvoip_irq,
81 disable_hs7751rvoip_irq, 81 .disable = disable_hs7751rvoip_irq,
82 ack_hs7751rvoip_irq, 82 .ack = ack_hs7751rvoip_irq,
83 end_hs7751rvoip_irq, 83 .end = end_hs7751rvoip_irq,
84}; 84};
85 85
86static void make_hs7751rvoip_irq(unsigned int irq) 86static void make_hs7751rvoip_irq(unsigned int irq)
diff --git a/arch/sh/boards/renesas/rts7751r2d/irq.c b/arch/sh/boards/renesas/rts7751r2d/irq.c
index 95717f4f1e2d..d36c9374aed1 100644
--- a/arch/sh/boards/renesas/rts7751r2d/irq.c
+++ b/arch/sh/boards/renesas/rts7751r2d/irq.c
@@ -88,13 +88,13 @@ static void end_rts7751r2d_irq(unsigned int irq)
88} 88}
89 89
90static struct hw_interrupt_type rts7751r2d_irq_type = { 90static struct hw_interrupt_type rts7751r2d_irq_type = {
91 "RTS7751R2D IRQ", 91 .typename = "RTS7751R2D IRQ",
92 startup_rts7751r2d_irq, 92 .startup = startup_rts7751r2d_irq,
93 shutdown_rts7751r2d_irq, 93 .shutdown = shutdown_rts7751r2d_irq,
94 enable_rts7751r2d_irq, 94 .enable = enable_rts7751r2d_irq,
95 disable_rts7751r2d_irq, 95 .disable = disable_rts7751r2d_irq,
96 ack_rts7751r2d_irq, 96 .ack = ack_rts7751r2d_irq,
97 end_rts7751r2d_irq, 97 .end = end_rts7751r2d_irq,
98}; 98};
99 99
100static void make_rts7751r2d_irq(unsigned int irq) 100static void make_rts7751r2d_irq(unsigned int irq)
diff --git a/arch/sh/boards/renesas/systemh/irq.c b/arch/sh/boards/renesas/systemh/irq.c
index 5675a4134eee..7a2eb10edb56 100644
--- a/arch/sh/boards/renesas/systemh/irq.c
+++ b/arch/sh/boards/renesas/systemh/irq.c
@@ -35,13 +35,13 @@ static void end_systemh_irq(unsigned int irq);
35 35
36/* hw_interrupt_type */ 36/* hw_interrupt_type */
37static struct hw_interrupt_type systemh_irq_type = { 37static struct hw_interrupt_type systemh_irq_type = {
38 " SystemH Register", 38 .typename = " SystemH Register",
39 startup_systemh_irq, 39 .startup = startup_systemh_irq,
40 shutdown_systemh_irq, 40 .shutdown = shutdown_systemh_irq,
41 enable_systemh_irq, 41 .enable = enable_systemh_irq,
42 disable_systemh_irq, 42 .disable = disable_systemh_irq,
43 mask_and_ack_systemh, 43 .ack = mask_and_ack_systemh,
44 end_systemh_irq 44 .end = end_systemh_irq
45}; 45};
46 46
47static unsigned int startup_systemh_irq(unsigned int irq) 47static unsigned int startup_systemh_irq(unsigned int irq)
diff --git a/arch/sh/boards/superh/microdev/irq.c b/arch/sh/boards/superh/microdev/irq.c
index 1298883eca4b..1395c1e65da4 100644
--- a/arch/sh/boards/superh/microdev/irq.c
+++ b/arch/sh/boards/superh/microdev/irq.c
@@ -83,13 +83,13 @@ static unsigned int startup_microdev_irq(unsigned int irq)
83} 83}
84 84
85static struct hw_interrupt_type microdev_irq_type = { 85static struct hw_interrupt_type microdev_irq_type = {
86 "MicroDev-IRQ", 86 .typename = "MicroDev-IRQ",
87 startup_microdev_irq, 87 .startup = startup_microdev_irq,
88 shutdown_microdev_irq, 88 .shutdown = shutdown_microdev_irq,
89 enable_microdev_irq, 89 .enable = enable_microdev_irq,
90 disable_microdev_irq, 90 .disable = disable_microdev_irq,
91 mask_and_ack_microdev, 91 .ack = mask_and_ack_microdev,
92 end_microdev_irq 92 .end = end_microdev_irq
93}; 93};
94 94
95static void disable_microdev_irq(unsigned int irq) 95static void disable_microdev_irq(unsigned int irq)
diff --git a/arch/sh/cchips/hd6446x/hd64465/io.c b/arch/sh/cchips/hd6446x/hd64465/io.c
index 99ac709c550e..84cb142def0b 100644
--- a/arch/sh/cchips/hd6446x/hd64465/io.c
+++ b/arch/sh/cchips/hd6446x/hd64465/io.c
@@ -48,10 +48,6 @@ static unsigned char hd64465_iomap_lo_shift[HD64465_IOMAP_LO_NMAP];
48static unsigned long hd64465_iomap_hi[HD64465_IOMAP_HI_NMAP]; 48static unsigned long hd64465_iomap_hi[HD64465_IOMAP_HI_NMAP];
49static unsigned char hd64465_iomap_hi_shift[HD64465_IOMAP_HI_NMAP]; 49static unsigned char hd64465_iomap_hi_shift[HD64465_IOMAP_HI_NMAP];
50 50
51#ifndef MAX
52#define MAX(a,b) ((a)>(b)?(a):(b))
53#endif
54
55#define PORT2ADDR(x) (sh_mv.mv_isa_port2addr(x)) 51#define PORT2ADDR(x) (sh_mv.mv_isa_port2addr(x))
56 52
57void hd64465_port_map(unsigned short baseport, unsigned int nports, 53void hd64465_port_map(unsigned short baseport, unsigned int nports,
@@ -71,7 +67,7 @@ void hd64465_port_map(unsigned short baseport, unsigned int nports,
71 addr += (1<<(HD64465_IOMAP_LO_SHIFT)); 67 addr += (1<<(HD64465_IOMAP_LO_SHIFT));
72 } 68 }
73 69
74 for (port = MAX(baseport, HD64465_IOMAP_LO_THRESH) ; 70 for (port = max_t(unsigned int, baseport, HD64465_IOMAP_LO_THRESH);
75 port < endport && port < HD64465_IOMAP_HI_THRESH ; 71 port < endport && port < HD64465_IOMAP_HI_THRESH ;
76 port += (1<<HD64465_IOMAP_HI_SHIFT)) { 72 port += (1<<HD64465_IOMAP_HI_SHIFT)) {
77 DPRINTK(" maphi[0x%x] = 0x%08lx\n", port, addr); 73 DPRINTK(" maphi[0x%x] = 0x%08lx\n", port, addr);
@@ -95,7 +91,7 @@ void hd64465_port_unmap(unsigned short baseport, unsigned int nports)
95 hd64465_iomap_lo[port>>HD64465_IOMAP_LO_SHIFT] = 0; 91 hd64465_iomap_lo[port>>HD64465_IOMAP_LO_SHIFT] = 0;
96 } 92 }
97 93
98 for (port = MAX(baseport, HD64465_IOMAP_LO_THRESH) ; 94 for (port = max_t(unsigned int, baseport, HD64465_IOMAP_LO_THRESH);
99 port < endport && port < HD64465_IOMAP_HI_THRESH ; 95 port < endport && port < HD64465_IOMAP_HI_THRESH ;
100 port += (1<<HD64465_IOMAP_HI_SHIFT)) { 96 port += (1<<HD64465_IOMAP_HI_SHIFT)) {
101 hd64465_iomap_hi[port>>HD64465_IOMAP_HI_SHIFT] = 0; 97 hd64465_iomap_hi[port>>HD64465_IOMAP_HI_SHIFT] = 0;
diff --git a/arch/sh/cchips/voyagergx/irq.c b/arch/sh/cchips/voyagergx/irq.c
index 3079234cb65b..1b6ac523b458 100644
--- a/arch/sh/cchips/voyagergx/irq.c
+++ b/arch/sh/cchips/voyagergx/irq.c
@@ -87,13 +87,13 @@ static void shutdown_voyagergx_irq(unsigned int irq)
87} 87}
88 88
89static struct hw_interrupt_type voyagergx_irq_type = { 89static struct hw_interrupt_type voyagergx_irq_type = {
90 "VOYAGERGX-IRQ", 90 .typename = "VOYAGERGX-IRQ",
91 startup_voyagergx_irq, 91 .startup = startup_voyagergx_irq,
92 shutdown_voyagergx_irq, 92 .shutdown = shutdown_voyagergx_irq,
93 enable_voyagergx_irq, 93 .enable = enable_voyagergx_irq,
94 disable_voyagergx_irq, 94 .disable = disable_voyagergx_irq,
95 mask_and_ack_voyagergx, 95 .ack = mask_and_ack_voyagergx,
96 end_voyagergx_irq, 96 .end = end_voyagergx_irq,
97}; 97};
98 98
99static irqreturn_t voyagergx_interrupt(int irq, void *dev_id, struct pt_regs *regs) 99static irqreturn_t voyagergx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
diff --git a/arch/sh/kernel/cpu/irq_imask.c b/arch/sh/kernel/cpu/irq_imask.c
index f76901e732fb..a963d00a971e 100644
--- a/arch/sh/kernel/cpu/irq_imask.c
+++ b/arch/sh/kernel/cpu/irq_imask.c
@@ -46,13 +46,13 @@ static unsigned int startup_imask_irq(unsigned int irq)
46} 46}
47 47
48static struct hw_interrupt_type imask_irq_type = { 48static struct hw_interrupt_type imask_irq_type = {
49 "SR.IMASK", 49 .typename = "SR.IMASK",
50 startup_imask_irq, 50 .startup = startup_imask_irq,
51 shutdown_imask_irq, 51 .shutdown = shutdown_imask_irq,
52 enable_imask_irq, 52 .enable = enable_imask_irq,
53 disable_imask_irq, 53 .disable = disable_imask_irq,
54 mask_and_ack_imask, 54 .ack = mask_and_ack_imask,
55 end_imask_irq 55 .end = end_imask_irq
56}; 56};
57 57
58void static inline set_interrupt_registers(int ip) 58void static inline set_interrupt_registers(int ip)
diff --git a/arch/sh/kernel/cpu/irq_ipr.c b/arch/sh/kernel/cpu/irq_ipr.c
index 7ea3d2d030e5..71f92096132b 100644
--- a/arch/sh/kernel/cpu/irq_ipr.c
+++ b/arch/sh/kernel/cpu/irq_ipr.c
@@ -48,13 +48,13 @@ static unsigned int startup_ipr_irq(unsigned int irq)
48} 48}
49 49
50static struct hw_interrupt_type ipr_irq_type = { 50static struct hw_interrupt_type ipr_irq_type = {
51 "IPR-IRQ", 51 .typename = "IPR-IRQ",
52 startup_ipr_irq, 52 .startup = startup_ipr_irq,
53 shutdown_ipr_irq, 53 .shutdown = shutdown_ipr_irq,
54 enable_ipr_irq, 54 .enable = enable_ipr_irq,
55 disable_ipr_irq, 55 .disable = disable_ipr_irq,
56 mask_and_ack_ipr, 56 .ack = mask_and_ack_ipr,
57 end_ipr_irq 57 .end = end_ipr_irq
58}; 58};
59 59
60static void disable_ipr_irq(unsigned int irq) 60static void disable_ipr_irq(unsigned int irq)
@@ -142,13 +142,13 @@ static unsigned int startup_pint_irq(unsigned int irq)
142} 142}
143 143
144static struct hw_interrupt_type pint_irq_type = { 144static struct hw_interrupt_type pint_irq_type = {
145 "PINT-IRQ", 145 .typename = "PINT-IRQ",
146 startup_pint_irq, 146 .startup = startup_pint_irq,
147 shutdown_pint_irq, 147 .shutdown = shutdown_pint_irq,
148 enable_pint_irq, 148 .enable = enable_pint_irq,
149 disable_pint_irq, 149 .disable = disable_pint_irq,
150 mask_and_ack_pint, 150 .ack = mask_and_ack_pint,
151 end_pint_irq 151 .end = end_pint_irq
152}; 152};
153 153
154static void disable_pint_irq(unsigned int irq) 154static void disable_pint_irq(unsigned int irq)
diff --git a/arch/sh/kernel/cpu/sh4/irq_intc2.c b/arch/sh/kernel/cpu/sh4/irq_intc2.c
index 099ebbf89745..f6b16ba01932 100644
--- a/arch/sh/kernel/cpu/sh4/irq_intc2.c
+++ b/arch/sh/kernel/cpu/sh4/irq_intc2.c
@@ -48,13 +48,13 @@ static unsigned int startup_intc2_irq(unsigned int irq)
48} 48}
49 49
50static struct hw_interrupt_type intc2_irq_type = { 50static struct hw_interrupt_type intc2_irq_type = {
51 "INTC2-IRQ", 51 .typename = "INTC2-IRQ",
52 startup_intc2_irq, 52 .startup = startup_intc2_irq,
53 shutdown_intc2_irq, 53 .shutdown = shutdown_intc2_irq,
54 enable_intc2_irq, 54 .enable = enable_intc2_irq,
55 disable_intc2_irq, 55 .disable = disable_intc2_irq,
56 mask_and_ack_intc2, 56 .ack = mask_and_ack_intc2,
57 end_intc2_irq 57 .end = end_intc2_irq
58}; 58};
59 59
60static void disable_intc2_irq(unsigned int irq) 60static void disable_intc2_irq(unsigned int irq)
diff --git a/arch/sh64/kernel/irq_intc.c b/arch/sh64/kernel/irq_intc.c
index 43f88f3a78b0..fc99bf4e362c 100644
--- a/arch/sh64/kernel/irq_intc.c
+++ b/arch/sh64/kernel/irq_intc.c
@@ -107,13 +107,13 @@ static void mask_and_ack_intc(unsigned int);
107static void end_intc_irq(unsigned int irq); 107static void end_intc_irq(unsigned int irq);
108 108
109static struct hw_interrupt_type intc_irq_type = { 109static struct hw_interrupt_type intc_irq_type = {
110 "INTC", 110 .typename = "INTC",
111 startup_intc_irq, 111 .startup = startup_intc_irq,
112 shutdown_intc_irq, 112 .shutdown = shutdown_intc_irq,
113 enable_intc_irq, 113 .enable = enable_intc_irq,
114 disable_intc_irq, 114 .disable = disable_intc_irq,
115 mask_and_ack_intc, 115 .ack = mask_and_ack_intc,
116 end_intc_irq 116 .end = end_intc_irq
117}; 117};
118 118
119static int irlm; /* IRL mode */ 119static int irlm; /* IRL mode */
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
index 5d974a2b735a..f84809333624 100644
--- a/arch/sparc/kernel/sparc_ksyms.c
+++ b/arch/sparc/kernel/sparc_ksyms.c
@@ -114,17 +114,7 @@ DOT_ALIAS2(unsigned, urem, unsigned, unsigned)
114/* used by various drivers */ 114/* used by various drivers */
115EXPORT_SYMBOL(sparc_cpu_model); 115EXPORT_SYMBOL(sparc_cpu_model);
116EXPORT_SYMBOL(kernel_thread); 116EXPORT_SYMBOL(kernel_thread);
117#ifdef CONFIG_DEBUG_SPINLOCK
118#ifdef CONFIG_SMP 117#ifdef CONFIG_SMP
119EXPORT_SYMBOL(_do_spin_lock);
120EXPORT_SYMBOL(_do_spin_unlock);
121EXPORT_SYMBOL(_spin_trylock);
122EXPORT_SYMBOL(_do_read_lock);
123EXPORT_SYMBOL(_do_read_unlock);
124EXPORT_SYMBOL(_do_write_lock);
125EXPORT_SYMBOL(_do_write_unlock);
126#endif
127#else
128// XXX find what uses (or used) these. 118// XXX find what uses (or used) these.
129EXPORT_SYMBOL(___rw_read_enter); 119EXPORT_SYMBOL(___rw_read_enter);
130EXPORT_SYMBOL(___rw_read_exit); 120EXPORT_SYMBOL(___rw_read_exit);
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile
index 2296ff9dc47a..fa5006946062 100644
--- a/arch/sparc/lib/Makefile
+++ b/arch/sparc/lib/Makefile
@@ -9,5 +9,3 @@ lib-y := mul.o rem.o sdiv.o udiv.o umul.o urem.o ashrdi3.o memcpy.o memset.o \
9 strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \ 9 strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \
10 copy_user.o locks.o atomic.o atomic32.o bitops.o \ 10 copy_user.o locks.o atomic.o atomic32.o bitops.o \
11 lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o 11 lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o
12
13lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o
diff --git a/arch/sparc/lib/debuglocks.c b/arch/sparc/lib/debuglocks.c
deleted file mode 100644
index fb182352782c..000000000000
--- a/arch/sparc/lib/debuglocks.c
+++ /dev/null
@@ -1,202 +0,0 @@
1/* $Id: debuglocks.c,v 1.11 2001/09/20 00:35:31 davem Exp $
2 * debuglocks.c: Debugging versions of SMP locking primitives.
3 *
4 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
5 * Copyright (C) 1998-99 Anton Blanchard (anton@progsoc.uts.edu.au)
6 */
7
8#include <linux/kernel.h>
9#include <linux/sched.h>
10#include <linux/threads.h> /* For NR_CPUS */
11#include <linux/spinlock.h>
12#include <asm/psr.h>
13#include <asm/system.h>
14
15#ifdef CONFIG_SMP
16
17/* Some notes on how these debugging routines work. When a lock is acquired
18 * an extra debugging member lock->owner_pc is set to the caller of the lock
19 * acquisition routine. Right before releasing a lock, the debugging program
20 * counter is cleared to zero.
21 *
22 * Furthermore, since PC's are 4 byte aligned on Sparc, we stuff the CPU
23 * number of the owner in the lowest two bits.
24 */
25
26#define STORE_CALLER(A) __asm__ __volatile__("mov %%i7, %0" : "=r" (A));
27
28static inline void show(char *str, spinlock_t *lock, unsigned long caller)
29{
30 int cpu = smp_processor_id();
31
32 printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)\n",str,
33 lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
34}
35
36static inline void show_read(char *str, rwlock_t *lock, unsigned long caller)
37{
38 int cpu = smp_processor_id();
39
40 printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)\n", str,
41 lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
42}
43
44static inline void show_write(char *str, rwlock_t *lock, unsigned long caller)
45{
46 int cpu = smp_processor_id();
47 int i;
48
49 printk("%s(%p) CPU#%d stuck at %08lx, owner PC(%08lx):CPU(%lx)", str,
50 lock, cpu, caller, lock->owner_pc & ~3, lock->owner_pc & 3);
51
52 for(i = 0; i < NR_CPUS; i++)
53 printk(" reader[%d]=%08lx", i, lock->reader_pc[i]);
54
55 printk("\n");
56}
57
58#undef INIT_STUCK
59#define INIT_STUCK 100000000
60
61void _do_spin_lock(spinlock_t *lock, char *str)
62{
63 unsigned long caller;
64 unsigned long val;
65 int cpu = smp_processor_id();
66 int stuck = INIT_STUCK;
67
68 STORE_CALLER(caller);
69
70again:
71 __asm__ __volatile__("ldstub [%1], %0" : "=r" (val) : "r" (&(lock->lock)));
72 if(val) {
73 while(lock->lock) {
74 if (!--stuck) {
75 show(str, lock, caller);
76 stuck = INIT_STUCK;
77 }
78 barrier();
79 }
80 goto again;
81 }
82 lock->owner_pc = (cpu & 3) | (caller & ~3);
83}
84
85int _spin_trylock(spinlock_t *lock)
86{
87 unsigned long val;
88 unsigned long caller;
89 int cpu = smp_processor_id();
90
91 STORE_CALLER(caller);
92
93 __asm__ __volatile__("ldstub [%1], %0" : "=r" (val) : "r" (&(lock->lock)));
94 if(!val) {
95 /* We got it, record our identity for debugging. */
96 lock->owner_pc = (cpu & 3) | (caller & ~3);
97 }
98 return val == 0;
99}
100
101void _do_spin_unlock(spinlock_t *lock)
102{
103 lock->owner_pc = 0;
104 barrier();
105 lock->lock = 0;
106}
107
108void _do_read_lock(rwlock_t *rw, char *str)
109{
110 unsigned long caller;
111 unsigned long val;
112 int cpu = smp_processor_id();
113 int stuck = INIT_STUCK;
114
115 STORE_CALLER(caller);
116
117wlock_again:
118 __asm__ __volatile__("ldstub [%1 + 3], %0" : "=r" (val) : "r" (&(rw->lock)));
119 if(val) {
120 while(rw->lock & 0xff) {
121 if (!--stuck) {
122 show_read(str, rw, caller);
123 stuck = INIT_STUCK;
124 }
125 barrier();
126 }
127 goto wlock_again;
128 }
129
130 rw->reader_pc[cpu] = caller;
131 barrier();
132 rw->lock++;
133}
134
135void _do_read_unlock(rwlock_t *rw, char *str)
136{
137 unsigned long caller;
138 unsigned long val;
139 int cpu = smp_processor_id();
140 int stuck = INIT_STUCK;
141
142 STORE_CALLER(caller);
143
144wlock_again:
145 __asm__ __volatile__("ldstub [%1 + 3], %0" : "=r" (val) : "r" (&(rw->lock)));
146 if(val) {
147 while(rw->lock & 0xff) {
148 if (!--stuck) {
149 show_read(str, rw, caller);
150 stuck = INIT_STUCK;
151 }
152 barrier();
153 }
154 goto wlock_again;
155 }
156
157 rw->reader_pc[cpu] = 0;
158 barrier();
159 rw->lock -= 0x1ff;
160}
161
162void _do_write_lock(rwlock_t *rw, char *str)
163{
164 unsigned long caller;
165 unsigned long val;
166 int cpu = smp_processor_id();
167 int stuck = INIT_STUCK;
168
169 STORE_CALLER(caller);
170
171wlock_again:
172 __asm__ __volatile__("ldstub [%1 + 3], %0" : "=r" (val) : "r" (&(rw->lock)));
173 if(val) {
174wlock_wait:
175 while(rw->lock) {
176 if (!--stuck) {
177 show_write(str, rw, caller);
178 stuck = INIT_STUCK;
179 }
180 barrier();
181 }
182 goto wlock_again;
183 }
184
185 if (rw->lock & ~0xff) {
186 *(((unsigned char *)&rw->lock)+3) = 0;
187 barrier();
188 goto wlock_wait;
189 }
190
191 barrier();
192 rw->owner_pc = (cpu & 3) | (caller & ~3);
193}
194
195void _do_write_unlock(rwlock_t *rw)
196{
197 rw->owner_pc = 0;
198 barrier();
199 rw->lock = 0;
200}
201
202#endif /* SMP */
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
index 66255434128a..7d10b0397091 100644
--- a/arch/sparc64/kernel/process.c
+++ b/arch/sparc64/kernel/process.c
@@ -607,11 +607,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
607 struct thread_info *t = p->thread_info; 607 struct thread_info *t = p->thread_info;
608 char *child_trap_frame; 608 char *child_trap_frame;
609 609
610#ifdef CONFIG_DEBUG_SPINLOCK
611 p->thread.smp_lock_count = 0;
612 p->thread.smp_lock_pc = 0;
613#endif
614
615 /* Calculate offset to stack_frame & pt_regs */ 610 /* Calculate offset to stack_frame & pt_regs */
616 child_trap_frame = ((char *)t) + (THREAD_SIZE - (TRACEREG_SZ+STACKFRAME_SZ)); 611 child_trap_frame = ((char *)t) + (THREAD_SIZE - (TRACEREG_SZ+STACKFRAME_SZ));
617 memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ)); 612 memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ));
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
index 7d9a0f6c437d..cbb5e59824e5 100644
--- a/arch/sparc64/kernel/sparc64_ksyms.c
+++ b/arch/sparc64/kernel/sparc64_ksyms.c
@@ -115,17 +115,12 @@ EXPORT_PER_CPU_SYMBOL(__cpu_data);
115 115
116/* used by various drivers */ 116/* used by various drivers */
117#ifdef CONFIG_SMP 117#ifdef CONFIG_SMP
118#ifndef CONFIG_DEBUG_SPINLOCK
119/* Out of line rw-locking implementation. */ 118/* Out of line rw-locking implementation. */
120EXPORT_SYMBOL(__read_lock); 119EXPORT_SYMBOL(__read_lock);
121EXPORT_SYMBOL(__read_unlock); 120EXPORT_SYMBOL(__read_unlock);
122EXPORT_SYMBOL(__write_lock); 121EXPORT_SYMBOL(__write_lock);
123EXPORT_SYMBOL(__write_unlock); 122EXPORT_SYMBOL(__write_unlock);
124EXPORT_SYMBOL(__write_trylock); 123EXPORT_SYMBOL(__write_trylock);
125/* Out of line spin-locking implementation. */
126EXPORT_SYMBOL(_raw_spin_lock);
127EXPORT_SYMBOL(_raw_spin_lock_flags);
128#endif
129 124
130/* Hard IRQ locking */ 125/* Hard IRQ locking */
131EXPORT_SYMBOL(synchronize_irq); 126EXPORT_SYMBOL(synchronize_irq);
diff --git a/arch/sparc64/lib/Makefile b/arch/sparc64/lib/Makefile
index 40dbeec7e5d6..d968aebe83b2 100644
--- a/arch/sparc64/lib/Makefile
+++ b/arch/sparc64/lib/Makefile
@@ -14,7 +14,6 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \
14 copy_in_user.o user_fixup.o memmove.o \ 14 copy_in_user.o user_fixup.o memmove.o \
15 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o 15 mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o
16 16
17lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o
18lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o 17lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
19 18
20obj-y += iomap.o 19obj-y += iomap.o
diff --git a/arch/sparc64/lib/debuglocks.c b/arch/sparc64/lib/debuglocks.c
deleted file mode 100644
index f5f0b5586f01..000000000000
--- a/arch/sparc64/lib/debuglocks.c
+++ /dev/null
@@ -1,366 +0,0 @@
1/* $Id: debuglocks.c,v 1.9 2001/11/17 00:10:48 davem Exp $
2 * debuglocks.c: Debugging versions of SMP locking primitives.
3 *
4 * Copyright (C) 1998 David S. Miller (davem@redhat.com)
5 */
6
7#include <linux/config.h>
8#include <linux/kernel.h>
9#include <linux/sched.h>
10#include <linux/spinlock.h>
11#include <asm/system.h>
12
13#ifdef CONFIG_SMP
14
15static inline void show (char *str, spinlock_t *lock, unsigned long caller)
16{
17 int cpu = smp_processor_id();
18
19 printk("%s(%p) CPU#%d stuck at %08x, owner PC(%08x):CPU(%x)\n",
20 str, lock, cpu, (unsigned int) caller,
21 lock->owner_pc, lock->owner_cpu);
22}
23
24static inline void show_read (char *str, rwlock_t *lock, unsigned long caller)
25{
26 int cpu = smp_processor_id();
27
28 printk("%s(%p) CPU#%d stuck at %08x, writer PC(%08x):CPU(%x)\n",
29 str, lock, cpu, (unsigned int) caller,
30 lock->writer_pc, lock->writer_cpu);
31}
32
33static inline void show_write (char *str, rwlock_t *lock, unsigned long caller)
34{
35 int cpu = smp_processor_id();
36 int i;
37
38 printk("%s(%p) CPU#%d stuck at %08x\n",
39 str, lock, cpu, (unsigned int) caller);
40 printk("Writer: PC(%08x):CPU(%x)\n",
41 lock->writer_pc, lock->writer_cpu);
42 printk("Readers:");
43 for (i = 0; i < NR_CPUS; i++)
44 if (lock->reader_pc[i])
45 printk(" %d[%08x]", i, lock->reader_pc[i]);
46 printk("\n");
47}
48
49#undef INIT_STUCK
50#define INIT_STUCK 100000000
51
52void _do_spin_lock(spinlock_t *lock, char *str, unsigned long caller)
53{
54 unsigned long val;
55 int stuck = INIT_STUCK;
56 int cpu = get_cpu();
57 int shown = 0;
58
59again:
60 __asm__ __volatile__("ldstub [%1], %0"
61 : "=r" (val)
62 : "r" (&(lock->lock))
63 : "memory");
64 membar_storeload_storestore();
65 if (val) {
66 while (lock->lock) {
67 if (!--stuck) {
68 if (shown++ <= 2)
69 show(str, lock, caller);
70 stuck = INIT_STUCK;
71 }
72 rmb();
73 }
74 goto again;
75 }
76 lock->owner_pc = ((unsigned int)caller);
77 lock->owner_cpu = cpu;
78 current->thread.smp_lock_count++;
79 current->thread.smp_lock_pc = ((unsigned int)caller);
80
81 put_cpu();
82}
83
84int _do_spin_trylock(spinlock_t *lock, unsigned long caller)
85{
86 unsigned long val;
87 int cpu = get_cpu();
88
89 __asm__ __volatile__("ldstub [%1], %0"
90 : "=r" (val)
91 : "r" (&(lock->lock))
92 : "memory");
93 membar_storeload_storestore();
94 if (!val) {
95 lock->owner_pc = ((unsigned int)caller);
96 lock->owner_cpu = cpu;
97 current->thread.smp_lock_count++;
98 current->thread.smp_lock_pc = ((unsigned int)caller);
99 }
100
101 put_cpu();
102
103 return val == 0;
104}
105
106void _do_spin_unlock(spinlock_t *lock)
107{
108 lock->owner_pc = 0;
109 lock->owner_cpu = NO_PROC_ID;
110 membar_storestore_loadstore();
111 lock->lock = 0;
112 current->thread.smp_lock_count--;
113}
114
115/* Keep INIT_STUCK the same... */
116
117void _do_read_lock(rwlock_t *rw, char *str, unsigned long caller)
118{
119 unsigned long val;
120 int stuck = INIT_STUCK;
121 int cpu = get_cpu();
122 int shown = 0;
123
124wlock_again:
125 /* Wait for any writer to go away. */
126 while (((long)(rw->lock)) < 0) {
127 if (!--stuck) {
128 if (shown++ <= 2)
129 show_read(str, rw, caller);
130 stuck = INIT_STUCK;
131 }
132 rmb();
133 }
134 /* Try once to increment the counter. */
135 __asm__ __volatile__(
136" ldx [%0], %%g1\n"
137" brlz,a,pn %%g1, 2f\n"
138" mov 1, %0\n"
139" add %%g1, 1, %%g7\n"
140" casx [%0], %%g1, %%g7\n"
141" sub %%g1, %%g7, %0\n"
142"2:" : "=r" (val)
143 : "0" (&(rw->lock))
144 : "g1", "g7", "memory");
145 membar_storeload_storestore();
146 if (val)
147 goto wlock_again;
148 rw->reader_pc[cpu] = ((unsigned int)caller);
149 current->thread.smp_lock_count++;
150 current->thread.smp_lock_pc = ((unsigned int)caller);
151
152 put_cpu();
153}
154
155void _do_read_unlock(rwlock_t *rw, char *str, unsigned long caller)
156{
157 unsigned long val;
158 int stuck = INIT_STUCK;
159 int cpu = get_cpu();
160 int shown = 0;
161
162 /* Drop our identity _first_. */
163 rw->reader_pc[cpu] = 0;
164 current->thread.smp_lock_count--;
165runlock_again:
166 /* Spin trying to decrement the counter using casx. */
167 __asm__ __volatile__(
168" membar #StoreLoad | #LoadLoad\n"
169" ldx [%0], %%g1\n"
170" sub %%g1, 1, %%g7\n"
171" casx [%0], %%g1, %%g7\n"
172" membar #StoreLoad | #StoreStore\n"
173" sub %%g1, %%g7, %0\n"
174 : "=r" (val)
175 : "0" (&(rw->lock))
176 : "g1", "g7", "memory");
177 if (val) {
178 if (!--stuck) {
179 if (shown++ <= 2)
180 show_read(str, rw, caller);
181 stuck = INIT_STUCK;
182 }
183 goto runlock_again;
184 }
185
186 put_cpu();
187}
188
189void _do_write_lock(rwlock_t *rw, char *str, unsigned long caller)
190{
191 unsigned long val;
192 int stuck = INIT_STUCK;
193 int cpu = get_cpu();
194 int shown = 0;
195
196wlock_again:
197 /* Spin while there is another writer. */
198 while (((long)rw->lock) < 0) {
199 if (!--stuck) {
200 if (shown++ <= 2)
201 show_write(str, rw, caller);
202 stuck = INIT_STUCK;
203 }
204 rmb();
205 }
206
207 /* Try to acuire the write bit. */
208 __asm__ __volatile__(
209" mov 1, %%g3\n"
210" sllx %%g3, 63, %%g3\n"
211" ldx [%0], %%g1\n"
212" brlz,pn %%g1, 1f\n"
213" or %%g1, %%g3, %%g7\n"
214" casx [%0], %%g1, %%g7\n"
215" membar #StoreLoad | #StoreStore\n"
216" ba,pt %%xcc, 2f\n"
217" sub %%g1, %%g7, %0\n"
218"1: mov 1, %0\n"
219"2:" : "=r" (val)
220 : "0" (&(rw->lock))
221 : "g3", "g1", "g7", "memory");
222 if (val) {
223 /* We couldn't get the write bit. */
224 if (!--stuck) {
225 if (shown++ <= 2)
226 show_write(str, rw, caller);
227 stuck = INIT_STUCK;
228 }
229 goto wlock_again;
230 }
231 if ((rw->lock & ((1UL<<63)-1UL)) != 0UL) {
232 /* Readers still around, drop the write
233 * lock, spin, and try again.
234 */
235 if (!--stuck) {
236 if (shown++ <= 2)
237 show_write(str, rw, caller);
238 stuck = INIT_STUCK;
239 }
240 __asm__ __volatile__(
241" mov 1, %%g3\n"
242" sllx %%g3, 63, %%g3\n"
243"1: ldx [%0], %%g1\n"
244" andn %%g1, %%g3, %%g7\n"
245" casx [%0], %%g1, %%g7\n"
246" cmp %%g1, %%g7\n"
247" membar #StoreLoad | #StoreStore\n"
248" bne,pn %%xcc, 1b\n"
249" nop"
250 : /* no outputs */
251 : "r" (&(rw->lock))
252 : "g3", "g1", "g7", "cc", "memory");
253 while(rw->lock != 0) {
254 if (!--stuck) {
255 if (shown++ <= 2)
256 show_write(str, rw, caller);
257 stuck = INIT_STUCK;
258 }
259 rmb();
260 }
261 goto wlock_again;
262 }
263
264 /* We have it, say who we are. */
265 rw->writer_pc = ((unsigned int)caller);
266 rw->writer_cpu = cpu;
267 current->thread.smp_lock_count++;
268 current->thread.smp_lock_pc = ((unsigned int)caller);
269
270 put_cpu();
271}
272
273void _do_write_unlock(rwlock_t *rw, unsigned long caller)
274{
275 unsigned long val;
276 int stuck = INIT_STUCK;
277 int shown = 0;
278
279 /* Drop our identity _first_ */
280 rw->writer_pc = 0;
281 rw->writer_cpu = NO_PROC_ID;
282 current->thread.smp_lock_count--;
283wlock_again:
284 __asm__ __volatile__(
285" membar #StoreLoad | #LoadLoad\n"
286" mov 1, %%g3\n"
287" sllx %%g3, 63, %%g3\n"
288" ldx [%0], %%g1\n"
289" andn %%g1, %%g3, %%g7\n"
290" casx [%0], %%g1, %%g7\n"
291" membar #StoreLoad | #StoreStore\n"
292" sub %%g1, %%g7, %0\n"
293 : "=r" (val)
294 : "0" (&(rw->lock))
295 : "g3", "g1", "g7", "memory");
296 if (val) {
297 if (!--stuck) {
298 if (shown++ <= 2)
299 show_write("write_unlock", rw, caller);
300 stuck = INIT_STUCK;
301 }
302 goto wlock_again;
303 }
304}
305
306int _do_write_trylock(rwlock_t *rw, char *str, unsigned long caller)
307{
308 unsigned long val;
309 int cpu = get_cpu();
310
311 /* Try to acuire the write bit. */
312 __asm__ __volatile__(
313" mov 1, %%g3\n"
314" sllx %%g3, 63, %%g3\n"
315" ldx [%0], %%g1\n"
316" brlz,pn %%g1, 1f\n"
317" or %%g1, %%g3, %%g7\n"
318" casx [%0], %%g1, %%g7\n"
319" membar #StoreLoad | #StoreStore\n"
320" ba,pt %%xcc, 2f\n"
321" sub %%g1, %%g7, %0\n"
322"1: mov 1, %0\n"
323"2:" : "=r" (val)
324 : "0" (&(rw->lock))
325 : "g3", "g1", "g7", "memory");
326
327 if (val) {
328 put_cpu();
329 return 0;
330 }
331
332 if ((rw->lock & ((1UL<<63)-1UL)) != 0UL) {
333 /* Readers still around, drop the write
334 * lock, return failure.
335 */
336 __asm__ __volatile__(
337" mov 1, %%g3\n"
338" sllx %%g3, 63, %%g3\n"
339"1: ldx [%0], %%g1\n"
340" andn %%g1, %%g3, %%g7\n"
341" casx [%0], %%g1, %%g7\n"
342" cmp %%g1, %%g7\n"
343" membar #StoreLoad | #StoreStore\n"
344" bne,pn %%xcc, 1b\n"
345" nop"
346 : /* no outputs */
347 : "r" (&(rw->lock))
348 : "g3", "g1", "g7", "cc", "memory");
349
350 put_cpu();
351
352 return 0;
353 }
354
355 /* We have it, say who we are. */
356 rw->writer_pc = ((unsigned int)caller);
357 rw->writer_cpu = cpu;
358 current->thread.smp_lock_count++;
359 current->thread.smp_lock_pc = ((unsigned int)caller);
360
361 put_cpu();
362
363 return 1;
364}
365
366#endif /* CONFIG_SMP */
diff --git a/arch/um/Makefile b/arch/um/Makefile
index 577b8d1cf1a6..154803a22698 100644
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -103,7 +103,6 @@ endef
103 103
104ifneq ($(KBUILD_SRC),) 104ifneq ($(KBUILD_SRC),)
105$(shell mkdir -p $(ARCH_DIR) && ln -fsn $(srctree)/$(ARCH_DIR)/Kconfig.$(SUBARCH) $(ARCH_DIR)/Kconfig.arch) 105$(shell mkdir -p $(ARCH_DIR) && ln -fsn $(srctree)/$(ARCH_DIR)/Kconfig.$(SUBARCH) $(ARCH_DIR)/Kconfig.arch)
106CLEAN_FILES += $(ARCH_DIR)/Kconfig.arch
107else 106else
108$(shell cd $(ARCH_DIR) && ln -sf Kconfig.$(SUBARCH) Kconfig.arch) 107$(shell cd $(ARCH_DIR) && ln -sf Kconfig.$(SUBARCH) Kconfig.arch)
109endif 108endif
@@ -144,14 +143,14 @@ endef
144#TT or skas makefiles and don't clean skas_ptregs.h. 143#TT or skas makefiles and don't clean skas_ptregs.h.
145CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/include/uml-config.h \ 144CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/include/uml-config.h \
146 $(GEN_HEADERS) $(ARCH_DIR)/include/skas_ptregs.h \ 145 $(GEN_HEADERS) $(ARCH_DIR)/include/skas_ptregs.h \
147 $(ARCH_DIR)/include/user_constants.h 146 $(ARCH_DIR)/include/user_constants.h $(ARCH_DIR)/Kconfig.arch
148 147
149MRPROPER_FILES += $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) \ 148MRPROPER_FILES += $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) \
150 $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) $(ARCH_DIR)/os \ 149 $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) $(ARCH_DIR)/os
151 $(ARCH_DIR)/Kconfig.arch
152 150
153archclean: 151archclean:
154 $(Q)$(MAKE) $(clean)=$(ARCH_DIR)/util 152 $(Q)$(MAKE) $(clean)=$(ARCH_DIR)/util
153 $(Q)$(MAKE) $(clean)=$(ARCH_DIR)/os-$(OS)/util
155 @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ 154 @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
156 -o -name '*.gcov' \) -type f -print | xargs rm -f 155 -o -name '*.gcov' \) -type f -print | xargs rm -f
157 156
diff --git a/arch/um/include/mem.h b/arch/um/include/mem.h
index 99d3ad4a03e5..e8ff0d8fa610 100644
--- a/arch/um/include/mem.h
+++ b/arch/um/include/mem.h
@@ -13,7 +13,17 @@ extern int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w);
13extern int is_remapped(void *virt); 13extern int is_remapped(void *virt);
14extern int physmem_remove_mapping(void *virt); 14extern int physmem_remove_mapping(void *virt);
15extern void physmem_forget_descriptor(int fd); 15extern void physmem_forget_descriptor(int fd);
16extern unsigned long to_phys(void *virt); 16
17extern unsigned long uml_physmem;
18static inline unsigned long to_phys(void *virt)
19{
20 return(((unsigned long) virt) - uml_physmem);
21}
22
23static inline void *to_virt(unsigned long phys)
24{
25 return((void *) uml_physmem + phys);
26}
17 27
18#endif 28#endif
19 29
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S
index 3942a5f245de..2517ecb8bf27 100644
--- a/arch/um/kernel/dyn.lds.S
+++ b/arch/um/kernel/dyn.lds.S
@@ -146,37 +146,8 @@ SECTIONS
146 } 146 }
147 _end = .; 147 _end = .;
148 PROVIDE (end = .); 148 PROVIDE (end = .);
149 /* Stabs debugging sections. */ 149
150 .stab 0 : { *(.stab) } 150 STABS_DEBUG
151 .stabstr 0 : { *(.stabstr) } 151
152 .stab.excl 0 : { *(.stab.excl) } 152 DWARF_DEBUG
153 .stab.exclstr 0 : { *(.stab.exclstr) }
154 .stab.index 0 : { *(.stab.index) }
155 .stab.indexstr 0 : { *(.stab.indexstr) }
156 .comment 0 : { *(.comment) }
157 /* DWARF debug sections.
158 Symbols in the DWARF debugging sections are relative to the beginning
159 of the section so we begin them at 0. */
160 /* DWARF 1 */
161 .debug 0 : { *(.debug) }
162 .line 0 : { *(.line) }
163 /* GNU DWARF 1 extensions */
164 .debug_srcinfo 0 : { *(.debug_srcinfo) }
165 .debug_sfnames 0 : { *(.debug_sfnames) }
166 /* DWARF 1.1 and DWARF 2 */
167 .debug_aranges 0 : { *(.debug_aranges) }
168 .debug_pubnames 0 : { *(.debug_pubnames) }
169 /* DWARF 2 */
170 .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
171 .debug_abbrev 0 : { *(.debug_abbrev) }
172 .debug_line 0 : { *(.debug_line) }
173 .debug_frame 0 : { *(.debug_frame) }
174 .debug_str 0 : { *(.debug_str) }
175 .debug_loc 0 : { *(.debug_loc) }
176 .debug_macinfo 0 : { *(.debug_macinfo) }
177 /* SGI/MIPS DWARF 2 extensions */
178 .debug_weaknames 0 : { *(.debug_weaknames) }
179 .debug_funcnames 0 : { *(.debug_funcnames) }
180 .debug_typenames 0 : { *(.debug_typenames) }
181 .debug_varnames 0 : { *(.debug_varnames) }
182} 153}
diff --git a/arch/um/kernel/ksyms.c b/arch/um/kernel/ksyms.c
index 32d3076dd220..a97a72e516aa 100644
--- a/arch/um/kernel/ksyms.c
+++ b/arch/um/kernel/ksyms.c
@@ -34,14 +34,9 @@ EXPORT_SYMBOL(host_task_size);
34EXPORT_SYMBOL(arch_validate); 34EXPORT_SYMBOL(arch_validate);
35EXPORT_SYMBOL(get_kmem_end); 35EXPORT_SYMBOL(get_kmem_end);
36 36
37EXPORT_SYMBOL(page_to_phys);
38EXPORT_SYMBOL(phys_to_page);
39EXPORT_SYMBOL(high_physmem); 37EXPORT_SYMBOL(high_physmem);
40EXPORT_SYMBOL(empty_zero_page); 38EXPORT_SYMBOL(empty_zero_page);
41EXPORT_SYMBOL(um_virt_to_phys); 39EXPORT_SYMBOL(um_virt_to_phys);
42EXPORT_SYMBOL(__virt_to_page);
43EXPORT_SYMBOL(to_phys);
44EXPORT_SYMBOL(to_virt);
45EXPORT_SYMBOL(mode_tt); 40EXPORT_SYMBOL(mode_tt);
46EXPORT_SYMBOL(handle_page_fault); 41EXPORT_SYMBOL(handle_page_fault);
47EXPORT_SYMBOL(find_iomem); 42EXPORT_SYMBOL(find_iomem);
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c
index a24e3b7f4bf0..ea670fcc8af5 100644
--- a/arch/um/kernel/physmem.c
+++ b/arch/um/kernel/physmem.c
@@ -248,16 +248,6 @@ unsigned long high_physmem;
248 248
249extern unsigned long physmem_size; 249extern unsigned long physmem_size;
250 250
251void *to_virt(unsigned long phys)
252{
253 return((void *) uml_physmem + phys);
254}
255
256unsigned long to_phys(void *virt)
257{
258 return(((unsigned long) virt) - uml_physmem);
259}
260
261int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem) 251int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
262{ 252{
263 struct page *p, *map; 253 struct page *p, *map;
@@ -298,31 +288,6 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
298 return(0); 288 return(0);
299} 289}
300 290
301struct page *phys_to_page(const unsigned long phys)
302{
303 return(&mem_map[phys >> PAGE_SHIFT]);
304}
305
306struct page *__virt_to_page(const unsigned long virt)
307{
308 return(&mem_map[__pa(virt) >> PAGE_SHIFT]);
309}
310
311phys_t page_to_phys(struct page *page)
312{
313 return((page - mem_map) << PAGE_SHIFT);
314}
315
316pte_t mk_pte(struct page *page, pgprot_t pgprot)
317{
318 pte_t pte;
319
320 pte_set_val(pte, page_to_phys(page), pgprot);
321 if(pte_present(pte))
322 pte_mknewprot(pte_mknewpage(pte));
323 return(pte);
324}
325
326/* Changed during early boot */ 291/* Changed during early boot */
327static unsigned long kmem_top = 0; 292static unsigned long kmem_top = 0;
328 293
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c
index b5fc89fe9eab..87cc6fd76ced 100644
--- a/arch/um/kernel/trap_kern.c
+++ b/arch/um/kernel/trap_kern.c
@@ -57,7 +57,8 @@ good_area:
57 if(is_write && !(vma->vm_flags & VM_WRITE)) 57 if(is_write && !(vma->vm_flags & VM_WRITE))
58 goto out; 58 goto out;
59 59
60 if(!(vma->vm_flags & (VM_READ | VM_EXEC))) 60 /* Don't require VM_READ|VM_EXEC for write faults! */
61 if(!is_write && !(vma->vm_flags & (VM_READ | VM_EXEC)))
61 goto out; 62 goto out;
62 63
63 do { 64 do {
@@ -84,8 +85,7 @@ survive:
84 pte = pte_offset_kernel(pmd, address); 85 pte = pte_offset_kernel(pmd, address);
85 } while(!pte_present(*pte)); 86 } while(!pte_present(*pte));
86 err = 0; 87 err = 0;
87 *pte = pte_mkyoung(*pte); 88 WARN_ON(!pte_young(*pte) || (is_write && !pte_dirty(*pte)));
88 if(pte_write(*pte)) *pte = pte_mkdirty(*pte);
89 flush_tlb_page(vma, address); 89 flush_tlb_page(vma, address);
90out: 90out:
91 up_read(&mm->mmap_sem); 91 up_read(&mm->mmap_sem);
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S
index b03326d391c9..af11915ce0a8 100644
--- a/arch/um/kernel/uml.lds.S
+++ b/arch/um/kernel/uml.lds.S
@@ -93,14 +93,10 @@ SECTIONS
93 *(.bss) 93 *(.bss)
94 *(COMMON) 94 *(COMMON)
95 } 95 }
96 _end = . ; 96 _end = .;
97 PROVIDE (end = .); 97 PROVIDE (end = .);
98 /* Stabs debugging sections. */ 98
99 .stab 0 : { *(.stab) } 99 STABS_DEBUG
100 .stabstr 0 : { *(.stabstr) } 100
101 .stab.excl 0 : { *(.stab.excl) } 101 DWARF_DEBUG
102 .stab.exclstr 0 : { *(.stab.exclstr) }
103 .stab.index 0 : { *(.stab.index) }
104 .stab.indexstr 0 : { *(.stab.indexstr) }
105 .comment 0 : { *(.comment) }
106} 102}
diff --git a/arch/v850/kernel/irq.c b/arch/v850/kernel/irq.c
index 336cbf21dc8f..9e85969ba976 100644
--- a/arch/v850/kernel/irq.c
+++ b/arch/v850/kernel/irq.c
@@ -67,13 +67,13 @@ static void ack_none(unsigned int irq)
67#define end_none enable_none 67#define end_none enable_none
68 68
69struct hw_interrupt_type no_irq_type = { 69struct hw_interrupt_type no_irq_type = {
70 "none", 70 .typename = "none",
71 startup_none, 71 .startup = startup_none,
72 shutdown_none, 72 .shutdown = shutdown_none,
73 enable_none, 73 .enable = enable_none,
74 disable_none, 74 .disable = disable_none,
75 ack_none, 75 .ack = ack_none,
76 end_none 76 .end = end_none
77}; 77};
78 78
79volatile unsigned long irq_err_count, spurious_count; 79volatile unsigned long irq_err_count, spurious_count;
diff --git a/arch/v850/kernel/setup.c b/arch/v850/kernel/setup.c
index abd48409dcca..62bdb8d29fc0 100644
--- a/arch/v850/kernel/setup.c
+++ b/arch/v850/kernel/setup.c
@@ -138,13 +138,13 @@ static void nmi_end (unsigned irq)
138} 138}
139 139
140static struct hw_interrupt_type nmi_irq_type = { 140static struct hw_interrupt_type nmi_irq_type = {
141 "NMI", 141 .typename = "NMI",
142 irq_zero, /* startup */ 142 .startup = irq_zero, /* startup */
143 irq_nop, /* shutdown */ 143 .shutdown = irq_nop, /* shutdown */
144 irq_nop, /* enable */ 144 .enable = irq_nop, /* enable */
145 irq_nop, /* disable */ 145 .disable = irq_nop, /* disable */
146 irq_nop, /* ack */ 146 .ack = irq_nop, /* ack */
147 nmi_end, /* end */ 147 .end = nmi_end, /* end */
148}; 148};
149 149
150void __init init_IRQ (void) 150void __init init_IRQ (void)
diff --git a/arch/v850/kernel/sim.c b/arch/v850/kernel/sim.c
index e2cc5580fa2a..17049aaa8f11 100644
--- a/arch/v850/kernel/sim.c
+++ b/arch/v850/kernel/sim.c
@@ -73,13 +73,13 @@ static void irq_nop (unsigned irq) { }
73static unsigned irq_zero (unsigned irq) { return 0; } 73static unsigned irq_zero (unsigned irq) { return 0; }
74 74
75static struct hw_interrupt_type sim_irq_type = { 75static struct hw_interrupt_type sim_irq_type = {
76 "IRQ", 76 .typename = "IRQ",
77 irq_zero, /* startup */ 77 .startup = irq_zero, /* startup */
78 irq_nop, /* shutdown */ 78 .shutdown = irq_nop, /* shutdown */
79 irq_nop, /* enable */ 79 .enable = irq_nop, /* enable */
80 irq_nop, /* disable */ 80 .disable = irq_nop, /* disable */
81 irq_nop, /* ack */ 81 .ack = irq_nop, /* ack */
82 irq_nop, /* end */ 82 .end = irq_nop, /* end */
83}; 83};
84 84
85void __init mach_init_irqs (void) 85void __init mach_init_irqs (void)
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index 0511d8087910..9aec524be3eb 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -929,7 +929,7 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
929 c->x86_num_cores = intel_num_cpu_cores(c); 929 c->x86_num_cores = intel_num_cpu_cores(c);
930} 930}
931 931
932void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c) 932static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
933{ 933{
934 char *v = c->x86_vendor_id; 934 char *v = c->x86_vendor_id;
935 935
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S
index d4abb07af52d..6dd642cad2ef 100644
--- a/arch/x86_64/kernel/vmlinux.lds.S
+++ b/arch/x86_64/kernel/vmlinux.lds.S
@@ -194,20 +194,7 @@ SECTIONS
194#endif 194#endif
195 } 195 }
196 196
197 /* DWARF 2 */ 197 STABS_DEBUG
198 .debug_info 0 : { *(.debug_info) } 198
199 .debug_abbrev 0 : { *(.debug_abbrev) } 199 DWARF_DEBUG
200 .debug_line 0 : { *(.debug_line) }
201 .debug_frame 0 : { *(.debug_frame) }
202 .debug_str 0 : { *(.debug_str) }
203 .debug_loc 0 : { *(.debug_loc) }
204 .debug_macinfo 0 : { *(.debug_macinfo) }
205 /* SGI/MIPS DWARF 2 extensions */
206 .debug_weaknames 0 : { *(.debug_weaknames) }
207 .debug_funcnames 0 : { *(.debug_funcnames) }
208 .debug_typenames 0 : { *(.debug_typenames) }
209 .debug_varnames 0 : { *(.debug_varnames) }
210
211
212 .comment 0 : { *(.comment) }
213} 200}
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
index 7249ba2b7a27..aee50b453265 100644
--- a/drivers/acpi/sleep/main.c
+++ b/drivers/acpi/sleep/main.c
@@ -23,7 +23,6 @@ u8 sleep_states[ACPI_S_STATE_COUNT];
23 23
24static struct pm_ops acpi_pm_ops; 24static struct pm_ops acpi_pm_ops;
25 25
26extern void do_suspend_lowlevel_s4bios(void);
27extern void do_suspend_lowlevel(void); 26extern void do_suspend_lowlevel(void);
28 27
29static u32 acpi_suspend_states[] = { 28static u32 acpi_suspend_states[] = {
@@ -98,8 +97,6 @@ static int acpi_pm_enter(suspend_state_t pm_state)
98 case PM_SUSPEND_DISK: 97 case PM_SUSPEND_DISK:
99 if (acpi_pm_ops.pm_disk_mode == PM_DISK_PLATFORM) 98 if (acpi_pm_ops.pm_disk_mode == PM_DISK_PLATFORM)
100 status = acpi_enter_sleep_state(acpi_state); 99 status = acpi_enter_sleep_state(acpi_state);
101 else
102 do_suspend_lowlevel_s4bios();
103 break; 100 break;
104 case PM_SUSPEND_MAX: 101 case PM_SUSPEND_MAX:
105 acpi_power_off(); 102 acpi_power_off();
@@ -206,11 +203,6 @@ static int __init acpi_sleep_init(void)
206 printk(" S%d", i); 203 printk(" S%d", i);
207 } 204 }
208 if (i == ACPI_STATE_S4) { 205 if (i == ACPI_STATE_S4) {
209 if (acpi_gbl_FACS->S4bios_f) {
210 sleep_states[i] = 1;
211 printk(" S4bios");
212 acpi_pm_ops.pm_disk_mode = PM_DISK_FIRMWARE;
213 }
214 if (sleep_states[i]) 206 if (sleep_states[i])
215 acpi_pm_ops.pm_disk_mode = PM_DISK_PLATFORM; 207 acpi_pm_ops.pm_disk_mode = PM_DISK_PLATFORM;
216 } 208 }
diff --git a/drivers/acpi/sleep/poweroff.c b/drivers/acpi/sleep/poweroff.c
index a5f947de879b..af7935a95bcc 100644
--- a/drivers/acpi/sleep/poweroff.c
+++ b/drivers/acpi/sleep/poweroff.c
@@ -21,9 +21,7 @@ int acpi_sleep_prepare(u32 acpi_state)
21{ 21{
22#ifdef CONFIG_ACPI_SLEEP 22#ifdef CONFIG_ACPI_SLEEP
23 /* do we have a wakeup address for S2 and S3? */ 23 /* do we have a wakeup address for S2 and S3? */
24 /* Here, we support only S4BIOS, those we set the wakeup address */ 24 if (acpi_state == ACPI_STATE_S3) {
25 /* S4OS is only supported for now via swsusp.. */
26 if (acpi_state == ACPI_STATE_S3 || acpi_state == ACPI_STATE_S4) {
27 if (!acpi_wakeup_address) { 25 if (!acpi_wakeup_address) {
28 return -EFAULT; 26 return -EFAULT;
29 } 27 }
diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c
index 09a603f3523e..4696a85a98b9 100644
--- a/drivers/acpi/sleep/proc.c
+++ b/drivers/acpi/sleep/proc.c
@@ -25,8 +25,6 @@ static int acpi_system_sleep_seq_show(struct seq_file *seq, void *offset)
25 for (i = 0; i <= ACPI_STATE_S5; i++) { 25 for (i = 0; i <= ACPI_STATE_S5; i++) {
26 if (sleep_states[i]) { 26 if (sleep_states[i]) {
27 seq_printf(seq, "S%d ", i); 27 seq_printf(seq, "S%d ", i);
28 if (i == ACPI_STATE_S4 && acpi_gbl_FACS->S4bios_f)
29 seq_printf(seq, "S4bios ");
30 } 28 }
31 } 29 }
32 30
diff --git a/drivers/base/dmapool.c b/drivers/base/dmapool.c
index c4aebf2f522d..60a7ef6a201b 100644
--- a/drivers/base/dmapool.c
+++ b/drivers/base/dmapool.c
@@ -262,7 +262,8 @@ dma_pool_destroy (struct dma_pool *pool)
262 * If such a memory block can't be allocated, null is returned. 262 * If such a memory block can't be allocated, null is returned.
263 */ 263 */
264void * 264void *
265dma_pool_alloc (struct dma_pool *pool, int mem_flags, dma_addr_t *handle) 265dma_pool_alloc (struct dma_pool *pool, unsigned int __nocast mem_flags,
266 dma_addr_t *handle)
266{ 267{
267 unsigned long flags; 268 unsigned long flags;
268 struct dma_page *page; 269 struct dma_page *page;
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 418b1469d75d..28f2c177a541 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -1713,10 +1713,9 @@ static unsigned long pollcomplete(int ctlr)
1713 1713
1714 for (i = 20 * HZ; i > 0; i--) { 1714 for (i = 20 * HZ; i > 0; i--) {
1715 done = hba[ctlr]->access.command_completed(hba[ctlr]); 1715 done = hba[ctlr]->access.command_completed(hba[ctlr]);
1716 if (done == FIFO_EMPTY) { 1716 if (done == FIFO_EMPTY)
1717 set_current_state(TASK_UNINTERRUPTIBLE); 1717 schedule_timeout_uninterruptible(1);
1718 schedule_timeout(1); 1718 else
1719 } else
1720 return (done); 1719 return (done);
1721 } 1720 }
1722 /* Invalid address to tell caller we ran out of time */ 1721 /* Invalid address to tell caller we ran out of time */
diff --git a/drivers/block/cfq-iosched.c b/drivers/block/cfq-iosched.c
index 30c0903c7cdd..cd056e7e64ec 100644
--- a/drivers/block/cfq-iosched.c
+++ b/drivers/block/cfq-iosched.c
@@ -2260,6 +2260,8 @@ static void cfq_put_cfqd(struct cfq_data *cfqd)
2260 if (!atomic_dec_and_test(&cfqd->ref)) 2260 if (!atomic_dec_and_test(&cfqd->ref))
2261 return; 2261 return;
2262 2262
2263 blk_put_queue(q);
2264
2263 cfq_shutdown_timer_wq(cfqd); 2265 cfq_shutdown_timer_wq(cfqd);
2264 q->elevator->elevator_data = NULL; 2266 q->elevator->elevator_data = NULL;
2265 2267
@@ -2316,6 +2318,7 @@ static int cfq_init_queue(request_queue_t *q, elevator_t *e)
2316 e->elevator_data = cfqd; 2318 e->elevator_data = cfqd;
2317 2319
2318 cfqd->queue = q; 2320 cfqd->queue = q;
2321 atomic_inc(&q->refcnt);
2319 2322
2320 cfqd->max_queued = q->nr_requests / 4; 2323 cfqd->max_queued = q->nr_requests / 4;
2321 q->nr_batching = cfq_queued; 2324 q->nr_batching = cfq_queued;
diff --git a/drivers/block/paride/pcd.c b/drivers/block/paride/pcd.c
index 7289f67e9568..ac5ba462710b 100644
--- a/drivers/block/paride/pcd.c
+++ b/drivers/block/paride/pcd.c
@@ -516,8 +516,7 @@ static int pcd_tray_move(struct cdrom_device_info *cdi, int position)
516 516
517static void pcd_sleep(int cs) 517static void pcd_sleep(int cs)
518{ 518{
519 current->state = TASK_INTERRUPTIBLE; 519 schedule_timeout_interruptible(cs);
520 schedule_timeout(cs);
521} 520}
522 521
523static int pcd_reset(struct pcd_unit *cd) 522static int pcd_reset(struct pcd_unit *cd)
diff --git a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c
index 060b1f2a91dd..711d2f314ac3 100644
--- a/drivers/block/paride/pf.c
+++ b/drivers/block/paride/pf.c
@@ -507,8 +507,7 @@ static void pf_eject(struct pf_unit *pf)
507 507
508static void pf_sleep(int cs) 508static void pf_sleep(int cs)
509{ 509{
510 current->state = TASK_INTERRUPTIBLE; 510 schedule_timeout_interruptible(cs);
511 schedule_timeout(cs);
512} 511}
513 512
514/* the ATAPI standard actually specifies the contents of all 7 registers 513/* the ATAPI standard actually specifies the contents of all 7 registers
diff --git a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c
index 84d8e291ed96..b3982395f22b 100644
--- a/drivers/block/paride/pg.c
+++ b/drivers/block/paride/pg.c
@@ -276,8 +276,7 @@ static inline u8 DRIVE(struct pg *dev)
276 276
277static void pg_sleep(int cs) 277static void pg_sleep(int cs)
278{ 278{
279 current->state = TASK_INTERRUPTIBLE; 279 schedule_timeout_interruptible(cs);
280 schedule_timeout(cs);
281} 280}
282 281
283static int pg_wait(struct pg *dev, int go, int stop, unsigned long tmo, char *msg) 282static int pg_wait(struct pg *dev, int go, int stop, unsigned long tmo, char *msg)
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c
index 5fe8ee86f095..d8d35233cf49 100644
--- a/drivers/block/paride/pt.c
+++ b/drivers/block/paride/pt.c
@@ -383,8 +383,7 @@ static int pt_atapi(struct pt_unit *tape, char *cmd, int dlen, char *buf, char *
383 383
384static void pt_sleep(int cs) 384static void pt_sleep(int cs)
385{ 385{
386 current->state = TASK_INTERRUPTIBLE; 386 schedule_timeout_interruptible(cs);
387 schedule_timeout(cs);
388} 387}
389 388
390static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg) 389static int pt_poll_dsc(struct pt_unit *tape, int pause, int tmo, char *msg)
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
index e5f7494c00ee..e425ad3eebba 100644
--- a/drivers/block/swim3.c
+++ b/drivers/block/swim3.c
@@ -834,8 +834,7 @@ static int fd_eject(struct floppy_state *fs)
834 break; 834 break;
835 } 835 }
836 swim3_select(fs, RELAX); 836 swim3_select(fs, RELAX);
837 current->state = TASK_INTERRUPTIBLE; 837 schedule_timeout_interruptible(1);
838 schedule_timeout(1);
839 if (swim3_readbit(fs, DISK_IN) == 0) 838 if (swim3_readbit(fs, DISK_IN) == 0)
840 break; 839 break;
841 } 840 }
@@ -906,8 +905,7 @@ static int floppy_open(struct inode *inode, struct file *filp)
906 break; 905 break;
907 } 906 }
908 swim3_select(fs, RELAX); 907 swim3_select(fs, RELAX);
909 current->state = TASK_INTERRUPTIBLE; 908 schedule_timeout_interruptible(1);
910 schedule_timeout(1);
911 } 909 }
912 if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0 910 if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0
913 || swim3_readbit(fs, DISK_IN) == 0)) 911 || swim3_readbit(fs, DISK_IN) == 0))
@@ -992,8 +990,7 @@ static int floppy_revalidate(struct gendisk *disk)
992 if (signal_pending(current)) 990 if (signal_pending(current))
993 break; 991 break;
994 swim3_select(fs, RELAX); 992 swim3_select(fs, RELAX);
995 current->state = TASK_INTERRUPTIBLE; 993 schedule_timeout_interruptible(1);
996 schedule_timeout(1);
997 } 994 }
998 ret = swim3_readbit(fs, SEEK_COMPLETE) == 0 995 ret = swim3_readbit(fs, SEEK_COMPLETE) == 0
999 || swim3_readbit(fs, DISK_IN) == 0; 996 || swim3_readbit(fs, DISK_IN) == 0;
diff --git a/drivers/block/swim_iop.c b/drivers/block/swim_iop.c
index a1283f6dc018..89e3c2f8b776 100644
--- a/drivers/block/swim_iop.c
+++ b/drivers/block/swim_iop.c
@@ -338,8 +338,7 @@ static int swimiop_eject(struct floppy_state *fs)
338 err = -EINTR; 338 err = -EINTR;
339 break; 339 break;
340 } 340 }
341 current->state = TASK_INTERRUPTIBLE; 341 schedule_timeout_interruptible(1);
342 schedule_timeout(1);
343 } 342 }
344 release_drive(fs); 343 release_drive(fs);
345 return cmd->error; 344 return cmd->error;
diff --git a/drivers/block/umem.c b/drivers/block/umem.c
index 0c4c121d2e79..0f48301342da 100644
--- a/drivers/block/umem.c
+++ b/drivers/block/umem.c
@@ -34,6 +34,7 @@
34 * - set initialised bit then. 34 * - set initialised bit then.
35 */ 35 */
36 36
37//#define DEBUG /* uncomment if you want debugging info (pr_debug) */
37#include <linux/config.h> 38#include <linux/config.h>
38#include <linux/sched.h> 39#include <linux/sched.h>
39#include <linux/fs.h> 40#include <linux/fs.h>
@@ -58,10 +59,6 @@
58#include <asm/uaccess.h> 59#include <asm/uaccess.h>
59#include <asm/io.h> 60#include <asm/io.h>
60 61
61#define PRINTK(x...) do {} while (0)
62#define dprintk(x...) do {} while (0)
63/*#define dprintk(x...) printk(x) */
64
65#define MM_MAXCARDS 4 62#define MM_MAXCARDS 4
66#define MM_RAHEAD 2 /* two sectors */ 63#define MM_RAHEAD 2 /* two sectors */
67#define MM_BLKSIZE 1024 /* 1k blocks */ 64#define MM_BLKSIZE 1024 /* 1k blocks */
@@ -299,7 +296,7 @@ static void mm_start_io(struct cardinfo *card)
299 296
300 /* make the last descriptor end the chain */ 297 /* make the last descriptor end the chain */
301 page = &card->mm_pages[card->Active]; 298 page = &card->mm_pages[card->Active];
302 PRINTK("start_io: %d %d->%d\n", card->Active, page->headcnt, page->cnt-1); 299 pr_debug("start_io: %d %d->%d\n", card->Active, page->headcnt, page->cnt-1);
303 desc = &page->desc[page->cnt-1]; 300 desc = &page->desc[page->cnt-1];
304 301
305 desc->control_bits |= cpu_to_le32(DMASCR_CHAIN_COMP_EN); 302 desc->control_bits |= cpu_to_le32(DMASCR_CHAIN_COMP_EN);
@@ -532,7 +529,7 @@ static void process_page(unsigned long data)
532 activate(card); 529 activate(card);
533 } else { 530 } else {
534 /* haven't finished with this one yet */ 531 /* haven't finished with this one yet */
535 PRINTK("do some more\n"); 532 pr_debug("do some more\n");
536 mm_start_io(card); 533 mm_start_io(card);
537 } 534 }
538 out_unlock: 535 out_unlock:
@@ -555,7 +552,7 @@ static void process_page(unsigned long data)
555static int mm_make_request(request_queue_t *q, struct bio *bio) 552static int mm_make_request(request_queue_t *q, struct bio *bio)
556{ 553{
557 struct cardinfo *card = q->queuedata; 554 struct cardinfo *card = q->queuedata;
558 PRINTK("mm_make_request %ld %d\n", bh->b_rsector, bh->b_size); 555 pr_debug("mm_make_request %ld %d\n", bh->b_rsector, bh->b_size);
559 556
560 bio->bi_phys_segments = bio->bi_idx; /* count of completed segments*/ 557 bio->bi_phys_segments = bio->bi_idx; /* count of completed segments*/
561 spin_lock_irq(&card->lock); 558 spin_lock_irq(&card->lock);
diff --git a/drivers/block/xd.c b/drivers/block/xd.c
index 1676033da6c6..68b6d7b154cf 100644
--- a/drivers/block/xd.c
+++ b/drivers/block/xd.c
@@ -47,6 +47,7 @@
47#include <linux/wait.h> 47#include <linux/wait.h>
48#include <linux/blkdev.h> 48#include <linux/blkdev.h>
49#include <linux/blkpg.h> 49#include <linux/blkpg.h>
50#include <linux/delay.h>
50 51
51#include <asm/system.h> 52#include <asm/system.h>
52#include <asm/io.h> 53#include <asm/io.h>
@@ -62,7 +63,7 @@ static int xd[5] = { -1,-1,-1,-1, };
62 63
63#define XD_DONT_USE_DMA 0 /* Initial value. may be overriden using 64#define XD_DONT_USE_DMA 0 /* Initial value. may be overriden using
64 "nodma" module option */ 65 "nodma" module option */
65#define XD_INIT_DISK_DELAY (30*HZ/1000) /* 30 ms delay during disk initialization */ 66#define XD_INIT_DISK_DELAY (30) /* 30 ms delay during disk initialization */
66 67
67/* Above may need to be increased if a problem with the 2nd drive detection 68/* Above may need to be increased if a problem with the 2nd drive detection
68 (ST11M controller) or resetting a controller (WD) appears */ 69 (ST11M controller) or resetting a controller (WD) appears */
@@ -529,10 +530,8 @@ static inline u_char xd_waitport (u_short port,u_char flags,u_char mask,u_long t
529 int success; 530 int success;
530 531
531 xdc_busy = 1; 532 xdc_busy = 1;
532 while ((success = ((inb(port) & mask) != flags)) && time_before(jiffies, expiry)) { 533 while ((success = ((inb(port) & mask) != flags)) && time_before(jiffies, expiry))
533 set_current_state(TASK_UNINTERRUPTIBLE); 534 schedule_timeout_uninterruptible(1);
534 schedule_timeout(1);
535 }
536 xdc_busy = 0; 535 xdc_busy = 0;
537 return (success); 536 return (success);
538} 537}
@@ -633,14 +632,12 @@ static u_char __init xd_initdrives (void (*init_drive)(u_char drive))
633 for (i = 0; i < XD_MAXDRIVES; i++) { 632 for (i = 0; i < XD_MAXDRIVES; i++) {
634 xd_build(cmdblk,CMD_TESTREADY,i,0,0,0,0,0); 633 xd_build(cmdblk,CMD_TESTREADY,i,0,0,0,0,0);
635 if (!xd_command(cmdblk,PIO_MODE,NULL,NULL,NULL,XD_TIMEOUT*8)) { 634 if (!xd_command(cmdblk,PIO_MODE,NULL,NULL,NULL,XD_TIMEOUT*8)) {
636 set_current_state(TASK_INTERRUPTIBLE); 635 msleep_interruptible(XD_INIT_DISK_DELAY);
637 schedule_timeout(XD_INIT_DISK_DELAY);
638 636
639 init_drive(count); 637 init_drive(count);
640 count++; 638 count++;
641 639
642 set_current_state(TASK_INTERRUPTIBLE); 640 msleep_interruptible(XD_INIT_DISK_DELAY);
643 schedule_timeout(XD_INIT_DISK_DELAY);
644 } 641 }
645 } 642 }
646 return (count); 643 return (count);
@@ -761,8 +758,7 @@ static void __init xd_wd_init_controller (unsigned int address)
761 758
762 outb(0,XD_RESET); /* reset the controller */ 759 outb(0,XD_RESET); /* reset the controller */
763 760
764 set_current_state(TASK_UNINTERRUPTIBLE); 761 msleep(XD_INIT_DISK_DELAY);
765 schedule_timeout(XD_INIT_DISK_DELAY);
766} 762}
767 763
768static void __init xd_wd_init_drive (u_char drive) 764static void __init xd_wd_init_drive (u_char drive)
@@ -936,8 +932,7 @@ If you need non-standard settings use the xd=... command */
936 xd_maxsectors = 0x01; 932 xd_maxsectors = 0x01;
937 outb(0,XD_RESET); /* reset the controller */ 933 outb(0,XD_RESET); /* reset the controller */
938 934
939 set_current_state(TASK_UNINTERRUPTIBLE); 935 msleep(XD_INIT_DISK_DELAY);
940 schedule_timeout(XD_INIT_DISK_DELAY);
941} 936}
942 937
943static void __init xd_xebec_init_drive (u_char drive) 938static void __init xd_xebec_init_drive (u_char drive)
diff --git a/drivers/block/z2ram.c b/drivers/block/z2ram.c
index 007f6a662439..bb5e8d665a2a 100644
--- a/drivers/block/z2ram.c
+++ b/drivers/block/z2ram.c
@@ -296,7 +296,7 @@ z2_open( struct inode *inode, struct file *filp )
296 return 0; 296 return 0;
297 297
298err_out_kfree: 298err_out_kfree:
299 kfree( z2ram_map ); 299 kfree(z2ram_map);
300err_out: 300err_out:
301 return rc; 301 return rc;
302} 302}
diff --git a/drivers/cdrom/sbpcd.c b/drivers/cdrom/sbpcd.c
index 30a897755361..466e9c2974bd 100644
--- a/drivers/cdrom/sbpcd.c
+++ b/drivers/cdrom/sbpcd.c
@@ -827,8 +827,7 @@ static void mark_timeout_audio(u_long i)
827static void sbp_sleep(u_int time) 827static void sbp_sleep(u_int time)
828{ 828{
829 sti(); 829 sti();
830 current->state = TASK_INTERRUPTIBLE; 830 schedule_timeout_interruptible(time);
831 schedule_timeout(time);
832 sti(); 831 sti();
833} 832}
834/*==========================================================================*/ 833/*==========================================================================*/
@@ -4216,7 +4215,8 @@ static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
4216 4215
4217 case CDROMAUDIOBUFSIZ: /* configure the audio buffer size */ 4216 case CDROMAUDIOBUFSIZ: /* configure the audio buffer size */
4218 msg(DBG_IOC,"ioctl: CDROMAUDIOBUFSIZ entered.\n"); 4217 msg(DBG_IOC,"ioctl: CDROMAUDIOBUFSIZ entered.\n");
4219 if (current_drive->sbp_audsiz>0) vfree(current_drive->aud_buf); 4218 if (current_drive->sbp_audsiz>0)
4219 vfree(current_drive->aud_buf);
4220 current_drive->aud_buf=NULL; 4220 current_drive->aud_buf=NULL;
4221 current_drive->sbp_audsiz=arg; 4221 current_drive->sbp_audsiz=arg;
4222 4222
@@ -5910,7 +5910,8 @@ static void sbpcd_exit(void)
5910 put_disk(D_S[j].disk); 5910 put_disk(D_S[j].disk);
5911 devfs_remove("sbp/c0t%d", j); 5911 devfs_remove("sbp/c0t%d", j);
5912 vfree(D_S[j].sbp_buf); 5912 vfree(D_S[j].sbp_buf);
5913 if (D_S[j].sbp_audsiz>0) vfree(D_S[j].aud_buf); 5913 if (D_S[j].sbp_audsiz>0)
5914 vfree(D_S[j].aud_buf);
5914 if ((unregister_cdrom(D_S[j].sbpcd_infop) == -EINVAL)) 5915 if ((unregister_cdrom(D_S[j].sbpcd_infop) == -EINVAL))
5915 { 5916 {
5916 msg(DBG_INF, "What's that: can't unregister info %s.\n", major_name); 5917 msg(DBG_INF, "What's that: can't unregister info %s.\n", major_name);
diff --git a/drivers/cdrom/sonycd535.c b/drivers/cdrom/sonycd535.c
index 9f22e8f1f6c0..e65659926432 100644
--- a/drivers/cdrom/sonycd535.c
+++ b/drivers/cdrom/sonycd535.c
@@ -1478,8 +1478,7 @@ static int __init sony535_init(void)
1478 /* look for the CD-ROM, follows the procedure in the DOS driver */ 1478 /* look for the CD-ROM, follows the procedure in the DOS driver */
1479 inb(select_unit_reg); 1479 inb(select_unit_reg);
1480 /* wait for 40 18 Hz ticks (reverse-engineered from DOS driver) */ 1480 /* wait for 40 18 Hz ticks (reverse-engineered from DOS driver) */
1481 set_current_state(TASK_INTERRUPTIBLE); 1481 schedule_timeout_interruptible((HZ+17)*40/18);
1482 schedule_timeout((HZ+17)*40/18);
1483 inb(result_reg); 1482 inb(result_reg);
1484 1483
1485 outb(0, read_status_reg); /* does a reset? */ 1484 outb(0, read_status_reg); /* does a reset? */
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
index 4d4e602fdc7e..82b43c541c8d 100644
--- a/drivers/char/agp/backend.c
+++ b/drivers/char/agp/backend.c
@@ -206,10 +206,9 @@ static void agp_backend_cleanup(struct agp_bridge_data *bridge)
206 bridge->driver->cleanup(); 206 bridge->driver->cleanup();
207 if (bridge->driver->free_gatt_table) 207 if (bridge->driver->free_gatt_table)
208 bridge->driver->free_gatt_table(bridge); 208 bridge->driver->free_gatt_table(bridge);
209 if (bridge->key_list) { 209
210 vfree(bridge->key_list); 210 vfree(bridge->key_list);
211 bridge->key_list = NULL; 211 bridge->key_list = NULL;
212 }
213 212
214 if (bridge->driver->agp_destroy_page && 213 if (bridge->driver->agp_destroy_page &&
215 bridge->driver->needs_scratch_page) 214 bridge->driver->needs_scratch_page)
diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c
index 11f9ee581124..927a5bbe112c 100644
--- a/drivers/char/applicom.c
+++ b/drivers/char/applicom.c
@@ -172,7 +172,7 @@ static int ac_register_board(unsigned long physloc, void __iomem *loc,
172 172
173void cleanup_module(void) 173void cleanup_module(void)
174{ 174{
175 int i; 175 unsigned int i;
176 176
177 misc_deregister(&ac_miscdev); 177 misc_deregister(&ac_miscdev);
178 178
@@ -195,7 +195,7 @@ int __init applicom_init(void)
195 int i, numisa = 0; 195 int i, numisa = 0;
196 struct pci_dev *dev = NULL; 196 struct pci_dev *dev = NULL;
197 void __iomem *RamIO; 197 void __iomem *RamIO;
198 int boardno; 198 int boardno, ret;
199 199
200 printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n"); 200 printk(KERN_INFO "Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $\n");
201 201
@@ -294,7 +294,8 @@ int __init applicom_init(void)
294 } 294 }
295 295
296 if (!numisa) 296 if (!numisa)
297 printk(KERN_WARNING"ac.o: No valid ISA Applicom boards found at mem 0x%lx\n",mem); 297 printk(KERN_WARNING "ac.o: No valid ISA Applicom boards found "
298 "at mem 0x%lx\n", mem);
298 299
299 fin: 300 fin:
300 init_waitqueue_head(&FlagSleepRec); 301 init_waitqueue_head(&FlagSleepRec);
@@ -304,7 +305,11 @@ int __init applicom_init(void)
304 DeviceErrorCount = 0; 305 DeviceErrorCount = 0;
305 306
306 if (numboards) { 307 if (numboards) {
307 misc_register(&ac_miscdev); 308 ret = misc_register(&ac_miscdev);
309 if (ret) {
310 printk(KERN_WARNING "ac.o: Unable to register misc device\n");
311 goto out;
312 }
308 for (i = 0; i < MAX_BOARD; i++) { 313 for (i = 0; i < MAX_BOARD; i++) {
309 int serial; 314 int serial;
310 char boardname[(SERIAL_NUMBER - TYPE_CARD) + 1]; 315 char boardname[(SERIAL_NUMBER - TYPE_CARD) + 1];
@@ -337,6 +342,17 @@ int __init applicom_init(void)
337 342
338 else 343 else
339 return -ENXIO; 344 return -ENXIO;
345
346out:
347 for (i = 0; i < MAX_BOARD; i++) {
348 if (!apbs[i].RamIO)
349 continue;
350 if (apbs[i].irq)
351 free_irq(apbs[i].irq, &dummy);
352 iounmap(apbs[i].RamIO);
353 }
354 pci_disable_device(dev);
355 return ret;
340} 356}
341 357
342 358
diff --git a/drivers/char/ftape/lowlevel/fdc-io.c b/drivers/char/ftape/lowlevel/fdc-io.c
index 1704a2a57048..b2e0928e8428 100644
--- a/drivers/char/ftape/lowlevel/fdc-io.c
+++ b/drivers/char/ftape/lowlevel/fdc-io.c
@@ -387,10 +387,8 @@ int fdc_interrupt_wait(unsigned int time)
387 387
388 set_current_state(TASK_INTERRUPTIBLE); 388 set_current_state(TASK_INTERRUPTIBLE);
389 add_wait_queue(&ftape_wait_intr, &wait); 389 add_wait_queue(&ftape_wait_intr, &wait);
390 while (!ft_interrupt_seen && timeout) { 390 while (!ft_interrupt_seen && timeout)
391 set_current_state(TASK_INTERRUPTIBLE); 391 timeout = schedule_timeout_interruptible(timeout);
392 timeout = schedule_timeout(timeout);
393 }
394 392
395 spin_lock_irq(&current->sighand->siglock); 393 spin_lock_irq(&current->sighand->siglock);
396 current->blocked = old_sigmask; 394 current->blocked = old_sigmask;
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index 5fe8461271fc..de0379b6d502 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -100,14 +100,14 @@ static struct hpets *hpets;
100#endif 100#endif
101 101
102#ifndef readq 102#ifndef readq
103static unsigned long long __inline readq(void __iomem *addr) 103static inline unsigned long long readq(void __iomem *addr)
104{ 104{
105 return readl(addr) | (((unsigned long long)readl(addr + 4)) << 32LL); 105 return readl(addr) | (((unsigned long long)readl(addr + 4)) << 32LL);
106} 106}
107#endif 107#endif
108 108
109#ifndef writeq 109#ifndef writeq
110static void __inline writeq(unsigned long long v, void __iomem *addr) 110static inline void writeq(unsigned long long v, void __iomem *addr)
111{ 111{
112 writel(v & 0xffffffff, addr); 112 writel(v & 0xffffffff, addr);
113 writel(v >> 32, addr + 4); 113 writel(v >> 32, addr + 4);
diff --git a/drivers/char/hw_random.c b/drivers/char/hw_random.c
index 3480535a09c5..6f673d2de0b1 100644
--- a/drivers/char/hw_random.c
+++ b/drivers/char/hw_random.c
@@ -513,10 +513,7 @@ static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size,
513 return ret ? : -EAGAIN; 513 return ret ? : -EAGAIN;
514 514
515 if(need_resched()) 515 if(need_resched())
516 { 516 schedule_timeout_interruptible(1);
517 current->state = TASK_INTERRUPTIBLE;
518 schedule_timeout(1);
519 }
520 else 517 else
521 udelay(200); /* FIXME: We could poll for 250uS ?? */ 518 udelay(200); /* FIXME: We could poll for 250uS ?? */
522 519
diff --git a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c
index 82c5f30375ac..ba85eb1b6ec7 100644
--- a/drivers/char/ip2/i2lib.c
+++ b/drivers/char/ip2/i2lib.c
@@ -655,8 +655,7 @@ i2QueueCommands(int type, i2ChanStrPtr pCh, int timeout, int nCommands,
655 timeout--; // So negative values == forever 655 timeout--; // So negative values == forever
656 656
657 if (!in_interrupt()) { 657 if (!in_interrupt()) {
658 current->state = TASK_INTERRUPTIBLE; 658 schedule_timeout_interruptible(1); // short nap
659 schedule_timeout(1); // short nap
660 } else { 659 } else {
661 // we cannot sched/sleep in interrrupt silly 660 // we cannot sched/sleep in interrrupt silly
662 return 0; 661 return 0;
@@ -1132,8 +1131,7 @@ i2Output(i2ChanStrPtr pCh, const char *pSource, int count, int user )
1132 1131
1133 ip2trace (CHANN, ITRC_OUTPUT, 61, 0 ); 1132 ip2trace (CHANN, ITRC_OUTPUT, 61, 0 );
1134 1133
1135 current->state = TASK_INTERRUPTIBLE; 1134 schedule_timeout_interruptible(2);
1136 schedule_timeout(2);
1137 if (signal_pending(current)) { 1135 if (signal_pending(current)) {
1138 break; 1136 break;
1139 } 1137 }
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index 278f84104996..b6e5cbfb09f8 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -1920,8 +1920,7 @@ static int try_get_dev_id(struct smi_info *smi_info)
1920 for (;;) 1920 for (;;)
1921 { 1921 {
1922 if (smi_result == SI_SM_CALL_WITH_DELAY) { 1922 if (smi_result == SI_SM_CALL_WITH_DELAY) {
1923 set_current_state(TASK_UNINTERRUPTIBLE); 1923 schedule_timeout_uninterruptible(1);
1924 schedule_timeout(1);
1925 smi_result = smi_info->handlers->event( 1924 smi_result = smi_info->handlers->event(
1926 smi_info->si_sm, 100); 1925 smi_info->si_sm, 100);
1927 } 1926 }
@@ -2256,10 +2255,8 @@ static int init_one_smi(int intf_num, struct smi_info **smi)
2256 2255
2257 /* Wait for the timer to stop. This avoids problems with race 2256 /* Wait for the timer to stop. This avoids problems with race
2258 conditions removing the timer here. */ 2257 conditions removing the timer here. */
2259 while (! new_smi->timer_stopped) { 2258 while (!new_smi->timer_stopped)
2260 set_current_state(TASK_UNINTERRUPTIBLE); 2259 schedule_timeout_uninterruptible(1);
2261 schedule_timeout(1);
2262 }
2263 2260
2264 out_err: 2261 out_err:
2265 if (new_smi->intf) 2262 if (new_smi->intf)
@@ -2379,17 +2376,14 @@ static void __exit cleanup_one_si(struct smi_info *to_clean)
2379 2376
2380 /* Wait for the timer to stop. This avoids problems with race 2377 /* Wait for the timer to stop. This avoids problems with race
2381 conditions removing the timer here. */ 2378 conditions removing the timer here. */
2382 while (! to_clean->timer_stopped) { 2379 while (!to_clean->timer_stopped)
2383 set_current_state(TASK_UNINTERRUPTIBLE); 2380 schedule_timeout_uninterruptible(1);
2384 schedule_timeout(1);
2385 }
2386 2381
2387 /* Interrupts and timeouts are stopped, now make sure the 2382 /* Interrupts and timeouts are stopped, now make sure the
2388 interface is in a clean state. */ 2383 interface is in a clean state. */
2389 while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { 2384 while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) {
2390 poll(to_clean); 2385 poll(to_clean);
2391 set_current_state(TASK_UNINTERRUPTIBLE); 2386 schedule_timeout_uninterruptible(1);
2392 schedule_timeout(1);
2393 } 2387 }
2394 2388
2395 rv = ipmi_unregister_smi(to_clean->intf); 2389 rv = ipmi_unregister_smi(to_clean->intf);
diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
index e71aaae855ad..2da64bf7469c 100644
--- a/drivers/char/ipmi/ipmi_watchdog.c
+++ b/drivers/char/ipmi/ipmi_watchdog.c
@@ -1037,10 +1037,8 @@ static __exit void ipmi_unregister_watchdog(void)
1037 /* Wait to make sure the message makes it out. The lower layer has 1037 /* Wait to make sure the message makes it out. The lower layer has
1038 pointers to our buffers, we want to make sure they are done before 1038 pointers to our buffers, we want to make sure they are done before
1039 we release our memory. */ 1039 we release our memory. */
1040 while (atomic_read(&set_timeout_tofree)) { 1040 while (atomic_read(&set_timeout_tofree))
1041 set_current_state(TASK_UNINTERRUPTIBLE); 1041 schedule_timeout_uninterruptible(1);
1042 schedule_timeout(1);
1043 }
1044 1042
1045 /* Disconnect from IPMI. */ 1043 /* Disconnect from IPMI. */
1046 rv = ipmi_destroy_user(watchdog_user); 1044 rv = ipmi_destroy_user(watchdog_user);
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index 1745065d8f78..449d029ad4f4 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -14,7 +14,7 @@
14 * `Sticky' modifier keys, 951006. 14 * `Sticky' modifier keys, 951006.
15 * 15 *
16 * 11-11-96: SAK should now work in the raw mode (Martin Mares) 16 * 11-11-96: SAK should now work in the raw mode (Martin Mares)
17 * 17 *
18 * Modified to provide 'generic' keyboard support by Hamish Macdonald 18 * Modified to provide 'generic' keyboard support by Hamish Macdonald
19 * Merge with the m68k keyboard driver and split-off of the PC low-level 19 * Merge with the m68k keyboard driver and split-off of the PC low-level
20 * parts by Geert Uytterhoeven, May 1997 20 * parts by Geert Uytterhoeven, May 1997
@@ -52,7 +52,7 @@ extern void ctrl_alt_del(void);
52/* 52/*
53 * Some laptops take the 789uiojklm,. keys as number pad when NumLock is on. 53 * Some laptops take the 789uiojklm,. keys as number pad when NumLock is on.
54 * This seems a good reason to start with NumLock off. On HIL keyboards 54 * This seems a good reason to start with NumLock off. On HIL keyboards
55 * of PARISC machines however there is no NumLock key and everyone expects the keypad 55 * of PARISC machines however there is no NumLock key and everyone expects the keypad
56 * to be used for numbers. 56 * to be used for numbers.
57 */ 57 */
58 58
@@ -76,17 +76,17 @@ void compute_shiftstate(void);
76 k_meta, k_ascii, k_lock, k_lowercase,\ 76 k_meta, k_ascii, k_lock, k_lowercase,\
77 k_slock, k_dead2, k_ignore, k_ignore 77 k_slock, k_dead2, k_ignore, k_ignore
78 78
79typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value, 79typedef void (k_handler_fn)(struct vc_data *vc, unsigned char value,
80 char up_flag, struct pt_regs *regs); 80 char up_flag, struct pt_regs *regs);
81static k_handler_fn K_HANDLERS; 81static k_handler_fn K_HANDLERS;
82static k_handler_fn *k_handler[16] = { K_HANDLERS }; 82static k_handler_fn *k_handler[16] = { K_HANDLERS };
83 83
84#define FN_HANDLERS\ 84#define FN_HANDLERS\
85 fn_null, fn_enter, fn_show_ptregs, fn_show_mem,\ 85 fn_null, fn_enter, fn_show_ptregs, fn_show_mem,\
86 fn_show_state, fn_send_intr, fn_lastcons, fn_caps_toggle,\ 86 fn_show_state, fn_send_intr, fn_lastcons, fn_caps_toggle,\
87 fn_num, fn_hold, fn_scroll_forw, fn_scroll_back,\ 87 fn_num, fn_hold, fn_scroll_forw, fn_scroll_back,\
88 fn_boot_it, fn_caps_on, fn_compose, fn_SAK,\ 88 fn_boot_it, fn_caps_on, fn_compose, fn_SAK,\
89 fn_dec_console, fn_inc_console, fn_spawn_con, fn_bare_num 89 fn_dec_console, fn_inc_console, fn_spawn_con, fn_bare_num
90 90
91typedef void (fn_handler_fn)(struct vc_data *vc, struct pt_regs *regs); 91typedef void (fn_handler_fn)(struct vc_data *vc, struct pt_regs *regs);
92static fn_handler_fn FN_HANDLERS; 92static fn_handler_fn FN_HANDLERS;
@@ -159,13 +159,13 @@ static int sysrq_alt;
159 */ 159 */
160int getkeycode(unsigned int scancode) 160int getkeycode(unsigned int scancode)
161{ 161{
162 struct list_head * node; 162 struct list_head *node;
163 struct input_dev *dev = NULL; 163 struct input_dev *dev = NULL;
164 164
165 list_for_each(node,&kbd_handler.h_list) { 165 list_for_each(node, &kbd_handler.h_list) {
166 struct input_handle * handle = to_handle_h(node); 166 struct input_handle *handle = to_handle_h(node);
167 if (handle->dev->keycodesize) { 167 if (handle->dev->keycodesize) {
168 dev = handle->dev; 168 dev = handle->dev;
169 break; 169 break;
170 } 170 }
171 } 171 }
@@ -181,15 +181,15 @@ int getkeycode(unsigned int scancode)
181 181
182int setkeycode(unsigned int scancode, unsigned int keycode) 182int setkeycode(unsigned int scancode, unsigned int keycode)
183{ 183{
184 struct list_head * node; 184 struct list_head *node;
185 struct input_dev *dev = NULL; 185 struct input_dev *dev = NULL;
186 unsigned int i, oldkey; 186 unsigned int i, oldkey;
187 187
188 list_for_each(node,&kbd_handler.h_list) { 188 list_for_each(node, &kbd_handler.h_list) {
189 struct input_handle *handle = to_handle_h(node); 189 struct input_handle *handle = to_handle_h(node);
190 if (handle->dev->keycodesize) { 190 if (handle->dev->keycodesize) {
191 dev = handle->dev; 191 dev = handle->dev;
192 break; 192 break;
193 } 193 }
194 } 194 }
195 195
@@ -200,7 +200,7 @@ int setkeycode(unsigned int scancode, unsigned int keycode)
200 return -EINVAL; 200 return -EINVAL;
201 if (keycode < 0 || keycode > KEY_MAX) 201 if (keycode < 0 || keycode > KEY_MAX)
202 return -EINVAL; 202 return -EINVAL;
203 if (keycode >> (dev->keycodesize * 8)) 203 if (dev->keycodesize < sizeof(keycode) && (keycode >> (dev->keycodesize * 8)))
204 return -EINVAL; 204 return -EINVAL;
205 205
206 oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode); 206 oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
@@ -216,11 +216,11 @@ int setkeycode(unsigned int scancode, unsigned int keycode)
216} 216}
217 217
218/* 218/*
219 * Making beeps and bells. 219 * Making beeps and bells.
220 */ 220 */
221static void kd_nosound(unsigned long ignored) 221static void kd_nosound(unsigned long ignored)
222{ 222{
223 struct list_head * node; 223 struct list_head *node;
224 224
225 list_for_each(node,&kbd_handler.h_list) { 225 list_for_each(node,&kbd_handler.h_list) {
226 struct input_handle *handle = to_handle_h(node); 226 struct input_handle *handle = to_handle_h(node);
@@ -237,12 +237,12 @@ static DEFINE_TIMER(kd_mksound_timer, kd_nosound, 0, 0);
237 237
238void kd_mksound(unsigned int hz, unsigned int ticks) 238void kd_mksound(unsigned int hz, unsigned int ticks)
239{ 239{
240 struct list_head * node; 240 struct list_head *node;
241 241
242 del_timer(&kd_mksound_timer); 242 del_timer(&kd_mksound_timer);
243 243
244 if (hz) { 244 if (hz) {
245 list_for_each_prev(node,&kbd_handler.h_list) { 245 list_for_each_prev(node, &kbd_handler.h_list) {
246 struct input_handle *handle = to_handle_h(node); 246 struct input_handle *handle = to_handle_h(node);
247 if (test_bit(EV_SND, handle->dev->evbit)) { 247 if (test_bit(EV_SND, handle->dev->evbit)) {
248 if (test_bit(SND_TONE, handle->dev->sndbit)) { 248 if (test_bit(SND_TONE, handle->dev->sndbit)) {
@@ -337,19 +337,19 @@ static void to_utf8(struct vc_data *vc, ushort c)
337 if (c < 0x80) 337 if (c < 0x80)
338 /* 0******* */ 338 /* 0******* */
339 put_queue(vc, c); 339 put_queue(vc, c);
340 else if (c < 0x800) { 340 else if (c < 0x800) {
341 /* 110***** 10****** */ 341 /* 110***** 10****** */
342 put_queue(vc, 0xc0 | (c >> 6)); 342 put_queue(vc, 0xc0 | (c >> 6));
343 put_queue(vc, 0x80 | (c & 0x3f)); 343 put_queue(vc, 0x80 | (c & 0x3f));
344 } else { 344 } else {
345 /* 1110**** 10****** 10****** */ 345 /* 1110**** 10****** 10****** */
346 put_queue(vc, 0xe0 | (c >> 12)); 346 put_queue(vc, 0xe0 | (c >> 12));
347 put_queue(vc, 0x80 | ((c >> 6) & 0x3f)); 347 put_queue(vc, 0x80 | ((c >> 6) & 0x3f));
348 put_queue(vc, 0x80 | (c & 0x3f)); 348 put_queue(vc, 0x80 | (c & 0x3f));
349 } 349 }
350} 350}
351 351
352/* 352/*
353 * Called after returning from RAW mode or when changing consoles - recompute 353 * Called after returning from RAW mode or when changing consoles - recompute
354 * shift_down[] and shift_state from key_down[] maybe called when keymap is 354 * shift_down[] and shift_state from key_down[] maybe called when keymap is
355 * undefined, so that shiftkey release is seen 355 * undefined, so that shiftkey release is seen
@@ -360,7 +360,7 @@ void compute_shiftstate(void)
360 360
361 shift_state = 0; 361 shift_state = 0;
362 memset(shift_down, 0, sizeof(shift_down)); 362 memset(shift_down, 0, sizeof(shift_down));
363 363
364 for (i = 0; i < ARRAY_SIZE(key_down); i++) { 364 for (i = 0; i < ARRAY_SIZE(key_down); i++) {
365 365
366 if (!key_down[i]) 366 if (!key_down[i])
@@ -499,9 +499,9 @@ static void fn_dec_console(struct vc_data *vc, struct pt_regs *regs)
499 if (want_console != -1) 499 if (want_console != -1)
500 cur = want_console; 500 cur = want_console;
501 501
502 for (i = cur-1; i != cur; i--) { 502 for (i = cur - 1; i != cur; i--) {
503 if (i == -1) 503 if (i == -1)
504 i = MAX_NR_CONSOLES-1; 504 i = MAX_NR_CONSOLES - 1;
505 if (vc_cons_allocated(i)) 505 if (vc_cons_allocated(i))
506 break; 506 break;
507 } 507 }
@@ -567,9 +567,9 @@ static void fn_compose(struct vc_data *vc, struct pt_regs *regs)
567 567
568static void fn_spawn_con(struct vc_data *vc, struct pt_regs *regs) 568static void fn_spawn_con(struct vc_data *vc, struct pt_regs *regs)
569{ 569{
570 if (spawnpid) 570 if (spawnpid)
571 if(kill_proc(spawnpid, spawnsig, 1)) 571 if (kill_proc(spawnpid, spawnsig, 1))
572 spawnpid = 0; 572 spawnpid = 0;
573} 573}
574 574
575static void fn_SAK(struct vc_data *vc, struct pt_regs *regs) 575static void fn_SAK(struct vc_data *vc, struct pt_regs *regs)
@@ -603,8 +603,8 @@ static void k_spec(struct vc_data *vc, unsigned char value, char up_flag, struct
603 return; 603 return;
604 if (value >= ARRAY_SIZE(fn_handler)) 604 if (value >= ARRAY_SIZE(fn_handler))
605 return; 605 return;
606 if ((kbd->kbdmode == VC_RAW || 606 if ((kbd->kbdmode == VC_RAW ||
607 kbd->kbdmode == VC_MEDIUMRAW) && 607 kbd->kbdmode == VC_MEDIUMRAW) &&
608 value != KVAL(K_SAK)) 608 value != KVAL(K_SAK))
609 return; /* SAK is allowed even in raw mode */ 609 return; /* SAK is allowed even in raw mode */
610 fn_handler[value](vc, regs); 610 fn_handler[value](vc, regs);
@@ -894,11 +894,11 @@ static inline unsigned char getleds(void)
894 894
895static void kbd_bh(unsigned long dummy) 895static void kbd_bh(unsigned long dummy)
896{ 896{
897 struct list_head * node; 897 struct list_head *node;
898 unsigned char leds = getleds(); 898 unsigned char leds = getleds();
899 899
900 if (leds != ledstate) { 900 if (leds != ledstate) {
901 list_for_each(node,&kbd_handler.h_list) { 901 list_for_each(node, &kbd_handler.h_list) {
902 struct input_handle * handle = to_handle_h(node); 902 struct input_handle * handle = to_handle_h(node);
903 input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01)); 903 input_event(handle->dev, EV_LED, LED_SCROLLL, !!(leds & 0x01));
904 input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02)); 904 input_event(handle->dev, EV_LED, LED_NUML, !!(leds & 0x02));
@@ -963,11 +963,11 @@ static int sparc_l1_a_state = 0;
963extern void sun_do_break(void); 963extern void sun_do_break(void);
964#endif 964#endif
965 965
966static int emulate_raw(struct vc_data *vc, unsigned int keycode, 966static int emulate_raw(struct vc_data *vc, unsigned int keycode,
967 unsigned char up_flag) 967 unsigned char up_flag)
968{ 968{
969 if (keycode > 255 || !x86_keycodes[keycode]) 969 if (keycode > 255 || !x86_keycodes[keycode])
970 return -1; 970 return -1;
971 971
972 switch (keycode) { 972 switch (keycode) {
973 case KEY_PAUSE: 973 case KEY_PAUSE:
@@ -981,7 +981,7 @@ static int emulate_raw(struct vc_data *vc, unsigned int keycode,
981 case KEY_HANJA: 981 case KEY_HANJA:
982 if (!up_flag) put_queue(vc, 0xf2); 982 if (!up_flag) put_queue(vc, 0xf2);
983 return 0; 983 return 0;
984 } 984 }
985 985
986 if (keycode == KEY_SYSRQ && sysrq_alt) { 986 if (keycode == KEY_SYSRQ && sysrq_alt) {
987 put_queue(vc, 0x54 | up_flag); 987 put_queue(vc, 0x54 | up_flag);
@@ -1104,11 +1104,12 @@ static void kbd_keycode(unsigned int keycode, int down,
1104 else 1104 else
1105 clear_bit(keycode, key_down); 1105 clear_bit(keycode, key_down);
1106 1106
1107 if (rep && (!vc_kbd_mode(kbd, VC_REPEAT) || (tty && 1107 if (rep &&
1108 (!L_ECHO(tty) && tty->driver->chars_in_buffer(tty))))) { 1108 (!vc_kbd_mode(kbd, VC_REPEAT) ||
1109 (tty && !L_ECHO(tty) && tty->driver->chars_in_buffer(tty)))) {
1109 /* 1110 /*
1110 * Don't repeat a key if the input buffers are not empty and the 1111 * Don't repeat a key if the input buffers are not empty and the
1111 * characters get aren't echoed locally. This makes key repeat 1112 * characters get aren't echoed locally. This makes key repeat
1112 * usable with slow applications and under heavy loads. 1113 * usable with slow applications and under heavy loads.
1113 */ 1114 */
1114 return; 1115 return;
@@ -1130,7 +1131,8 @@ static void kbd_keycode(unsigned int keycode, int down,
1130 type = KTYP(keysym); 1131 type = KTYP(keysym);
1131 1132
1132 if (type < 0xf0) { 1133 if (type < 0xf0) {
1133 if (down && !raw_mode) to_utf8(vc, keysym); 1134 if (down && !raw_mode)
1135 to_utf8(vc, keysym);
1134 return; 1136 return;
1135 } 1137 }
1136 1138
@@ -1154,7 +1156,7 @@ static void kbd_keycode(unsigned int keycode, int down,
1154 kbd->slockstate = 0; 1156 kbd->slockstate = 0;
1155} 1157}
1156 1158
1157static void kbd_event(struct input_handle *handle, unsigned int event_type, 1159static void kbd_event(struct input_handle *handle, unsigned int event_type,
1158 unsigned int event_code, int value) 1160 unsigned int event_code, int value)
1159{ 1161{
1160 if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev)) 1162 if (event_type == EV_MSC && event_code == MSC_RAW && HW_RAW(handle->dev))
@@ -1166,15 +1168,13 @@ static void kbd_event(struct input_handle *handle, unsigned int event_type,
1166 schedule_console_callback(); 1168 schedule_console_callback();
1167} 1169}
1168 1170
1169static char kbd_name[] = "kbd";
1170
1171/* 1171/*
1172 * When a keyboard (or other input device) is found, the kbd_connect 1172 * When a keyboard (or other input device) is found, the kbd_connect
1173 * function is called. The function then looks at the device, and if it 1173 * function is called. The function then looks at the device, and if it
1174 * likes it, it can open it and get events from it. In this (kbd_connect) 1174 * likes it, it can open it and get events from it. In this (kbd_connect)
1175 * function, we should decide which VT to bind that keyboard to initially. 1175 * function, we should decide which VT to bind that keyboard to initially.
1176 */ 1176 */
1177static struct input_handle *kbd_connect(struct input_handler *handler, 1177static struct input_handle *kbd_connect(struct input_handler *handler,
1178 struct input_dev *dev, 1178 struct input_dev *dev,
1179 struct input_device_id *id) 1179 struct input_device_id *id)
1180{ 1180{
@@ -1182,18 +1182,19 @@ static struct input_handle *kbd_connect(struct input_handler *handler,
1182 int i; 1182 int i;
1183 1183
1184 for (i = KEY_RESERVED; i < BTN_MISC; i++) 1184 for (i = KEY_RESERVED; i < BTN_MISC; i++)
1185 if (test_bit(i, dev->keybit)) break; 1185 if (test_bit(i, dev->keybit))
1186 break;
1186 1187
1187 if ((i == BTN_MISC) && !test_bit(EV_SND, dev->evbit)) 1188 if (i == BTN_MISC && !test_bit(EV_SND, dev->evbit))
1188 return NULL; 1189 return NULL;
1189 1190
1190 if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL))) 1191 if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
1191 return NULL; 1192 return NULL;
1192 memset(handle, 0, sizeof(struct input_handle)); 1193 memset(handle, 0, sizeof(struct input_handle));
1193 1194
1194 handle->dev = dev; 1195 handle->dev = dev;
1195 handle->handler = handler; 1196 handle->handler = handler;
1196 handle->name = kbd_name; 1197 handle->name = "kbd";
1197 1198
1198 input_open_device(handle); 1199 input_open_device(handle);
1199 kbd_refresh_leds(handle); 1200 kbd_refresh_leds(handle);
@@ -1212,11 +1213,11 @@ static struct input_device_id kbd_ids[] = {
1212 .flags = INPUT_DEVICE_ID_MATCH_EVBIT, 1213 .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
1213 .evbit = { BIT(EV_KEY) }, 1214 .evbit = { BIT(EV_KEY) },
1214 }, 1215 },
1215 1216
1216 { 1217 {
1217 .flags = INPUT_DEVICE_ID_MATCH_EVBIT, 1218 .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
1218 .evbit = { BIT(EV_SND) }, 1219 .evbit = { BIT(EV_SND) },
1219 }, 1220 },
1220 1221
1221 { }, /* Terminating entry */ 1222 { }, /* Terminating entry */
1222}; 1223};
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c
index cf01a720eb2e..b77161146144 100644
--- a/drivers/char/lcd.c
+++ b/drivers/char/lcd.c
@@ -613,10 +613,15 @@ static struct miscdevice lcd_dev = {
613 613
614static int lcd_init(void) 614static int lcd_init(void)
615{ 615{
616 int ret;
616 unsigned long data; 617 unsigned long data;
617 618
618 pr_info("%s\n", LCD_DRIVER); 619 pr_info("%s\n", LCD_DRIVER);
619 misc_register(&lcd_dev); 620 ret = misc_register(&lcd_dev);
621 if (ret) {
622 printk(KERN_WARNING LCD "Unable to register misc device.\n");
623 return ret;
624 }
620 625
621 /* Check region? Naaah! Just snarf it up. */ 626 /* Check region? Naaah! Just snarf it up. */
622/* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/ 627/* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/
diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 59eebe5a035f..2afb9038dbc5 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -128,6 +128,7 @@
128#include <linux/console.h> 128#include <linux/console.h>
129#include <linux/device.h> 129#include <linux/device.h>
130#include <linux/wait.h> 130#include <linux/wait.h>
131#include <linux/jiffies.h>
131 132
132#include <linux/parport.h> 133#include <linux/parport.h>
133#undef LP_STATS 134#undef LP_STATS
@@ -307,7 +308,7 @@ static ssize_t lp_write(struct file * file, const char __user * buf,
307 (LP_F(minor) & LP_ABORT)); 308 (LP_F(minor) & LP_ABORT));
308 309
309#ifdef LP_STATS 310#ifdef LP_STATS
310 if (jiffies-lp_table[minor].lastcall > LP_TIME(minor)) 311 if (time_after(jiffies, lp_table[minor].lastcall + LP_TIME(minor)))
311 lp_table[minor].runchars = 0; 312 lp_table[minor].runchars = 0;
312 313
313 lp_table[minor].lastcall = jiffies; 314 lp_table[minor].lastcall = jiffies;
diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
index d0ef1ae41298..45d012d85e8c 100644
--- a/drivers/char/mxser.c
+++ b/drivers/char/mxser.c
@@ -1058,8 +1058,7 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
1058 */ 1058 */
1059 timeout = jiffies + HZ; 1059 timeout = jiffies + HZ;
1060 while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) { 1060 while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) {
1061 set_current_state(TASK_INTERRUPTIBLE); 1061 schedule_timeout_interruptible(5);
1062 schedule_timeout(5);
1063 if (time_after(jiffies, timeout)) 1062 if (time_after(jiffies, timeout))
1064 break; 1063 break;
1065 } 1064 }
@@ -1080,10 +1079,8 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
1080 info->event = 0; 1079 info->event = 0;
1081 info->tty = NULL; 1080 info->tty = NULL;
1082 if (info->blocked_open) { 1081 if (info->blocked_open) {
1083 if (info->close_delay) { 1082 if (info->close_delay)
1084 set_current_state(TASK_INTERRUPTIBLE); 1083 schedule_timeout_interruptible(info->close_delay);
1085 schedule_timeout(info->close_delay);
1086 }
1087 wake_up_interruptible(&info->open_wait); 1084 wake_up_interruptible(&info->open_wait);
1088 } 1085 }
1089 1086
@@ -1801,8 +1798,7 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
1801#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT 1798#ifdef SERIAL_DEBUG_RS_WAIT_UNTIL_SENT
1802 printk("lsr = %d (jiff=%lu)...", lsr, jiffies); 1799 printk("lsr = %d (jiff=%lu)...", lsr, jiffies);
1803#endif 1800#endif
1804 set_current_state(TASK_INTERRUPTIBLE); 1801 schedule_timeout_interruptible(char_time);
1805 schedule_timeout(char_time);
1806 if (signal_pending(current)) 1802 if (signal_pending(current))
1807 break; 1803 break;
1808 if (timeout && time_after(jiffies, orig_jiffies + timeout)) 1804 if (timeout && time_after(jiffies, orig_jiffies + timeout))
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index 09103b3d8f05..c9bdf544ed2c 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -62,7 +62,7 @@
62 62
63static inline unsigned char *alloc_buf(void) 63static inline unsigned char *alloc_buf(void)
64{ 64{
65 int prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; 65 unsigned int prio = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
66 66
67 if (PAGE_SIZE != N_TTY_BUF_SIZE) 67 if (PAGE_SIZE != N_TTY_BUF_SIZE)
68 return kmalloc(N_TTY_BUF_SIZE, prio); 68 return kmalloc(N_TTY_BUF_SIZE, prio);
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 7a0c74648124..02d7f046c10a 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * linux/drivers/char/pcmcia/synclink_cs.c 2 * linux/drivers/char/pcmcia/synclink_cs.c
3 * 3 *
4 * $Id: synclink_cs.c,v 4.26 2004/08/11 19:30:02 paulkf Exp $ 4 * $Id: synclink_cs.c,v 4.34 2005/09/08 13:20:54 paulkf Exp $
5 * 5 *
6 * Device driver for Microgate SyncLink PC Card 6 * Device driver for Microgate SyncLink PC Card
7 * multiprotocol serial adapter. 7 * multiprotocol serial adapter.
@@ -472,7 +472,7 @@ module_param_array(dosyncppp, int, NULL, 0);
472MODULE_LICENSE("GPL"); 472MODULE_LICENSE("GPL");
473 473
474static char *driver_name = "SyncLink PC Card driver"; 474static char *driver_name = "SyncLink PC Card driver";
475static char *driver_version = "$Revision: 4.26 $"; 475static char *driver_version = "$Revision: 4.34 $";
476 476
477static struct tty_driver *serial_driver; 477static struct tty_driver *serial_driver;
478 478
@@ -1457,6 +1457,8 @@ static int startup(MGSLPC_INFO * info)
1457 1457
1458 info->pending_bh = 0; 1458 info->pending_bh = 0;
1459 1459
1460 memset(&info->icount, 0, sizeof(info->icount));
1461
1460 init_timer(&info->tx_timer); 1462 init_timer(&info->tx_timer);
1461 info->tx_timer.data = (unsigned long)info; 1463 info->tx_timer.data = (unsigned long)info;
1462 info->tx_timer.function = tx_timeout; 1464 info->tx_timer.function = tx_timeout;
@@ -1946,9 +1948,13 @@ static int get_stats(MGSLPC_INFO * info, struct mgsl_icount __user *user_icount)
1946 int err; 1948 int err;
1947 if (debug_level >= DEBUG_LEVEL_INFO) 1949 if (debug_level >= DEBUG_LEVEL_INFO)
1948 printk("get_params(%s)\n", info->device_name); 1950 printk("get_params(%s)\n", info->device_name);
1949 COPY_TO_USER(err,user_icount, &info->icount, sizeof(struct mgsl_icount)); 1951 if (!user_icount) {
1950 if (err) 1952 memset(&info->icount, 0, sizeof(info->icount));
1951 return -EFAULT; 1953 } else {
1954 COPY_TO_USER(err, user_icount, &info->icount, sizeof(struct mgsl_icount));
1955 if (err)
1956 return -EFAULT;
1957 }
1952 return 0; 1958 return 0;
1953} 1959}
1954 1960
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index f174aee659e5..9e9cf1407311 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -560,7 +560,7 @@ ide_startstop_t __ide_abort(ide_drive_t *drive, struct request *rq)
560EXPORT_SYMBOL_GPL(__ide_abort); 560EXPORT_SYMBOL_GPL(__ide_abort);
561 561
562/** 562/**
563 * ide_abort - abort pending IDE operatins 563 * ide_abort - abort pending IDE operations
564 * @drive: drive the error occurred on 564 * @drive: drive the error occurred on
565 * @msg: message to report 565 * @msg: message to report
566 * 566 *
@@ -623,7 +623,7 @@ static void ide_cmd (ide_drive_t *drive, u8 cmd, u8 nsect,
623 * @drive: drive the completion interrupt occurred on 623 * @drive: drive the completion interrupt occurred on
624 * 624 *
625 * drive_cmd_intr() is invoked on completion of a special DRIVE_CMD. 625 * drive_cmd_intr() is invoked on completion of a special DRIVE_CMD.
626 * We do any necessary daya reading and then wait for the drive to 626 * We do any necessary data reading and then wait for the drive to
627 * go non busy. At that point we may read the error data and complete 627 * go non busy. At that point we may read the error data and complete
628 * the request 628 * the request
629 */ 629 */
@@ -773,7 +773,7 @@ EXPORT_SYMBOL_GPL(ide_init_sg_cmd);
773 773
774/** 774/**
775 * execute_drive_command - issue special drive command 775 * execute_drive_command - issue special drive command
776 * @drive: the drive to issue th command on 776 * @drive: the drive to issue the command on
777 * @rq: the request structure holding the command 777 * @rq: the request structure holding the command
778 * 778 *
779 * execute_drive_cmd() issues a special drive command, usually 779 * execute_drive_cmd() issues a special drive command, usually
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index 5a3dc46008e6..ee38e6b143a4 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -2903,8 +2903,7 @@ static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
2903 } else if (!(tape->sense_key == 2 && tape->asc == 4 && 2903 } else if (!(tape->sense_key == 2 && tape->asc == 4 &&
2904 (tape->ascq == 1 || tape->ascq == 8))) 2904 (tape->ascq == 1 || tape->ascq == 8)))
2905 return -EIO; 2905 return -EIO;
2906 current->state = TASK_INTERRUPTIBLE; 2906 msleep(100);
2907 schedule_timeout(HZ / 10);
2908 } 2907 }
2909 return -EIO; 2908 return -EIO;
2910} 2909}
diff --git a/drivers/ide/ide-timing.h b/drivers/ide/ide-timing.h
index c1196ce15b4d..2fcfac6e967a 100644
--- a/drivers/ide/ide-timing.h
+++ b/drivers/ide/ide-timing.h
@@ -27,6 +27,7 @@
27 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic 27 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
28 */ 28 */
29 29
30#include <linux/kernel.h>
30#include <linux/hdreg.h> 31#include <linux/hdreg.h>
31 32
32#define XFER_PIO_5 0x0d 33#define XFER_PIO_5 0x0d
@@ -96,11 +97,9 @@ static struct ide_timing ide_timing[] = {
96#define IDE_TIMING_UDMA 0x80 97#define IDE_TIMING_UDMA 0x80
97#define IDE_TIMING_ALL 0xff 98#define IDE_TIMING_ALL 0xff
98 99
99#define MIN(a,b) ((a)<(b)?(a):(b)) 100#define FIT(v,vmin,vmax) max_t(short,min_t(short,v,vmax),vmin)
100#define MAX(a,b) ((a)>(b)?(a):(b)) 101#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
101#define FIT(v,min,max) MAX(MIN(v,max),min) 102#define EZ(v,unit) ((v)?ENOUGH(v,unit):0)
102#define ENOUGH(v,unit) (((v)-1)/(unit)+1)
103#define EZ(v,unit) ((v)?ENOUGH(v,unit):0)
104 103
105#define XFER_MODE 0xf0 104#define XFER_MODE 0xf0
106#define XFER_UDMA_133 0x48 105#define XFER_UDMA_133 0x48
@@ -188,14 +187,14 @@ static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int
188 187
189static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, struct ide_timing *m, unsigned int what) 188static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, struct ide_timing *m, unsigned int what)
190{ 189{
191 if (what & IDE_TIMING_SETUP ) m->setup = MAX(a->setup, b->setup); 190 if (what & IDE_TIMING_SETUP ) m->setup = max(a->setup, b->setup);
192 if (what & IDE_TIMING_ACT8B ) m->act8b = MAX(a->act8b, b->act8b); 191 if (what & IDE_TIMING_ACT8B ) m->act8b = max(a->act8b, b->act8b);
193 if (what & IDE_TIMING_REC8B ) m->rec8b = MAX(a->rec8b, b->rec8b); 192 if (what & IDE_TIMING_REC8B ) m->rec8b = max(a->rec8b, b->rec8b);
194 if (what & IDE_TIMING_CYC8B ) m->cyc8b = MAX(a->cyc8b, b->cyc8b); 193 if (what & IDE_TIMING_CYC8B ) m->cyc8b = max(a->cyc8b, b->cyc8b);
195 if (what & IDE_TIMING_ACTIVE ) m->active = MAX(a->active, b->active); 194 if (what & IDE_TIMING_ACTIVE ) m->active = max(a->active, b->active);
196 if (what & IDE_TIMING_RECOVER) m->recover = MAX(a->recover, b->recover); 195 if (what & IDE_TIMING_RECOVER) m->recover = max(a->recover, b->recover);
197 if (what & IDE_TIMING_CYCLE ) m->cycle = MAX(a->cycle, b->cycle); 196 if (what & IDE_TIMING_CYCLE ) m->cycle = max(a->cycle, b->cycle);
198 if (what & IDE_TIMING_UDMA ) m->udma = MAX(a->udma, b->udma); 197 if (what & IDE_TIMING_UDMA ) m->udma = max(a->udma, b->udma);
199} 198}
200 199
201static struct ide_timing* ide_timing_find_mode(short speed) 200static struct ide_timing* ide_timing_find_mode(short speed)
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index dc0841b2721c..0ccf85fcee34 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -43,6 +43,7 @@
43#include <linux/ide.h> 43#include <linux/ide.h>
44#include <linux/hdreg.h> 44#include <linux/hdreg.h>
45#include <linux/major.h> 45#include <linux/major.h>
46#include <linux/delay.h>
46#include <asm/io.h> 47#include <asm/io.h>
47#include <asm/system.h> 48#include <asm/system.h>
48 49
@@ -340,8 +341,7 @@ static void ide_config(dev_link_t *link)
340 break; 341 break;
341 } 342 }
342 } 343 }
343 __set_current_state(TASK_UNINTERRUPTIBLE); 344 msleep(100);
344 schedule_timeout(HZ/10);
345 } 345 }
346 346
347 if (hd < 0) { 347 if (hd < 0) {
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
index 60b696e9336b..3738d173f9a6 100644
--- a/drivers/input/evdev.c
+++ b/drivers/input/evdev.c
@@ -322,7 +322,7 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
322 if (t < 0 || t >= dev->keycodemax || !dev->keycodesize) return -EINVAL; 322 if (t < 0 || t >= dev->keycodemax || !dev->keycodesize) return -EINVAL;
323 if (get_user(v, ip + 1)) return -EFAULT; 323 if (get_user(v, ip + 1)) return -EFAULT;
324 if (v < 0 || v > KEY_MAX) return -EINVAL; 324 if (v < 0 || v > KEY_MAX) return -EINVAL;
325 if (v >> (dev->keycodesize * 8)) return -EINVAL; 325 if (dev->keycodesize < sizeof(v) && (v >> (dev->keycodesize * 8))) return -EINVAL;
326 u = SET_INPUT_KEYCODE(dev, t, v); 326 u = SET_INPUT_KEYCODE(dev, t, v);
327 clear_bit(u, dev->keybit); 327 clear_bit(u, dev->keybit);
328 set_bit(v, dev->keybit); 328 set_bit(v, dev->keybit);
diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c
index 58728ebaaf80..e5a31e55d3e2 100644
--- a/drivers/input/joystick/iforce/iforce-packets.c
+++ b/drivers/input/joystick/iforce/iforce-packets.c
@@ -249,9 +249,6 @@ void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data,
249 249
250int iforce_get_id_packet(struct iforce *iforce, char *packet) 250int iforce_get_id_packet(struct iforce *iforce, char *packet)
251{ 251{
252 DECLARE_WAITQUEUE(wait, current);
253 int timeout = HZ; /* 1 second */
254
255 switch (iforce->bus) { 252 switch (iforce->bus) {
256 253
257 case IFORCE_USB: 254 case IFORCE_USB:
@@ -260,22 +257,13 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet)
260 iforce->cr.bRequest = packet[0]; 257 iforce->cr.bRequest = packet[0];
261 iforce->ctrl->dev = iforce->usbdev; 258 iforce->ctrl->dev = iforce->usbdev;
262 259
263 set_current_state(TASK_INTERRUPTIBLE); 260 if (usb_submit_urb(iforce->ctrl, GFP_ATOMIC))
264 add_wait_queue(&iforce->wait, &wait);
265
266 if (usb_submit_urb(iforce->ctrl, GFP_ATOMIC)) {
267 set_current_state(TASK_RUNNING);
268 remove_wait_queue(&iforce->wait, &wait);
269 return -1; 261 return -1;
270 }
271 262
272 while (timeout && iforce->ctrl->status == -EINPROGRESS) 263 wait_event_interruptible_timeout(iforce->wait,
273 timeout = schedule_timeout(timeout); 264 iforce->ctrl->status != -EINPROGRESS, HZ);
274 265
275 set_current_state(TASK_RUNNING); 266 if (iforce->ctrl->status != -EINPROGRESS) {
276 remove_wait_queue(&iforce->wait, &wait);
277
278 if (!timeout) {
279 usb_unlink_urb(iforce->ctrl); 267 usb_unlink_urb(iforce->ctrl);
280 return -1; 268 return -1;
281 } 269 }
@@ -290,16 +278,10 @@ int iforce_get_id_packet(struct iforce *iforce, char *packet)
290 iforce->expect_packet = FF_CMD_QUERY; 278 iforce->expect_packet = FF_CMD_QUERY;
291 iforce_send_packet(iforce, FF_CMD_QUERY, packet); 279 iforce_send_packet(iforce, FF_CMD_QUERY, packet);
292 280
293 set_current_state(TASK_INTERRUPTIBLE); 281 wait_event_interruptible_timeout(iforce->wait,
294 add_wait_queue(&iforce->wait, &wait); 282 !iforce->expect_packet, HZ);
295
296 while (timeout && iforce->expect_packet)
297 timeout = schedule_timeout(timeout);
298
299 set_current_state(TASK_RUNNING);
300 remove_wait_queue(&iforce->wait, &wait);
301 283
302 if (!timeout) { 284 if (iforce->expect_packet) {
303 iforce->expect_packet = 0; 285 iforce->expect_packet = 0;
304 return -1; 286 return -1;
305 } 287 }
diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c
index 6369a24684fe..58600f91eff5 100644
--- a/drivers/input/joystick/iforce/iforce-usb.c
+++ b/drivers/input/joystick/iforce/iforce-usb.c
@@ -95,6 +95,7 @@ static void iforce_usb_irq(struct urb *urb, struct pt_regs *regs)
95 goto exit; 95 goto exit;
96 } 96 }
97 97
98 wake_up(&iforce->wait);
98 iforce_process_packet(iforce, 99 iforce_process_packet(iforce,
99 (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs); 100 (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1, regs);
100 101
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
index 4d4985b59abf..1ad8c2ee7dbf 100644
--- a/drivers/input/keyboard/atkbd.c
+++ b/drivers/input/keyboard/atkbd.c
@@ -208,6 +208,7 @@ struct atkbd {
208 unsigned char resend; 208 unsigned char resend;
209 unsigned char release; 209 unsigned char release;
210 unsigned char bat_xl; 210 unsigned char bat_xl;
211 unsigned char err_xl;
211 unsigned int last; 212 unsigned int last;
212 unsigned long time; 213 unsigned long time;
213}; 214};
@@ -296,15 +297,18 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
296 if (atkbd->emul || 297 if (atkbd->emul ||
297 !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 || 298 !(code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1 ||
298 code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA || 299 code == ATKBD_RET_HANGUEL || code == ATKBD_RET_HANJA ||
299 code == ATKBD_RET_ERR || 300 (code == ATKBD_RET_ERR && !atkbd->err_xl) ||
300 (code == ATKBD_RET_BAT && !atkbd->bat_xl))) { 301 (code == ATKBD_RET_BAT && !atkbd->bat_xl))) {
301 atkbd->release = code >> 7; 302 atkbd->release = code >> 7;
302 code &= 0x7f; 303 code &= 0x7f;
303 } 304 }
304 305
305 if (!atkbd->emul && 306 if (!atkbd->emul) {
306 (code & 0x7f) == (ATKBD_RET_BAT & 0x7f)) 307 if ((code & 0x7f) == (ATKBD_RET_BAT & 0x7f))
307 atkbd->bat_xl = !atkbd->release; 308 atkbd->bat_xl = !atkbd->release;
309 if ((code & 0x7f) == (ATKBD_RET_ERR & 0x7f))
310 atkbd->err_xl = !atkbd->release;
311 }
308 } 312 }
309 313
310 switch (code) { 314 switch (code) {
diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c
index 596964ceb96d..4bae5d89348d 100644
--- a/drivers/input/keyboard/sunkbd.c
+++ b/drivers/input/keyboard/sunkbd.c
@@ -44,7 +44,7 @@ MODULE_DESCRIPTION(DRIVER_DESC);
44MODULE_LICENSE("GPL"); 44MODULE_LICENSE("GPL");
45 45
46static unsigned char sunkbd_keycode[128] = { 46static unsigned char sunkbd_keycode[128] = {
47 0,128,114,129,115, 59, 60, 68, 61, 87, 62, 88, 63,100, 64, 0, 47 0,128,114,129,115, 59, 60, 68, 61, 87, 62, 88, 63,100, 64,112,
48 65, 66, 67, 56,103,119, 99, 70,105,130,131,108,106, 1, 2, 3, 48 65, 66, 67, 56,103,119, 99, 70,105,130,131,108,106, 1, 2, 3,
49 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 41, 14,110,113, 98, 55, 49 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 41, 14,110,113, 98, 55,
50 116,132, 83,133,102, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 50 116,132, 83,133,102, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile
index c4909b49337d..82b330bbf068 100644
--- a/drivers/input/mouse/Makefile
+++ b/drivers/input/mouse/Makefile
@@ -15,4 +15,4 @@ obj-$(CONFIG_MOUSE_SERIAL) += sermouse.o
15obj-$(CONFIG_MOUSE_HIL) += hil_ptr.o 15obj-$(CONFIG_MOUSE_HIL) += hil_ptr.o
16obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o 16obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o
17 17
18psmouse-objs := psmouse-base.o alps.o logips2pp.o synaptics.o lifebook.o 18psmouse-objs := psmouse-base.o alps.o logips2pp.o synaptics.o lifebook.o trackpoint.o
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
index 0d68e5e0182a..b20783f9748a 100644
--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -170,7 +170,7 @@ static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs)
170 input_report_key(dev, BTN_TOOL_FINGER, z > 0); 170 input_report_key(dev, BTN_TOOL_FINGER, z > 0);
171 171
172 if (priv->i->flags & ALPS_WHEEL) 172 if (priv->i->flags & ALPS_WHEEL)
173 input_report_rel(dev, REL_WHEEL, ((packet[0] >> 4) & 0x07) | ((packet[2] >> 2) & 0x08)); 173 input_report_rel(dev, REL_WHEEL, ((packet[2] << 1) & 0x08) - ((packet[0] >> 4) & 0x07));
174 174
175 if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { 175 if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {
176 input_report_key(dev, BTN_FORWARD, forward); 176 input_report_key(dev, BTN_FORWARD, forward);
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c
index 48d2b20d2642..7df96525222e 100644
--- a/drivers/input/mouse/logips2pp.c
+++ b/drivers/input/mouse/logips2pp.c
@@ -150,12 +150,12 @@ static void ps2pp_set_smartscroll(struct psmouse *psmouse, unsigned int smartscr
150 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); 150 ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);
151} 151}
152 152
153static ssize_t psmouse_attr_show_smartscroll(struct psmouse *psmouse, char *buf) 153static ssize_t ps2pp_attr_show_smartscroll(struct psmouse *psmouse, void *data, char *buf)
154{ 154{
155 return sprintf(buf, "%d\n", psmouse->smartscroll ? 1 : 0); 155 return sprintf(buf, "%d\n", psmouse->smartscroll ? 1 : 0);
156} 156}
157 157
158static ssize_t psmouse_attr_set_smartscroll(struct psmouse *psmouse, const char *buf, size_t count) 158static ssize_t ps2pp_attr_set_smartscroll(struct psmouse *psmouse, void *data, const char *buf, size_t count)
159{ 159{
160 unsigned long value; 160 unsigned long value;
161 char *rest; 161 char *rest;
@@ -169,7 +169,8 @@ static ssize_t psmouse_attr_set_smartscroll(struct psmouse *psmouse, const char
169 return count; 169 return count;
170} 170}
171 171
172PSMOUSE_DEFINE_ATTR(smartscroll); 172PSMOUSE_DEFINE_ATTR(smartscroll, S_IWUSR | S_IRUGO, NULL,
173 ps2pp_attr_show_smartscroll, ps2pp_attr_set_smartscroll);
173 174
174/* 175/*
175 * Support 800 dpi resolution _only_ if the user wants it (there are good 176 * Support 800 dpi resolution _only_ if the user wants it (there are good
@@ -194,7 +195,7 @@ static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolutio
194 195
195static void ps2pp_disconnect(struct psmouse *psmouse) 196static void ps2pp_disconnect(struct psmouse *psmouse)
196{ 197{
197 device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); 198 device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr);
198} 199}
199 200
200static struct ps2pp_info *get_model_info(unsigned char model) 201static struct ps2pp_info *get_model_info(unsigned char model)
@@ -222,6 +223,7 @@ static struct ps2pp_info *get_model_info(unsigned char model)
222 { 80, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL }, 223 { 80, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL },
223 { 81, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, 224 { 81, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
224 { 83, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, 225 { 83, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
226 { 86, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
225 { 88, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, 227 { 88, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
226 { 96, 0, 0 }, 228 { 96, 0, 0 },
227 { 97, PS2PP_KIND_TP3, PS2PP_WHEEL | PS2PP_HWHEEL }, 229 { 97, PS2PP_KIND_TP3, PS2PP_WHEEL | PS2PP_HWHEEL },
@@ -379,7 +381,8 @@ int ps2pp_init(struct psmouse *psmouse, int set_properties)
379 psmouse->set_resolution = ps2pp_set_resolution; 381 psmouse->set_resolution = ps2pp_set_resolution;
380 psmouse->disconnect = ps2pp_disconnect; 382 psmouse->disconnect = ps2pp_disconnect;
381 383
382 device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll); 384 device_create_file(&psmouse->ps2dev.serio->dev,
385 &psmouse_attr_smartscroll.dattr);
383 } 386 }
384 } 387 }
385 388
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index 12bdd3eff923..af24313ff5bb 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -25,6 +25,7 @@
25#include "logips2pp.h" 25#include "logips2pp.h"
26#include "alps.h" 26#include "alps.h"
27#include "lifebook.h" 27#include "lifebook.h"
28#include "trackpoint.h"
28 29
29#define DRIVER_DESC "PS/2 mouse driver" 30#define DRIVER_DESC "PS/2 mouse driver"
30 31
@@ -57,10 +58,30 @@ static unsigned int psmouse_resetafter;
57module_param_named(resetafter, psmouse_resetafter, uint, 0644); 58module_param_named(resetafter, psmouse_resetafter, uint, 0644);
58MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 59MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
59 60
60PSMOUSE_DEFINE_ATTR(protocol); 61PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO,
61PSMOUSE_DEFINE_ATTR(rate); 62 NULL,
62PSMOUSE_DEFINE_ATTR(resolution); 63 psmouse_attr_show_protocol, psmouse_attr_set_protocol);
63PSMOUSE_DEFINE_ATTR(resetafter); 64PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO,
65 (void *) offsetof(struct psmouse, rate),
66 psmouse_show_int_attr, psmouse_attr_set_rate);
67PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO,
68 (void *) offsetof(struct psmouse, resolution),
69 psmouse_show_int_attr, psmouse_attr_set_resolution);
70PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO,
71 (void *) offsetof(struct psmouse, resetafter),
72 psmouse_show_int_attr, psmouse_set_int_attr);
73
74static struct attribute *psmouse_attributes[] = {
75 &psmouse_attr_protocol.dattr.attr,
76 &psmouse_attr_rate.dattr.attr,
77 &psmouse_attr_resolution.dattr.attr,
78 &psmouse_attr_resetafter.dattr.attr,
79 NULL
80};
81
82static struct attribute_group psmouse_attribute_group = {
83 .attrs = psmouse_attributes,
84};
64 85
65__obsolete_setup("psmouse_noext"); 86__obsolete_setup("psmouse_noext");
66__obsolete_setup("psmouse_resolution="); 87__obsolete_setup("psmouse_resolution=");
@@ -520,6 +541,12 @@ static int psmouse_extensions(struct psmouse *psmouse,
520 return PSMOUSE_IMPS; 541 return PSMOUSE_IMPS;
521 542
522/* 543/*
544 * Try to initialize the IBM TrackPoint
545 */
546 if (max_proto > PSMOUSE_IMEX && trackpoint_detect(psmouse, set_properties) == 0)
547 return PSMOUSE_TRACKPOINT;
548
549/*
523 * Okay, all failed, we have a standard mouse here. The number of the buttons 550 * Okay, all failed, we have a standard mouse here. The number of the buttons
524 * is still a question, though. We assume 3. 551 * is still a question, though. We assume 3.
525 */ 552 */
@@ -600,6 +627,12 @@ static struct psmouse_protocol psmouse_protocols[] = {
600 .init = lifebook_init, 627 .init = lifebook_init,
601 }, 628 },
602 { 629 {
630 .type = PSMOUSE_TRACKPOINT,
631 .name = "TPPS/2",
632 .alias = "trackpoint",
633 .detect = trackpoint_detect,
634 },
635 {
603 .type = PSMOUSE_AUTO, 636 .type = PSMOUSE_AUTO,
604 .name = "auto", 637 .name = "auto",
605 .alias = "any", 638 .alias = "any",
@@ -787,10 +820,7 @@ static void psmouse_disconnect(struct serio *serio)
787 820
788 psmouse = serio_get_drvdata(serio); 821 psmouse = serio_get_drvdata(serio);
789 822
790 device_remove_file(&serio->dev, &psmouse_attr_protocol); 823 sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group);
791 device_remove_file(&serio->dev, &psmouse_attr_rate);
792 device_remove_file(&serio->dev, &psmouse_attr_resolution);
793 device_remove_file(&serio->dev, &psmouse_attr_resetafter);
794 824
795 down(&psmouse_sem); 825 down(&psmouse_sem);
796 826
@@ -927,10 +957,7 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv)
927 if (parent && parent->pt_activate) 957 if (parent && parent->pt_activate)
928 parent->pt_activate(parent); 958 parent->pt_activate(parent);
929 959
930 device_create_file(&serio->dev, &psmouse_attr_protocol); 960 sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group);
931 device_create_file(&serio->dev, &psmouse_attr_rate);
932 device_create_file(&serio->dev, &psmouse_attr_resolution);
933 device_create_file(&serio->dev, &psmouse_attr_resetafter);
934 961
935 psmouse_activate(psmouse); 962 psmouse_activate(psmouse);
936 963
@@ -1027,10 +1054,12 @@ static struct serio_driver psmouse_drv = {
1027 .cleanup = psmouse_cleanup, 1054 .cleanup = psmouse_cleanup,
1028}; 1055};
1029 1056
1030ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, 1057ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr,
1031 ssize_t (*handler)(struct psmouse *, char *)) 1058 char *buf)
1032{ 1059{
1033 struct serio *serio = to_serio_port(dev); 1060 struct serio *serio = to_serio_port(dev);
1061 struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1062 struct psmouse *psmouse;
1034 int retval; 1063 int retval;
1035 1064
1036 retval = serio_pin_driver(serio); 1065 retval = serio_pin_driver(serio);
@@ -1042,19 +1071,21 @@ ssize_t psmouse_attr_show_helper(struct device *dev, char *buf,
1042 goto out; 1071 goto out;
1043 } 1072 }
1044 1073
1045 retval = handler(serio_get_drvdata(serio), buf); 1074 psmouse = serio_get_drvdata(serio);
1075
1076 retval = attr->show(psmouse, attr->data, buf);
1046 1077
1047out: 1078out:
1048 serio_unpin_driver(serio); 1079 serio_unpin_driver(serio);
1049 return retval; 1080 return retval;
1050} 1081}
1051 1082
1052ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, 1083ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr,
1053 ssize_t (*handler)(struct psmouse *, const char *, size_t)) 1084 const char *buf, size_t count)
1054{ 1085{
1055 struct serio *serio = to_serio_port(dev); 1086 struct serio *serio = to_serio_port(dev);
1056 struct psmouse *psmouse = serio_get_drvdata(serio); 1087 struct psmouse_attribute *attr = to_psmouse_attr(devattr);
1057 struct psmouse *parent = NULL; 1088 struct psmouse *psmouse, *parent = NULL;
1058 int retval; 1089 int retval;
1059 1090
1060 retval = serio_pin_driver(serio); 1091 retval = serio_pin_driver(serio);
@@ -1070,6 +1101,8 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun
1070 if (retval) 1101 if (retval)
1071 goto out_unpin; 1102 goto out_unpin;
1072 1103
1104 psmouse = serio_get_drvdata(serio);
1105
1073 if (psmouse->state == PSMOUSE_IGNORE) { 1106 if (psmouse->state == PSMOUSE_IGNORE) {
1074 retval = -ENODEV; 1107 retval = -ENODEV;
1075 goto out_up; 1108 goto out_up;
@@ -1082,7 +1115,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun
1082 1115
1083 psmouse_deactivate(psmouse); 1116 psmouse_deactivate(psmouse);
1084 1117
1085 retval = handler(psmouse, buf, count); 1118 retval = attr->set(psmouse, attr->data, buf, count);
1086 1119
1087 if (retval != -ENODEV) 1120 if (retval != -ENODEV)
1088 psmouse_activate(psmouse); 1121 psmouse_activate(psmouse);
@@ -1097,12 +1130,34 @@ ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t coun
1097 return retval; 1130 return retval;
1098} 1131}
1099 1132
1100static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, char *buf) 1133static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf)
1134{
1135 unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset);
1136
1137 return sprintf(buf, "%lu\n", *field);
1138}
1139
1140static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count)
1141{
1142 unsigned long *field = (unsigned long *)((char *)psmouse + (size_t)offset);
1143 unsigned long value;
1144 char *rest;
1145
1146 value = simple_strtoul(buf, &rest, 10);
1147 if (*rest)
1148 return -EINVAL;
1149
1150 *field = value;
1151
1152 return count;
1153}
1154
1155static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf)
1101{ 1156{
1102 return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name); 1157 return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name);
1103} 1158}
1104 1159
1105static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, const char *buf, size_t count) 1160static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1106{ 1161{
1107 struct serio *serio = psmouse->ps2dev.serio; 1162 struct serio *serio = psmouse->ps2dev.serio;
1108 struct psmouse *parent = NULL; 1163 struct psmouse *parent = NULL;
@@ -1166,12 +1221,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, const char *bu
1166 return count; 1221 return count;
1167} 1222}
1168 1223
1169static ssize_t psmouse_attr_show_rate(struct psmouse *psmouse, char *buf) 1224static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1170{
1171 return sprintf(buf, "%d\n", psmouse->rate);
1172}
1173
1174static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, size_t count)
1175{ 1225{
1176 unsigned long value; 1226 unsigned long value;
1177 char *rest; 1227 char *rest;
@@ -1184,12 +1234,7 @@ static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, const char *buf, s
1184 return count; 1234 return count;
1185} 1235}
1186 1236
1187static ssize_t psmouse_attr_show_resolution(struct psmouse *psmouse, char *buf) 1237static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count)
1188{
1189 return sprintf(buf, "%d\n", psmouse->resolution);
1190}
1191
1192static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char *buf, size_t count)
1193{ 1238{
1194 unsigned long value; 1239 unsigned long value;
1195 char *rest; 1240 char *rest;
@@ -1202,23 +1247,6 @@ static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, const char *
1202 return count; 1247 return count;
1203} 1248}
1204 1249
1205static ssize_t psmouse_attr_show_resetafter(struct psmouse *psmouse, char *buf)
1206{
1207 return sprintf(buf, "%d\n", psmouse->resetafter);
1208}
1209
1210static ssize_t psmouse_attr_set_resetafter(struct psmouse *psmouse, const char *buf, size_t count)
1211{
1212 unsigned long value;
1213 char *rest;
1214
1215 value = simple_strtoul(buf, &rest, 10);
1216 if (*rest)
1217 return -EINVAL;
1218
1219 psmouse->resetafter = value;
1220 return count;
1221}
1222 1250
1223static int psmouse_set_maxproto(const char *val, struct kernel_param *kp) 1251static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
1224{ 1252{
@@ -1234,7 +1262,7 @@ static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
1234 1262
1235 *((unsigned int *)kp->arg) = proto->type; 1263 *((unsigned int *)kp->arg) = proto->type;
1236 1264
1237 return 0; \ 1265 return 0;
1238} 1266}
1239 1267
1240static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp) 1268static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h
index 86691cf43433..45d2bd774f00 100644
--- a/drivers/input/mouse/psmouse.h
+++ b/drivers/input/mouse/psmouse.h
@@ -78,6 +78,7 @@ enum psmouse_type {
78 PSMOUSE_SYNAPTICS, 78 PSMOUSE_SYNAPTICS,
79 PSMOUSE_ALPS, 79 PSMOUSE_ALPS,
80 PSMOUSE_LIFEBOOK, 80 PSMOUSE_LIFEBOOK,
81 PSMOUSE_TRACKPOINT,
81 PSMOUSE_AUTO /* This one should always be last */ 82 PSMOUSE_AUTO /* This one should always be last */
82}; 83};
83 84
@@ -85,24 +86,37 @@ int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command);
85int psmouse_reset(struct psmouse *psmouse); 86int psmouse_reset(struct psmouse *psmouse);
86void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution); 87void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution);
87 88
88ssize_t psmouse_attr_show_helper(struct device *dev, char *buf, 89
89 ssize_t (*handler)(struct psmouse *, char *)); 90struct psmouse_attribute {
90ssize_t psmouse_attr_set_helper(struct device *dev, const char *buf, size_t count, 91 struct device_attribute dattr;
91 ssize_t (*handler)(struct psmouse *, const char *, size_t)); 92 void *data;
92 93 ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf);
93#define PSMOUSE_DEFINE_ATTR(_name) \ 94 ssize_t (*set)(struct psmouse *psmouse, void *data,
94static ssize_t psmouse_attr_show_##_name(struct psmouse *, char *); \ 95 const char *buf, size_t count);
95static ssize_t psmouse_attr_set_##_name(struct psmouse *, const char *, size_t);\ 96};
96static ssize_t psmouse_do_show_##_name(struct device *d, struct device_attribute *attr, char *b) \ 97#define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr)
97{ \ 98
98 return psmouse_attr_show_helper(d, b, psmouse_attr_show_##_name); \ 99ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr,
99} \ 100 char *buf);
100static ssize_t psmouse_do_set_##_name(struct device *d, struct device_attribute *attr, const char *b, size_t s)\ 101ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr,
101{ \ 102 const char *buf, size_t count);
102 return psmouse_attr_set_helper(d, b, s, psmouse_attr_set_##_name); \ 103
103} \ 104#define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set) \
104static struct device_attribute psmouse_attr_##_name = \ 105static ssize_t _show(struct psmouse *, void *data, char *); \
105 __ATTR(_name, S_IWUSR | S_IRUGO, \ 106static ssize_t _set(struct psmouse *, void *data, const char *, size_t); \
106 psmouse_do_show_##_name, psmouse_do_set_##_name); 107static struct psmouse_attribute psmouse_attr_##_name = { \
108 .dattr = { \
109 .attr = { \
110 .name = __stringify(_name), \
111 .mode = _mode, \
112 .owner = THIS_MODULE, \
113 }, \
114 .show = psmouse_attr_show_helper, \
115 .store = psmouse_attr_set_helper, \
116 }, \
117 .data = _data, \
118 .show = _show, \
119 .set = _set, \
120}
107 121
108#endif /* _PSMOUSE_H */ 122#endif /* _PSMOUSE_H */
diff --git a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c
new file mode 100644
index 000000000000..b4898d8a68e2
--- /dev/null
+++ b/drivers/input/mouse/trackpoint.c
@@ -0,0 +1,304 @@
1/*
2 * Stephen Evanchik <evanchsa@gmail.com>
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 as published by
6 * the Free Software Foundation.
7 *
8 * Trademarks are the property of their respective owners.
9 */
10
11#include <linux/delay.h>
12#include <linux/serio.h>
13#include <linux/module.h>
14#include <linux/moduleparam.h>
15#include <linux/input.h>
16#include <linux/libps2.h>
17#include <linux/proc_fs.h>
18#include <asm/uaccess.h>
19#include "psmouse.h"
20#include "trackpoint.h"
21
22/*
23 * Device IO: read, write and toggle bit
24 */
25static int trackpoint_read(struct ps2dev *ps2dev, unsigned char loc, unsigned char *results)
26{
27 if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) ||
28 ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 1, loc))) {
29 return -1;
30 }
31
32 return 0;
33}
34
35static int trackpoint_write(struct ps2dev *ps2dev, unsigned char loc, unsigned char val)
36{
37 if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) ||
38 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_WRITE_MEM)) ||
39 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) ||
40 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, val))) {
41 return -1;
42 }
43
44 return 0;
45}
46
47static int trackpoint_toggle_bit(struct ps2dev *ps2dev, unsigned char loc, unsigned char mask)
48{
49 /* Bad things will happen if the loc param isn't in this range */
50 if (loc < 0x20 || loc >= 0x2F)
51 return -1;
52
53 if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) ||
54 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_TOGGLE)) ||
55 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) ||
56 ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, mask))) {
57 return -1;
58 }
59
60 return 0;
61}
62
63
64/*
65 * Trackpoint-specific attributes
66 */
67struct trackpoint_attr_data {
68 size_t field_offset;
69 unsigned char command;
70 unsigned char mask;
71};
72
73static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf)
74{
75 struct trackpoint_data *tp = psmouse->private;
76 struct trackpoint_attr_data *attr = data;
77 unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset);
78
79 return sprintf(buf, "%u\n", *field);
80}
81
82static ssize_t trackpoint_set_int_attr(struct psmouse *psmouse, void *data,
83 const char *buf, size_t count)
84{
85 struct trackpoint_data *tp = psmouse->private;
86 struct trackpoint_attr_data *attr = data;
87 unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset);
88 unsigned long value;
89 char *rest;
90
91 value = simple_strtoul(buf, &rest, 10);
92 if (*rest || value > 255)
93 return -EINVAL;
94
95 *field = value;
96 trackpoint_write(&psmouse->ps2dev, attr->command, value);
97
98 return count;
99}
100
101#define TRACKPOINT_INT_ATTR(_name, _command) \
102 static struct trackpoint_attr_data trackpoint_attr_##_name = { \
103 .field_offset = offsetof(struct trackpoint_data, _name), \
104 .command = _command, \
105 }; \
106 PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \
107 &trackpoint_attr_##_name, \
108 trackpoint_show_int_attr, trackpoint_set_int_attr)
109
110static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data,
111 const char *buf, size_t count)
112{
113 struct trackpoint_data *tp = psmouse->private;
114 struct trackpoint_attr_data *attr = data;
115 unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset);
116 unsigned long value;
117 char *rest;
118
119 value = simple_strtoul(buf, &rest, 10);
120 if (*rest || value > 1)
121 return -EINVAL;
122
123 if (*field != value) {
124 *field = value;
125 trackpoint_toggle_bit(&psmouse->ps2dev, attr->command, attr->mask);
126 }
127
128 return count;
129}
130
131
132#define TRACKPOINT_BIT_ATTR(_name, _command, _mask) \
133 static struct trackpoint_attr_data trackpoint_attr_##_name = { \
134 .field_offset = offsetof(struct trackpoint_data, _name), \
135 .command = _command, \
136 .mask = _mask, \
137 }; \
138 PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \
139 &trackpoint_attr_##_name, \
140 trackpoint_show_int_attr, trackpoint_set_bit_attr)
141
142TRACKPOINT_INT_ATTR(sensitivity, TP_SENS);
143TRACKPOINT_INT_ATTR(speed, TP_SPEED);
144TRACKPOINT_INT_ATTR(inertia, TP_INERTIA);
145TRACKPOINT_INT_ATTR(reach, TP_REACH);
146TRACKPOINT_INT_ATTR(draghys, TP_DRAGHYS);
147TRACKPOINT_INT_ATTR(mindrag, TP_MINDRAG);
148TRACKPOINT_INT_ATTR(thresh, TP_THRESH);
149TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH);
150TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME);
151TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV);
152
153TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON);
154TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK);
155TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV);
156
157static struct attribute *trackpoint_attrs[] = {
158 &psmouse_attr_sensitivity.dattr.attr,
159 &psmouse_attr_speed.dattr.attr,
160 &psmouse_attr_inertia.dattr.attr,
161 &psmouse_attr_reach.dattr.attr,
162 &psmouse_attr_draghys.dattr.attr,
163 &psmouse_attr_mindrag.dattr.attr,
164 &psmouse_attr_thresh.dattr.attr,
165 &psmouse_attr_upthresh.dattr.attr,
166 &psmouse_attr_ztime.dattr.attr,
167 &psmouse_attr_jenks.dattr.attr,
168 &psmouse_attr_press_to_select.dattr.attr,
169 &psmouse_attr_skipback.dattr.attr,
170 &psmouse_attr_ext_dev.dattr.attr,
171 NULL
172};
173
174static struct attribute_group trackpoint_attr_group = {
175 .attrs = trackpoint_attrs,
176};
177
178static void trackpoint_disconnect(struct psmouse *psmouse)
179{
180 sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group);
181
182 kfree(psmouse->private);
183 psmouse->private = NULL;
184}
185
186static int trackpoint_sync(struct psmouse *psmouse)
187{
188 unsigned char toggle;
189 struct trackpoint_data *tp = psmouse->private;
190
191 if (!tp)
192 return -1;
193
194 /* Disable features that may make device unusable with this driver */
195 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, &toggle);
196 if (toggle & TP_MASK_TWOHAND)
197 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, TP_MASK_TWOHAND);
198
199 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_SOURCE_TAG, &toggle);
200 if (toggle & TP_MASK_SOURCE_TAG)
201 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_SOURCE_TAG, TP_MASK_SOURCE_TAG);
202
203 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_MB, &toggle);
204 if (toggle & TP_MASK_MB)
205 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_MB, TP_MASK_MB);
206
207 /* Push the config to the device */
208 trackpoint_write(&psmouse->ps2dev, TP_SENS, tp->sensitivity);
209 trackpoint_write(&psmouse->ps2dev, TP_INERTIA, tp->inertia);
210 trackpoint_write(&psmouse->ps2dev, TP_SPEED, tp->speed);
211
212 trackpoint_write(&psmouse->ps2dev, TP_REACH, tp->reach);
213 trackpoint_write(&psmouse->ps2dev, TP_DRAGHYS, tp->draghys);
214 trackpoint_write(&psmouse->ps2dev, TP_MINDRAG, tp->mindrag);
215
216 trackpoint_write(&psmouse->ps2dev, TP_THRESH, tp->thresh);
217 trackpoint_write(&psmouse->ps2dev, TP_UP_THRESH, tp->upthresh);
218
219 trackpoint_write(&psmouse->ps2dev, TP_Z_TIME, tp->ztime);
220 trackpoint_write(&psmouse->ps2dev, TP_JENKS_CURV, tp->jenks);
221
222 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_PTSON, &toggle);
223 if (((toggle & TP_MASK_PTSON) == TP_MASK_PTSON) != tp->press_to_select)
224 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_PTSON, TP_MASK_PTSON);
225
226 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_SKIPBACK, &toggle);
227 if (((toggle & TP_MASK_SKIPBACK) == TP_MASK_SKIPBACK) != tp->skipback)
228 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK);
229
230 trackpoint_read(&psmouse->ps2dev, TP_TOGGLE_EXT_DEV, &toggle);
231 if (((toggle & TP_MASK_EXT_DEV) == TP_MASK_EXT_DEV) != tp->ext_dev)
232 trackpoint_toggle_bit(&psmouse->ps2dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV);
233
234 return 0;
235}
236
237static void trackpoint_defaults(struct trackpoint_data *tp)
238{
239 tp->press_to_select = TP_DEF_PTSON;
240 tp->sensitivity = TP_DEF_SENS;
241 tp->speed = TP_DEF_SPEED;
242 tp->reach = TP_DEF_REACH;
243
244 tp->draghys = TP_DEF_DRAGHYS;
245 tp->mindrag = TP_DEF_MINDRAG;
246
247 tp->thresh = TP_DEF_THRESH;
248 tp->upthresh = TP_DEF_UP_THRESH;
249
250 tp->ztime = TP_DEF_Z_TIME;
251 tp->jenks = TP_DEF_JENKS_CURV;
252
253 tp->inertia = TP_DEF_INERTIA;
254 tp->skipback = TP_DEF_SKIPBACK;
255 tp->ext_dev = TP_DEF_EXT_DEV;
256}
257
258int trackpoint_detect(struct psmouse *psmouse, int set_properties)
259{
260 struct trackpoint_data *priv;
261 struct ps2dev *ps2dev = &psmouse->ps2dev;
262 unsigned char firmware_id;
263 unsigned char button_info;
264 unsigned char param[2];
265
266 param[0] = param[1] = 0;
267
268 if (ps2_command(ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID)))
269 return -1;
270
271 if (param[0] != TP_MAGIC_IDENT)
272 return -1;
273
274 if (!set_properties)
275 return 0;
276
277 firmware_id = param[1];
278
279 if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) {
280 printk(KERN_WARNING "trackpoint.c: failed to get extended button data\n");
281 button_info = 0;
282 }
283
284 psmouse->private = priv = kcalloc(1, sizeof(struct trackpoint_data), GFP_KERNEL);
285 if (!priv)
286 return -1;
287
288 psmouse->vendor = "IBM";
289 psmouse->name = "TrackPoint";
290
291 psmouse->reconnect = trackpoint_sync;
292 psmouse->disconnect = trackpoint_disconnect;
293
294 trackpoint_defaults(priv);
295 trackpoint_sync(psmouse);
296
297 sysfs_create_group(&ps2dev->serio->dev.kobj, &trackpoint_attr_group);
298
299 printk(KERN_INFO "IBM TrackPoint firmware: 0x%02x, buttons: %d/%d\n",
300 firmware_id, (button_info & 0xf0) >> 4, button_info & 0x0f);
301
302 return 0;
303}
304
diff --git a/drivers/input/mouse/trackpoint.h b/drivers/input/mouse/trackpoint.h
new file mode 100644
index 000000000000..9857d8b6ad66
--- /dev/null
+++ b/drivers/input/mouse/trackpoint.h
@@ -0,0 +1,147 @@
1/*
2 * IBM TrackPoint PS/2 mouse driver
3 *
4 * Stephen Evanchik <evanchsa@gmail.com>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published by
8 * the Free Software Foundation.
9 */
10
11#ifndef _TRACKPOINT_H
12#define _TRACKPOINT_H
13
14/*
15 * These constants are from the TrackPoint System
16 * Engineering documentation Version 4 from IBM Watson
17 * research:
18 * http://wwwcssrv.almaden.ibm.com/trackpoint/download.html
19 */
20
21#define TP_COMMAND 0xE2 /* Commands start with this */
22
23#define TP_READ_ID 0xE1 /* Sent for device identification */
24#define TP_MAGIC_IDENT 0x01 /* Sent after a TP_READ_ID followed */
25 /* by the firmware ID */
26
27
28/*
29 * Commands
30 */
31#define TP_RECALIB 0x51 /* Recalibrate */
32#define TP_POWER_DOWN 0x44 /* Can only be undone through HW reset */
33#define TP_EXT_DEV 0x21 /* Determines if external device is connected (RO) */
34#define TP_EXT_BTN 0x4B /* Read extended button status */
35#define TP_POR 0x7F /* Execute Power on Reset */
36#define TP_POR_RESULTS 0x25 /* Read Power on Self test results */
37#define TP_DISABLE_EXT 0x40 /* Disable external pointing device */
38#define TP_ENABLE_EXT 0x41 /* Enable external pointing device */
39
40/*
41 * Mode manipulation
42 */
43#define TP_SET_SOFT_TRANS 0x4E /* Set mode */
44#define TP_CANCEL_SOFT_TRANS 0xB9 /* Cancel mode */
45#define TP_SET_HARD_TRANS 0x45 /* Mode can only be set */
46
47
48/*
49 * Register oriented commands/properties
50 */
51#define TP_WRITE_MEM 0x81
52#define TP_READ_MEM 0x80 /* Not used in this implementation */
53
54/*
55* RAM Locations for properties
56 */
57#define TP_SENS 0x4A /* Sensitivity */
58#define TP_MB 0x4C /* Read Middle Button Status (RO) */
59#define TP_INERTIA 0x4D /* Negative Inertia */
60#define TP_SPEED 0x60 /* Speed of TP Cursor */
61#define TP_REACH 0x57 /* Backup for Z-axis press */
62#define TP_DRAGHYS 0x58 /* Drag Hysteresis */
63 /* (how hard it is to drag */
64 /* with Z-axis pressed) */
65
66#define TP_MINDRAG 0x59 /* Minimum amount of force needed */
67 /* to trigger dragging */
68
69#define TP_THRESH 0x5C /* Minimum value for a Z-axis press */
70#define TP_UP_THRESH 0x5A /* Used to generate a 'click' on Z-axis */
71#define TP_Z_TIME 0x5E /* How sharp of a press */
72#define TP_JENKS_CURV 0x5D /* Minimum curvature for double click */
73
74/*
75 * Toggling Flag bits
76 */
77#define TP_TOGGLE 0x47 /* Toggle command */
78
79#define TP_TOGGLE_MB 0x23 /* Disable/Enable Middle Button */
80#define TP_MASK_MB 0x01
81#define TP_TOGGLE_EXT_DEV 0x23 /* Toggle external device */
82#define TP_MASK_EXT_DEV 0x02
83#define TP_TOGGLE_DRIFT 0x23 /* Drift Correction */
84#define TP_MASK_DRIFT 0x80
85#define TP_TOGGLE_BURST 0x28 /* Burst Mode */
86#define TP_MASK_BURST 0x80
87#define TP_TOGGLE_PTSON 0x2C /* Press to Select */
88#define TP_MASK_PTSON 0x01
89#define TP_TOGGLE_HARD_TRANS 0x2C /* Alternate method to set Hard Transparency */
90#define TP_MASK_HARD_TRANS 0x80
91#define TP_TOGGLE_TWOHAND 0x2D /* Two handed */
92#define TP_MASK_TWOHAND 0x01
93#define TP_TOGGLE_STICKY_TWO 0x2D /* Sticky two handed */
94#define TP_MASK_STICKY_TWO 0x04
95#define TP_TOGGLE_SKIPBACK 0x2D /* Suppress movement after drag release */
96#define TP_MASK_SKIPBACK 0x08
97#define TP_TOGGLE_SOURCE_TAG 0x20 /* Bit 3 of the first packet will be set to
98 to the origin of the packet (external or TP) */
99#define TP_MASK_SOURCE_TAG 0x80
100#define TP_TOGGLE_EXT_TAG 0x22 /* Bit 3 of the first packet coming from the
101 external device will be forced to 1 */
102#define TP_MASK_EXT_TAG 0x04
103
104
105/* Power on Self Test Results */
106#define TP_POR_SUCCESS 0x3B
107
108/*
109 * Default power on values
110 */
111#define TP_DEF_SENS 0x80
112#define TP_DEF_INERTIA 0x06
113#define TP_DEF_SPEED 0x61
114#define TP_DEF_REACH 0x0A
115
116#define TP_DEF_DRAGHYS 0xFF
117#define TP_DEF_MINDRAG 0x14
118
119#define TP_DEF_THRESH 0x08
120#define TP_DEF_UP_THRESH 0xFF
121#define TP_DEF_Z_TIME 0x26
122#define TP_DEF_JENKS_CURV 0x87
123
124/* Toggles */
125#define TP_DEF_MB 0x00
126#define TP_DEF_PTSON 0x00
127#define TP_DEF_SKIPBACK 0x00
128#define TP_DEF_EXT_DEV 0x01
129
130#define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd))
131
132struct trackpoint_data
133{
134 unsigned char sensitivity, speed, inertia, reach;
135 unsigned char draghys, mindrag;
136 unsigned char thresh, upthresh;
137 unsigned char ztime, jenks;
138
139 unsigned char press_to_select;
140 unsigned char skipback;
141
142 unsigned char ext_dev;
143};
144
145extern int trackpoint_detect(struct psmouse *psmouse, int set_properties);
146
147#endif /* _TRACKPOINT_H */
diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h
index c9e633d21d90..9a9221644250 100644
--- a/drivers/input/serio/i8042-io.h
+++ b/drivers/input/serio/i8042-io.h
@@ -69,16 +69,16 @@ static inline int i8042_platform_init(void)
69 */ 69 */
70#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC64) 70#if !defined(__sh__) && !defined(__alpha__) && !defined(__mips__) && !defined(CONFIG_PPC64)
71 if (!request_region(I8042_DATA_REG, 16, "i8042")) 71 if (!request_region(I8042_DATA_REG, 16, "i8042"))
72 return -1; 72 return -EBUSY;
73#endif 73#endif
74 74
75 i8042_reset = 1; 75 i8042_reset = 1;
76 76
77#if defined(CONFIG_PPC64) 77#if defined(CONFIG_PPC64)
78 if (check_legacy_ioport(I8042_DATA_REG)) 78 if (check_legacy_ioport(I8042_DATA_REG))
79 return -1; 79 return -EBUSY;
80 if (!request_region(I8042_DATA_REG, 16, "i8042")) 80 if (!request_region(I8042_DATA_REG, 16, "i8042"))
81 return -1; 81 return -EBUSY;
82#endif 82#endif
83 return 0; 83 return 0;
84} 84}
diff --git a/drivers/input/serio/i8042-ip22io.h b/drivers/input/serio/i8042-ip22io.h
index 863b9c95fbb8..ee1ad27d6ed0 100644
--- a/drivers/input/serio/i8042-ip22io.h
+++ b/drivers/input/serio/i8042-ip22io.h
@@ -58,7 +58,7 @@ static inline int i8042_platform_init(void)
58#if 0 58#if 0
59 /* XXX sgi_kh is a virtual address */ 59 /* XXX sgi_kh is a virtual address */
60 if (!request_mem_region(sgi_kh, sizeof(struct hpc_keyb), "i8042")) 60 if (!request_mem_region(sgi_kh, sizeof(struct hpc_keyb), "i8042"))
61 return 1; 61 return -EBUSY;
62#endif 62#endif
63 63
64 i8042_reset = 1; 64 i8042_reset = 1;
diff --git a/drivers/input/serio/i8042-jazzio.h b/drivers/input/serio/i8042-jazzio.h
index 5c20ab131488..13fd7108eb28 100644
--- a/drivers/input/serio/i8042-jazzio.h
+++ b/drivers/input/serio/i8042-jazzio.h
@@ -53,7 +53,7 @@ static inline int i8042_platform_init(void)
53#if 0 53#if 0
54 /* XXX JAZZ_KEYBOARD_ADDRESS is a virtual address */ 54 /* XXX JAZZ_KEYBOARD_ADDRESS is a virtual address */
55 if (!request_mem_region(JAZZ_KEYBOARD_ADDRESS, 2, "i8042")) 55 if (!request_mem_region(JAZZ_KEYBOARD_ADDRESS, 2, "i8042"))
56 return 1; 56 return -EBUSY;
57#endif 57#endif
58 58
59 return 0; 59 return 0;
diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h
index da2a19812485..ed9446f6d7e3 100644
--- a/drivers/input/serio/i8042-sparcio.h
+++ b/drivers/input/serio/i8042-sparcio.h
@@ -48,10 +48,10 @@ static inline void i8042_write_command(int val)
48#define OBP_PS2MS_NAME1 "kdmouse" 48#define OBP_PS2MS_NAME1 "kdmouse"
49#define OBP_PS2MS_NAME2 "mouse" 49#define OBP_PS2MS_NAME2 "mouse"
50 50
51static int i8042_platform_init(void) 51static int __init i8042_platform_init(void)
52{ 52{
53#ifndef CONFIG_PCI 53#ifndef CONFIG_PCI
54 return -1; 54 return -ENODEV;
55#else 55#else
56 char prop[128]; 56 char prop[128];
57 int len; 57 int len;
@@ -59,14 +59,14 @@ static int i8042_platform_init(void)
59 len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop)); 59 len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
60 if (len < 0) { 60 if (len < 0) {
61 printk("i8042: Cannot get name property of root OBP node.\n"); 61 printk("i8042: Cannot get name property of root OBP node.\n");
62 return -1; 62 return -ENODEV;
63 } 63 }
64 if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) { 64 if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) {
65 /* Hardcoded values for MrCoffee. */ 65 /* Hardcoded values for MrCoffee. */
66 i8042_kbd_irq = i8042_aux_irq = 13 | 0x20; 66 i8042_kbd_irq = i8042_aux_irq = 13 | 0x20;
67 kbd_iobase = ioremap(0x71300060, 8); 67 kbd_iobase = ioremap(0x71300060, 8);
68 if (!kbd_iobase) 68 if (!kbd_iobase)
69 return -1; 69 return -ENODEV;
70 } else { 70 } else {
71 struct linux_ebus *ebus; 71 struct linux_ebus *ebus;
72 struct linux_ebus_device *edev; 72 struct linux_ebus_device *edev;
@@ -78,7 +78,7 @@ static int i8042_platform_init(void)
78 goto edev_found; 78 goto edev_found;
79 } 79 }
80 } 80 }
81 return -1; 81 return -ENODEV;
82 82
83 edev_found: 83 edev_found:
84 for_each_edevchild(edev, child) { 84 for_each_edevchild(edev, child) {
@@ -96,7 +96,7 @@ static int i8042_platform_init(void)
96 i8042_aux_irq == -1) { 96 i8042_aux_irq == -1) {
97 printk("i8042: Error, 8042 device lacks both kbd and " 97 printk("i8042: Error, 8042 device lacks both kbd and "
98 "mouse nodes.\n"); 98 "mouse nodes.\n");
99 return -1; 99 return -ENODEV;
100 } 100 }
101 } 101 }
102 102
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
index 03877c84e6ff..273bb3b08cfa 100644
--- a/drivers/input/serio/i8042-x86ia64io.h
+++ b/drivers/input/serio/i8042-x86ia64io.h
@@ -138,6 +138,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
138 }, 138 },
139 }, 139 },
140 { 140 {
141 .ident = "Fujitsu-Siemens Lifebook E4010",
142 .matches = {
143 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
144 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
145 },
146 },
147 {
141 .ident = "Toshiba P10", 148 .ident = "Toshiba P10",
142 .matches = { 149 .matches = {
143 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 150 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
@@ -256,9 +263,10 @@ static void i8042_pnp_exit(void)
256 } 263 }
257} 264}
258 265
259static int i8042_pnp_init(void) 266static int __init i8042_pnp_init(void)
260{ 267{
261 int result_kbd, result_aux; 268 int result_kbd = 0, result_aux = 0;
269 char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
262 270
263 if (i8042_nopnp) { 271 if (i8042_nopnp) {
264 printk(KERN_INFO "i8042: PNP detection disabled\n"); 272 printk(KERN_INFO "i8042: PNP detection disabled\n");
@@ -267,6 +275,7 @@ static int i8042_pnp_init(void)
267 275
268 if ((result_kbd = pnp_register_driver(&i8042_pnp_kbd_driver)) >= 0) 276 if ((result_kbd = pnp_register_driver(&i8042_pnp_kbd_driver)) >= 0)
269 i8042_pnp_kbd_registered = 1; 277 i8042_pnp_kbd_registered = 1;
278
270 if ((result_aux = pnp_register_driver(&i8042_pnp_aux_driver)) >= 0) 279 if ((result_aux = pnp_register_driver(&i8042_pnp_aux_driver)) >= 0)
271 i8042_pnp_aux_registered = 1; 280 i8042_pnp_aux_registered = 1;
272 281
@@ -280,6 +289,27 @@ static int i8042_pnp_init(void)
280#endif 289#endif
281 } 290 }
282 291
292 if (result_kbd > 0)
293 snprintf(kbd_irq_str, sizeof(kbd_irq_str),
294 "%d", i8042_pnp_kbd_irq);
295 if (result_aux > 0)
296 snprintf(aux_irq_str, sizeof(aux_irq_str),
297 "%d", i8042_pnp_aux_irq);
298
299 printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",
300 i8042_pnp_kbd_name, (result_kbd > 0 && result_aux > 0) ? "," : "",
301 i8042_pnp_aux_name,
302 i8042_pnp_data_reg, i8042_pnp_command_reg,
303 kbd_irq_str, (result_kbd > 0 && result_aux > 0) ? "," : "",
304 aux_irq_str);
305
306#if defined(__ia64__)
307 if (result_kbd <= 0)
308 i8042_nokbd = 1;
309 if (result_aux <= 0)
310 i8042_noaux = 1;
311#endif
312
283 if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 313 if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
284 i8042_pnp_data_reg != i8042_data_reg) || !i8042_pnp_data_reg) { 314 i8042_pnp_data_reg != i8042_data_reg) || !i8042_pnp_data_reg) {
285 printk(KERN_WARNING "PNP: PS/2 controller has invalid data port %#x; using default %#x\n", 315 printk(KERN_WARNING "PNP: PS/2 controller has invalid data port %#x; using default %#x\n",
@@ -294,53 +324,47 @@ static int i8042_pnp_init(void)
294 i8042_pnp_command_reg = i8042_command_reg; 324 i8042_pnp_command_reg = i8042_command_reg;
295 } 325 }
296 326
297 if (!i8042_pnp_kbd_irq) { 327 if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
298 printk(KERN_WARNING "PNP: PS/2 controller doesn't have KBD irq; using default %#x\n", i8042_kbd_irq); 328 printk(KERN_WARNING "PNP: PS/2 controller doesn't have KBD irq; using default %d\n", i8042_kbd_irq);
299 i8042_pnp_kbd_irq = i8042_kbd_irq; 329 i8042_pnp_kbd_irq = i8042_kbd_irq;
300 } 330 }
301 331
302 if (!i8042_pnp_aux_irq) { 332 if (!i8042_noaux && !i8042_pnp_aux_irq) {
303 printk(KERN_WARNING "PNP: PS/2 controller doesn't have AUX irq; using default %#x\n", i8042_aux_irq); 333 printk(KERN_WARNING "PNP: PS/2 controller doesn't have AUX irq; using default %d\n", i8042_aux_irq);
304 i8042_pnp_aux_irq = i8042_aux_irq; 334 i8042_pnp_aux_irq = i8042_aux_irq;
305 } 335 }
306 336
307#if defined(__ia64__)
308 if (result_aux <= 0)
309 i8042_noaux = 1;
310#endif
311
312 i8042_data_reg = i8042_pnp_data_reg; 337 i8042_data_reg = i8042_pnp_data_reg;
313 i8042_command_reg = i8042_pnp_command_reg; 338 i8042_command_reg = i8042_pnp_command_reg;
314 i8042_kbd_irq = i8042_pnp_kbd_irq; 339 i8042_kbd_irq = i8042_pnp_kbd_irq;
315 i8042_aux_irq = i8042_pnp_aux_irq; 340 i8042_aux_irq = i8042_pnp_aux_irq;
316 341
317 printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %d%s%d\n",
318 i8042_pnp_kbd_name, (result_kbd > 0 && result_aux > 0) ? "," : "", i8042_pnp_aux_name,
319 i8042_data_reg, i8042_command_reg, i8042_kbd_irq,
320 (result_aux > 0) ? "," : "", i8042_aux_irq);
321
322 return 0; 342 return 0;
323} 343}
324 344
345#else
346static inline int i8042_pnp_init(void) { return 0; }
347static inline void i8042_pnp_exit(void) { }
325#endif 348#endif
326 349
327static inline int i8042_platform_init(void) 350static int __init i8042_platform_init(void)
328{ 351{
352 int retval;
353
329/* 354/*
330 * On ix86 platforms touching the i8042 data register region can do really 355 * On ix86 platforms touching the i8042 data register region can do really
331 * bad things. Because of this the region is always reserved on ix86 boxes. 356 * bad things. Because of this the region is always reserved on ix86 boxes.
332 * 357 *
333 * if (!request_region(I8042_DATA_REG, 16, "i8042")) 358 * if (!request_region(I8042_DATA_REG, 16, "i8042"))
334 * return -1; 359 * return -EBUSY;
335 */ 360 */
336 361
337 i8042_kbd_irq = I8042_MAP_IRQ(1); 362 i8042_kbd_irq = I8042_MAP_IRQ(1);
338 i8042_aux_irq = I8042_MAP_IRQ(12); 363 i8042_aux_irq = I8042_MAP_IRQ(12);
339 364
340#ifdef CONFIG_PNP 365 retval = i8042_pnp_init();
341 if (i8042_pnp_init()) 366 if (retval)
342 return -1; 367 return retval;
343#endif
344 368
345#if defined(__ia64__) 369#if defined(__ia64__)
346 i8042_reset = 1; 370 i8042_reset = 1;
@@ -354,14 +378,12 @@ static inline int i8042_platform_init(void)
354 i8042_nomux = 1; 378 i8042_nomux = 1;
355#endif 379#endif
356 380
357 return 0; 381 return retval;
358} 382}
359 383
360static inline void i8042_platform_exit(void) 384static inline void i8042_platform_exit(void)
361{ 385{
362#ifdef CONFIG_PNP
363 i8042_pnp_exit(); 386 i8042_pnp_exit();
364#endif
365} 387}
366 388
367#endif /* _I8042_X86IA64IO_H */ 389#endif /* _I8042_X86IA64IO_H */
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
index 708a1d3beab9..40d451ce07ff 100644
--- a/drivers/input/serio/i8042.c
+++ b/drivers/input/serio/i8042.c
@@ -27,6 +27,10 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
27MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver"); 27MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver");
28MODULE_LICENSE("GPL"); 28MODULE_LICENSE("GPL");
29 29
30static unsigned int i8042_nokbd;
31module_param_named(nokbd, i8042_nokbd, bool, 0);
32MODULE_PARM_DESC(nokbd, "Do not probe or use KBD port.");
33
30static unsigned int i8042_noaux; 34static unsigned int i8042_noaux;
31module_param_named(noaux, i8042_noaux, bool, 0); 35module_param_named(noaux, i8042_noaux, bool, 0);
32MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); 36MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port.");
@@ -338,10 +342,10 @@ static int i8042_open(struct serio *serio)
338 342
339 return 0; 343 return 0;
340 344
341activate_fail: 345 activate_fail:
342 free_irq(port->irq, i8042_request_irq_cookie); 346 free_irq(port->irq, i8042_request_irq_cookie);
343 347
344irq_fail: 348 irq_fail:
345 serio_unregister_port_delayed(serio); 349 serio_unregister_port_delayed(serio);
346 350
347 return -1; 351 return -1;
@@ -485,7 +489,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id, struct pt_regs *regs)
485 serio_interrupt(port->serio, data, dfl, regs); 489 serio_interrupt(port->serio, data, dfl, regs);
486 490
487 ret = 1; 491 ret = 1;
488out: 492 out:
489 return IRQ_RETVAL(ret); 493 return IRQ_RETVAL(ret);
490} 494}
491 495
@@ -552,7 +556,7 @@ static int i8042_enable_mux_ports(void)
552 * Enable all muxed ports. 556 * Enable all muxed ports.
553 */ 557 */
554 558
555 for (i = 0; i < 4; i++) { 559 for (i = 0; i < I8042_NUM_MUX_PORTS; i++) {
556 i8042_command(&param, I8042_CMD_MUX_PFX + i); 560 i8042_command(&param, I8042_CMD_MUX_PFX + i);
557 i8042_command(&param, I8042_CMD_AUX_ENABLE); 561 i8042_command(&param, I8042_CMD_AUX_ENABLE);
558 } 562 }
@@ -682,7 +686,7 @@ static int __init i8042_port_register(struct i8042_port *port)
682 kfree(port->serio); 686 kfree(port->serio);
683 port->serio = NULL; 687 port->serio = NULL;
684 i8042_ctr |= port->disable; 688 i8042_ctr |= port->disable;
685 return -1; 689 return -EIO;
686 } 690 }
687 691
688 printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n", 692 printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n",
@@ -977,85 +981,88 @@ static struct device_driver i8042_driver = {
977 .shutdown = i8042_shutdown, 981 .shutdown = i8042_shutdown,
978}; 982};
979 983
980static void __init i8042_create_kbd_port(void) 984static int __init i8042_create_kbd_port(void)
981{ 985{
982 struct serio *serio; 986 struct serio *serio;
983 struct i8042_port *port = &i8042_ports[I8042_KBD_PORT_NO]; 987 struct i8042_port *port = &i8042_ports[I8042_KBD_PORT_NO];
984 988
985 serio = kmalloc(sizeof(struct serio), GFP_KERNEL); 989 serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
986 if (serio) { 990 if (!serio)
987 memset(serio, 0, sizeof(struct serio)); 991 return -ENOMEM;
988 serio->id.type = i8042_direct ? SERIO_8042 : SERIO_8042_XL; 992
989 serio->write = i8042_dumbkbd ? NULL : i8042_kbd_write; 993 serio->id.type = i8042_direct ? SERIO_8042 : SERIO_8042_XL;
990 serio->open = i8042_open; 994 serio->write = i8042_dumbkbd ? NULL : i8042_kbd_write;
991 serio->close = i8042_close; 995 serio->open = i8042_open;
992 serio->start = i8042_start; 996 serio->close = i8042_close;
993 serio->stop = i8042_stop; 997 serio->start = i8042_start;
994 serio->port_data = port; 998 serio->stop = i8042_stop;
995 serio->dev.parent = &i8042_platform_device->dev; 999 serio->port_data = port;
996 strlcpy(serio->name, "i8042 Kbd Port", sizeof(serio->name)); 1000 serio->dev.parent = &i8042_platform_device->dev;
997 strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); 1001 strlcpy(serio->name, "i8042 Kbd Port", sizeof(serio->name));
998 1002 strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys));
999 port->serio = serio; 1003
1000 i8042_port_register(port); 1004 port->serio = serio;
1001 } 1005
1006 return i8042_port_register(port);
1002} 1007}
1003 1008
1004static void __init i8042_create_aux_port(void) 1009static int __init i8042_create_aux_port(void)
1005{ 1010{
1006 struct serio *serio; 1011 struct serio *serio;
1007 struct i8042_port *port = &i8042_ports[I8042_AUX_PORT_NO]; 1012 struct i8042_port *port = &i8042_ports[I8042_AUX_PORT_NO];
1008 1013
1009 serio = kmalloc(sizeof(struct serio), GFP_KERNEL); 1014 serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
1010 if (serio) { 1015 if (!serio)
1011 memset(serio, 0, sizeof(struct serio)); 1016 return -ENOMEM;
1012 serio->id.type = SERIO_8042; 1017
1013 serio->write = i8042_aux_write; 1018 serio->id.type = SERIO_8042;
1014 serio->open = i8042_open; 1019 serio->write = i8042_aux_write;
1015 serio->close = i8042_close; 1020 serio->open = i8042_open;
1016 serio->start = i8042_start; 1021 serio->close = i8042_close;
1017 serio->stop = i8042_stop; 1022 serio->start = i8042_start;
1018 serio->port_data = port; 1023 serio->stop = i8042_stop;
1019 serio->dev.parent = &i8042_platform_device->dev; 1024 serio->port_data = port;
1020 strlcpy(serio->name, "i8042 Aux Port", sizeof(serio->name)); 1025 serio->dev.parent = &i8042_platform_device->dev;
1021 strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); 1026 strlcpy(serio->name, "i8042 Aux Port", sizeof(serio->name));
1022 1027 strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys));
1023 port->serio = serio; 1028
1024 i8042_port_register(port); 1029 port->serio = serio;
1025 } 1030
1031 return i8042_port_register(port);
1026} 1032}
1027 1033
1028static void __init i8042_create_mux_port(int index) 1034static int __init i8042_create_mux_port(int index)
1029{ 1035{
1030 struct serio *serio; 1036 struct serio *serio;
1031 struct i8042_port *port = &i8042_ports[I8042_MUX_PORT_NO + index]; 1037 struct i8042_port *port = &i8042_ports[I8042_MUX_PORT_NO + index];
1032 1038
1033 serio = kmalloc(sizeof(struct serio), GFP_KERNEL); 1039 serio = kzalloc(sizeof(struct serio), GFP_KERNEL);
1034 if (serio) { 1040 if (!serio)
1035 memset(serio, 0, sizeof(struct serio)); 1041 return -ENOMEM;
1036 serio->id.type = SERIO_8042; 1042
1037 serio->write = i8042_aux_write; 1043 serio->id.type = SERIO_8042;
1038 serio->open = i8042_open; 1044 serio->write = i8042_aux_write;
1039 serio->close = i8042_close; 1045 serio->open = i8042_open;
1040 serio->start = i8042_start; 1046 serio->close = i8042_close;
1041 serio->stop = i8042_stop; 1047 serio->start = i8042_start;
1042 serio->port_data = port; 1048 serio->stop = i8042_stop;
1043 serio->dev.parent = &i8042_platform_device->dev; 1049 serio->port_data = port;
1044 snprintf(serio->name, sizeof(serio->name), "i8042 Aux-%d Port", index); 1050 serio->dev.parent = &i8042_platform_device->dev;
1045 snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, index + 1); 1051 snprintf(serio->name, sizeof(serio->name), "i8042 Aux-%d Port", index);
1046 1052 snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, index + 1);
1047 *port = i8042_ports[I8042_AUX_PORT_NO]; 1053
1048 port->exists = 0; 1054 *port = i8042_ports[I8042_AUX_PORT_NO];
1049 snprintf(port->name, sizeof(port->name), "AUX%d", index); 1055 port->exists = 0;
1050 port->mux = index; 1056 snprintf(port->name, sizeof(port->name), "AUX%d", index);
1051 port->serio = serio; 1057 port->mux = index;
1052 i8042_port_register(port); 1058 port->serio = serio;
1053 } 1059
1060 return i8042_port_register(port);
1054} 1061}
1055 1062
1056static int __init i8042_init(void) 1063static int __init i8042_init(void)
1057{ 1064{
1058 int i; 1065 int i, have_ports = 0;
1059 int err; 1066 int err;
1060 1067
1061 dbg_init(); 1068 dbg_init();
@@ -1063,43 +1070,73 @@ static int __init i8042_init(void)
1063 init_timer(&i8042_timer); 1070 init_timer(&i8042_timer);
1064 i8042_timer.function = i8042_timer_func; 1071 i8042_timer.function = i8042_timer_func;
1065 1072
1066 if (i8042_platform_init()) 1073 err = i8042_platform_init();
1067 return -EBUSY; 1074 if (err)
1075 return err;
1068 1076
1069 i8042_ports[I8042_AUX_PORT_NO].irq = I8042_AUX_IRQ; 1077 i8042_ports[I8042_AUX_PORT_NO].irq = I8042_AUX_IRQ;
1070 i8042_ports[I8042_KBD_PORT_NO].irq = I8042_KBD_IRQ; 1078 i8042_ports[I8042_KBD_PORT_NO].irq = I8042_KBD_IRQ;
1071 1079
1072 if (i8042_controller_init()) { 1080 if (i8042_controller_init()) {
1073 i8042_platform_exit(); 1081 err = -ENODEV;
1074 return -ENODEV; 1082 goto err_platform_exit;
1075 } 1083 }
1076 1084
1077 err = driver_register(&i8042_driver); 1085 err = driver_register(&i8042_driver);
1078 if (err) { 1086 if (err)
1079 i8042_platform_exit(); 1087 goto err_controller_cleanup;
1080 return err;
1081 }
1082 1088
1083 i8042_platform_device = platform_device_register_simple("i8042", -1, NULL, 0); 1089 i8042_platform_device = platform_device_register_simple("i8042", -1, NULL, 0);
1084 if (IS_ERR(i8042_platform_device)) { 1090 if (IS_ERR(i8042_platform_device)) {
1085 driver_unregister(&i8042_driver); 1091 err = PTR_ERR(i8042_platform_device);
1086 i8042_platform_exit(); 1092 goto err_unregister_driver;
1087 return PTR_ERR(i8042_platform_device);
1088 } 1093 }
1089 1094
1090 if (!i8042_noaux && !i8042_check_aux()) { 1095 if (!i8042_noaux && !i8042_check_aux()) {
1091 if (!i8042_nomux && !i8042_check_mux()) 1096 if (!i8042_nomux && !i8042_check_mux()) {
1092 for (i = 0; i < I8042_NUM_MUX_PORTS; i++) 1097 for (i = 0; i < I8042_NUM_MUX_PORTS; i++) {
1093 i8042_create_mux_port(i); 1098 err = i8042_create_mux_port(i);
1094 else 1099 if (err)
1095 i8042_create_aux_port(); 1100 goto err_unregister_ports;
1101 }
1102 } else {
1103 err = i8042_create_aux_port();
1104 if (err)
1105 goto err_unregister_ports;
1106 }
1107 have_ports = 1;
1096 } 1108 }
1097 1109
1098 i8042_create_kbd_port(); 1110 if (!i8042_nokbd) {
1111 err = i8042_create_kbd_port();
1112 if (err)
1113 goto err_unregister_ports;
1114 have_ports = 1;
1115 }
1116
1117 if (!have_ports) {
1118 err = -ENODEV;
1119 goto err_unregister_device;
1120 }
1099 1121
1100 mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD); 1122 mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD);
1101 1123
1102 return 0; 1124 return 0;
1125
1126 err_unregister_ports:
1127 for (i = 0; i < I8042_NUM_PORTS; i++)
1128 if (i8042_ports[i].serio)
1129 serio_unregister_port(i8042_ports[i].serio);
1130 err_unregister_device:
1131 platform_device_unregister(i8042_platform_device);
1132 err_unregister_driver:
1133 driver_unregister(&i8042_driver);
1134 err_controller_cleanup:
1135 i8042_controller_cleanup();
1136 err_platform_exit:
1137 i8042_platform_exit();
1138
1139 return err;
1103} 1140}
1104 1141
1105static void __exit i8042_exit(void) 1142static void __exit i8042_exit(void)
diff --git a/drivers/isdn/i4l/isdn_bsdcomp.c b/drivers/isdn/i4l/isdn_bsdcomp.c
index baf4bcad9bf9..0afe442db3b0 100644
--- a/drivers/isdn/i4l/isdn_bsdcomp.c
+++ b/drivers/isdn/i4l/isdn_bsdcomp.c
@@ -283,23 +283,19 @@ static void bsd_free (void *state)
283 /* 283 /*
284 * Release the dictionary 284 * Release the dictionary
285 */ 285 */
286 if (db->dict) { 286 vfree(db->dict);
287 vfree (db->dict); 287 db->dict = NULL;
288 db->dict = NULL;
289 }
290 288
291 /* 289 /*
292 * Release the string buffer 290 * Release the string buffer
293 */ 291 */
294 if (db->lens) { 292 vfree(db->lens);
295 vfree (db->lens); 293 db->lens = NULL;
296 db->lens = NULL;
297 }
298 294
299 /* 295 /*
300 * Finally release the structure itself. 296 * Finally release the structure itself.
301 */ 297 */
302 kfree (db); 298 kfree(db);
303 } 299 }
304} 300}
305 301
diff --git a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c
index eebcb0b97f0e..8a7d54a5c97d 100644
--- a/drivers/isdn/i4l/isdn_common.c
+++ b/drivers/isdn/i4l/isdn_common.c
@@ -1953,7 +1953,8 @@ isdn_add_channels(isdn_driver_t *d, int drvidx, int n, int adding)
1953 kfree(d->rcvcount); 1953 kfree(d->rcvcount);
1954 if (!(d->rcvcount = kmalloc(sizeof(int) * m, GFP_ATOMIC))) { 1954 if (!(d->rcvcount = kmalloc(sizeof(int) * m, GFP_ATOMIC))) {
1955 printk(KERN_WARNING "register_isdn: Could not alloc rcvcount\n"); 1955 printk(KERN_WARNING "register_isdn: Could not alloc rcvcount\n");
1956 if (!adding) kfree(d->rcverr); 1956 if (!adding)
1957 kfree(d->rcverr);
1957 return -1; 1958 return -1;
1958 } 1959 }
1959 memset((char *) d->rcvcount, 0, sizeof(int) * m); 1960 memset((char *) d->rcvcount, 0, sizeof(int) * m);
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c
index 17212b4201a1..cc07bbebbb16 100644
--- a/drivers/md/dm-exception-store.c
+++ b/drivers/md/dm-exception-store.c
@@ -568,12 +568,9 @@ int dm_create_persistent(struct exception_store *store, uint32_t chunk_size)
568 568
569 bad: 569 bad:
570 dm_io_put(sectors_to_pages(chunk_size)); 570 dm_io_put(sectors_to_pages(chunk_size));
571 if (ps) { 571 if (ps && ps->area)
572 if (ps->area) 572 free_area(ps);
573 free_area(ps); 573 kfree(ps);
574
575 kfree(ps);
576 }
577 return r; 574 return r;
578} 575}
579 576
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 1554b924fbb9..2897df90df44 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -74,7 +74,7 @@ static DEFINE_SPINLOCK(pers_lock);
74 * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit' 74 * Current RAID-1,4,5 parallel reconstruction 'guaranteed speed limit'
75 * is 1000 KB/sec, so the extra system load does not show up that much. 75 * is 1000 KB/sec, so the extra system load does not show up that much.
76 * Increase it if you want to have more _guaranteed_ speed. Note that 76 * Increase it if you want to have more _guaranteed_ speed. Note that
77 * the RAID driver will use the maximum available bandwith if the IO 77 * the RAID driver will use the maximum available bandwidth if the IO
78 * subsystem is idle. There is also an 'absolute maximum' reconstruction 78 * subsystem is idle. There is also an 'absolute maximum' reconstruction
79 * speed limit - in case reconstruction slows down your system despite 79 * speed limit - in case reconstruction slows down your system despite
80 * idle IO detection. 80 * idle IO detection.
@@ -3616,7 +3616,7 @@ static void md_do_sync(mddev_t *mddev)
3616 printk(KERN_INFO "md: syncing RAID array %s\n", mdname(mddev)); 3616 printk(KERN_INFO "md: syncing RAID array %s\n", mdname(mddev));
3617 printk(KERN_INFO "md: minimum _guaranteed_ reconstruction speed:" 3617 printk(KERN_INFO "md: minimum _guaranteed_ reconstruction speed:"
3618 " %d KB/sec/disc.\n", sysctl_speed_limit_min); 3618 " %d KB/sec/disc.\n", sysctl_speed_limit_min);
3619 printk(KERN_INFO "md: using maximum available idle IO bandwith " 3619 printk(KERN_INFO "md: using maximum available idle IO bandwidth "
3620 "(but not more than %d KB/sec) for reconstruction.\n", 3620 "(but not more than %d KB/sec) for reconstruction.\n",
3621 sysctl_speed_limit_max); 3621 sysctl_speed_limit_max);
3622 3622
diff --git a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
index cd5828b5e9e3..206cc2f61f26 100644
--- a/drivers/media/common/saa7146_core.c
+++ b/drivers/media/common/saa7146_core.c
@@ -168,10 +168,8 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
168 return; 168 return;
169 pci_free_consistent(pci, pt->size, pt->cpu, pt->dma); 169 pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
170 pt->cpu = NULL; 170 pt->cpu = NULL;
171 if (NULL != pt->slist) { 171 kfree(pt->slist);
172 kfree(pt->slist); 172 pt->slist = NULL;
173 pt->slist = NULL;
174 }
175} 173}
176 174
177int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt) 175int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
diff --git a/drivers/media/video/cpia_usb.c b/drivers/media/video/cpia_usb.c
index cdda423386c5..9774e94d1e7d 100644
--- a/drivers/media/video/cpia_usb.c
+++ b/drivers/media/video/cpia_usb.c
@@ -445,10 +445,8 @@ static void cpia_usb_free_resources(struct usb_cpia *ucpia, int try)
445 ucpia->sbuf[1].urb = NULL; 445 ucpia->sbuf[1].urb = NULL;
446 } 446 }
447 447
448 if (ucpia->sbuf[1].data) { 448 kfree(ucpia->sbuf[1].data);
449 kfree(ucpia->sbuf[1].data); 449 ucpia->sbuf[1].data = NULL;
450 ucpia->sbuf[1].data = NULL;
451 }
452 450
453 if (ucpia->sbuf[0].urb) { 451 if (ucpia->sbuf[0].urb) {
454 usb_kill_urb(ucpia->sbuf[0].urb); 452 usb_kill_urb(ucpia->sbuf[0].urb);
@@ -456,10 +454,8 @@ static void cpia_usb_free_resources(struct usb_cpia *ucpia, int try)
456 ucpia->sbuf[0].urb = NULL; 454 ucpia->sbuf[0].urb = NULL;
457 } 455 }
458 456
459 if (ucpia->sbuf[0].data) { 457 kfree(ucpia->sbuf[0].data);
460 kfree(ucpia->sbuf[0].data); 458 ucpia->sbuf[0].data = NULL;
461 ucpia->sbuf[0].data = NULL;
462 }
463} 459}
464 460
465static int cpia_usb_close(void *privdata) 461static int cpia_usb_close(void *privdata)
@@ -623,20 +619,14 @@ static void cpia_disconnect(struct usb_interface *intf)
623 619
624 ucpia->curbuff = ucpia->workbuff = NULL; 620 ucpia->curbuff = ucpia->workbuff = NULL;
625 621
626 if (ucpia->buffers[2]) { 622 vfree(ucpia->buffers[2]);
627 vfree(ucpia->buffers[2]); 623 ucpia->buffers[2] = NULL;
628 ucpia->buffers[2] = NULL;
629 }
630 624
631 if (ucpia->buffers[1]) { 625 vfree(ucpia->buffers[1]);
632 vfree(ucpia->buffers[1]); 626 ucpia->buffers[1] = NULL;
633 ucpia->buffers[1] = NULL;
634 }
635 627
636 if (ucpia->buffers[0]) { 628 vfree(ucpia->buffers[0]);
637 vfree(ucpia->buffers[0]); 629 ucpia->buffers[0] = NULL;
638 ucpia->buffers[0] = NULL;
639 }
640 630
641 cam->lowlevel_data = NULL; 631 cam->lowlevel_data = NULL;
642 kfree(ucpia); 632 kfree(ucpia);
diff --git a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c
index b57743571087..d4497dbae05c 100644
--- a/drivers/media/video/stradis.c
+++ b/drivers/media/video/stradis.c
@@ -2184,30 +2184,18 @@ static void release_saa(void)
2184 vfree(saa->vidbuf); 2184 vfree(saa->vidbuf);
2185 vfree(saa->audbuf); 2185 vfree(saa->audbuf);
2186 vfree(saa->osdbuf); 2186 vfree(saa->osdbuf);
2187 if (saa->dmavid2) 2187 kfree(saa->dmavid2);
2188 kfree((void *) saa->dmavid2);
2189 saa->audbuf = saa->vidbuf = saa->osdbuf = NULL; 2188 saa->audbuf = saa->vidbuf = saa->osdbuf = NULL;
2190 saa->dmavid2 = NULL; 2189 saa->dmavid2 = NULL;
2191 if (saa->dmadebi) 2190 kfree(saa->dmadebi);
2192 kfree((void *) saa->dmadebi); 2191 kfree(saa->dmavid1);
2193 if (saa->dmavid1) 2192 kfree(saa->dmavid3);
2194 kfree((void *) saa->dmavid1); 2193 kfree(saa->dmaa1in);
2195 if (saa->dmavid2) 2194 kfree(saa->dmaa1out);
2196 kfree((void *) saa->dmavid2); 2195 kfree(saa->dmaa2in);
2197 if (saa->dmavid3) 2196 kfree(saa->dmaa2out);
2198 kfree((void *) saa->dmavid3); 2197 kfree(saa->dmaRPS1);
2199 if (saa->dmaa1in) 2198 kfree(saa->dmaRPS2);
2200 kfree((void *) saa->dmaa1in);
2201 if (saa->dmaa1out)
2202 kfree((void *) saa->dmaa1out);
2203 if (saa->dmaa2in)
2204 kfree((void *) saa->dmaa2in);
2205 if (saa->dmaa2out)
2206 kfree((void *) saa->dmaa2out);
2207 if (saa->dmaRPS1)
2208 kfree((void *) saa->dmaRPS1);
2209 if (saa->dmaRPS2)
2210 kfree((void *) saa->dmaRPS2);
2211 free_irq(saa->irq, saa); 2199 free_irq(saa->irq, saa);
2212 if (saa->saa7146_mem) 2200 if (saa->saa7146_mem)
2213 iounmap(saa->saa7146_mem); 2201 iounmap(saa->saa7146_mem);
diff --git a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c
index 97354f253a80..574b8e36f3c6 100644
--- a/drivers/media/video/video-buf.c
+++ b/drivers/media/video/video-buf.c
@@ -267,10 +267,10 @@ int videobuf_dma_free(struct videobuf_dmabuf *dma)
267 kfree(dma->pages); 267 kfree(dma->pages);
268 dma->pages = NULL; 268 dma->pages = NULL;
269 } 269 }
270 if (dma->vmalloc) { 270
271 vfree(dma->vmalloc); 271 vfree(dma->vmalloc);
272 dma->vmalloc = NULL; 272 dma->vmalloc = NULL;
273 } 273
274 if (dma->bus_addr) { 274 if (dma->bus_addr) {
275 dma->bus_addr = 0; 275 dma->bus_addr = 0;
276 } 276 }
diff --git a/drivers/media/video/zoran_driver.c b/drivers/media/video/zoran_driver.c
index ba838a42ec80..53adeb70f2ca 100644
--- a/drivers/media/video/zoran_driver.c
+++ b/drivers/media/video/zoran_driver.c
@@ -650,7 +650,7 @@ jpg_fbuffer_free (struct file *file)
650 off += PAGE_SIZE) 650 off += PAGE_SIZE)
651 ClearPageReserved(MAP_NR 651 ClearPageReserved(MAP_NR
652 (mem + off)); 652 (mem + off));
653 kfree((void *) mem); 653 kfree(mem);
654 fh->jpg_buffers.buffer[i].frag_tab[0] = 0; 654 fh->jpg_buffers.buffer[i].frag_tab[0] = 0;
655 fh->jpg_buffers.buffer[i].frag_tab[1] = 0; 655 fh->jpg_buffers.buffer[i].frag_tab[1] = 0;
656 } 656 }
diff --git a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c
index c33533155cc7..07286816d7df 100644
--- a/drivers/media/video/zr36120.c
+++ b/drivers/media/video/zr36120.c
@@ -820,11 +820,9 @@ void zoran_close(struct video_device* dev)
820 msleep(100); /* Wait 1/10th of a second */ 820 msleep(100); /* Wait 1/10th of a second */
821 821
822 /* free the allocated framebuffer */ 822 /* free the allocated framebuffer */
823 if (ztv->fbuffer) 823 bfree(ztv->fbuffer, ZORAN_MAX_FBUFSIZE);
824 bfree( ztv->fbuffer, ZORAN_MAX_FBUFSIZE );
825 ztv->fbuffer = 0; 824 ztv->fbuffer = 0;
826 if (ztv->overinfo.overlay) 825 kfree(ztv->overinfo.overlay);
827 kfree( ztv->overinfo.overlay );
828 ztv->overinfo.overlay = 0; 826 ztv->overinfo.overlay = 0;
829 827
830} 828}
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 1588a59e3767..550f29744812 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -13,4 +13,13 @@ config MCP_SA11X0
13 depends on ARCH_SA1100 13 depends on ARCH_SA1100
14 select MCP 14 select MCP
15 15
16# Chip drivers
17config MCP_UCB1200
18 tristate "Support for UCB1200 / UCB1300"
19 depends on MCP
20
21config MCP_UCB1200_TS
22 tristate "Touchscreen interface support"
23 depends on MCP_UCB1200 && INPUT
24
16endmenu 25endmenu
diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
index 98bdd6a42188..adb29b5368a8 100644
--- a/drivers/mfd/Makefile
+++ b/drivers/mfd/Makefile
@@ -4,3 +4,9 @@
4 4
5obj-$(CONFIG_MCP) += mcp-core.o 5obj-$(CONFIG_MCP) += mcp-core.o
6obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o 6obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o
7obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o
8obj-$(CONFIG_MCP_UCB1200_TS) += ucb1x00-ts.o
9
10ifeq ($(CONFIG_SA1100_ASSABET),y)
11obj-$(CONFIG_MCP_UCB1200) += ucb1x00-assabet.o
12endif
diff --git a/drivers/mfd/ucb1x00-assabet.c b/drivers/mfd/ucb1x00-assabet.c
new file mode 100644
index 000000000000..e325fa71f38b
--- /dev/null
+++ b/drivers/mfd/ucb1x00-assabet.c
@@ -0,0 +1,73 @@
1/*
2 * linux/drivers/mfd/ucb1x00-assabet.c
3 *
4 * Copyright (C) 2001-2003 Russell King, All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License.
9 *
10 * We handle the machine-specific bits of the UCB1x00 driver here.
11 */
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/fs.h>
15#include <linux/proc_fs.h>
16#include <linux/device.h>
17
18#include <asm/dma.h>
19
20#include "ucb1x00.h"
21
22#define UCB1X00_ATTR(name,input)\
23static ssize_t name##_show(struct class_device *dev, char *buf) \
24{ \
25 struct ucb1x00 *ucb = classdev_to_ucb1x00(dev); \
26 int val; \
27 ucb1x00_adc_enable(ucb); \
28 val = ucb1x00_adc_read(ucb, input, UCB_NOSYNC); \
29 ucb1x00_adc_disable(ucb); \
30 return sprintf(buf, "%d\n", val); \
31} \
32static CLASS_DEVICE_ATTR(name,0444,name##_show,NULL)
33
34UCB1X00_ATTR(vbatt, UCB_ADC_INP_AD1);
35UCB1X00_ATTR(vcharger, UCB_ADC_INP_AD0);
36UCB1X00_ATTR(batt_temp, UCB_ADC_INP_AD2);
37
38static int ucb1x00_assabet_add(struct ucb1x00_dev *dev)
39{
40 class_device_create_file(&dev->ucb->cdev, &class_device_attr_vbatt);
41 class_device_create_file(&dev->ucb->cdev, &class_device_attr_vcharger);
42 class_device_create_file(&dev->ucb->cdev, &class_device_attr_batt_temp);
43 return 0;
44}
45
46static void ucb1x00_assabet_remove(struct ucb1x00_dev *dev)
47{
48 class_device_remove_file(&dev->ucb->cdev, &class_device_attr_batt_temp);
49 class_device_remove_file(&dev->ucb->cdev, &class_device_attr_vcharger);
50 class_device_remove_file(&dev->ucb->cdev, &class_device_attr_vbatt);
51}
52
53static struct ucb1x00_driver ucb1x00_assabet_driver = {
54 .add = ucb1x00_assabet_add,
55 .remove = ucb1x00_assabet_remove,
56};
57
58static int __init ucb1x00_assabet_init(void)
59{
60 return ucb1x00_register_driver(&ucb1x00_assabet_driver);
61}
62
63static void __exit ucb1x00_assabet_exit(void)
64{
65 ucb1x00_unregister_driver(&ucb1x00_assabet_driver);
66}
67
68module_init(ucb1x00_assabet_init);
69module_exit(ucb1x00_assabet_exit);
70
71MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
72MODULE_DESCRIPTION("Assabet noddy testing only example ADC driver");
73MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c
new file mode 100644
index 000000000000..10f6ce1bc0ab
--- /dev/null
+++ b/drivers/mfd/ucb1x00-core.c
@@ -0,0 +1,665 @@
1/*
2 * linux/drivers/mfd/ucb1x00-core.c
3 *
4 * Copyright (C) 2001 Russell King, All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License.
9 *
10 * The UCB1x00 core driver provides basic services for handling IO,
11 * the ADC, interrupts, and accessing registers. It is designed
12 * such that everything goes through this layer, thereby providing
13 * a consistent locking methodology, as well as allowing the drivers
14 * to be used on other non-MCP-enabled hardware platforms.
15 *
16 * Note that all locks are private to this file. Nothing else may
17 * touch them.
18 */
19#include <linux/config.h>
20#include <linux/module.h>
21#include <linux/kernel.h>
22#include <linux/slab.h>
23#include <linux/init.h>
24#include <linux/errno.h>
25#include <linux/interrupt.h>
26#include <linux/device.h>
27
28#include <asm/dma.h>
29#include <asm/hardware.h>
30#include <asm/irq.h>
31
32#include "ucb1x00.h"
33
34static DECLARE_MUTEX(ucb1x00_sem);
35static LIST_HEAD(ucb1x00_drivers);
36static LIST_HEAD(ucb1x00_devices);
37
38/**
39 * ucb1x00_io_set_dir - set IO direction
40 * @ucb: UCB1x00 structure describing chip
41 * @in: bitfield of IO pins to be set as inputs
42 * @out: bitfield of IO pins to be set as outputs
43 *
44 * Set the IO direction of the ten general purpose IO pins on
45 * the UCB1x00 chip. The @in bitfield has priority over the
46 * @out bitfield, in that if you specify a pin as both input
47 * and output, it will end up as an input.
48 *
49 * ucb1x00_enable must have been called to enable the comms
50 * before using this function.
51 *
52 * This function takes a spinlock, disabling interrupts.
53 */
54void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int in, unsigned int out)
55{
56 unsigned long flags;
57
58 spin_lock_irqsave(&ucb->io_lock, flags);
59 ucb->io_dir |= out;
60 ucb->io_dir &= ~in;
61
62 ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
63 spin_unlock_irqrestore(&ucb->io_lock, flags);
64}
65
66/**
67 * ucb1x00_io_write - set or clear IO outputs
68 * @ucb: UCB1x00 structure describing chip
69 * @set: bitfield of IO pins to set to logic '1'
70 * @clear: bitfield of IO pins to set to logic '0'
71 *
72 * Set the IO output state of the specified IO pins. The value
73 * is retained if the pins are subsequently configured as inputs.
74 * The @clear bitfield has priority over the @set bitfield -
75 * outputs will be cleared.
76 *
77 * ucb1x00_enable must have been called to enable the comms
78 * before using this function.
79 *
80 * This function takes a spinlock, disabling interrupts.
81 */
82void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int set, unsigned int clear)
83{
84 unsigned long flags;
85
86 spin_lock_irqsave(&ucb->io_lock, flags);
87 ucb->io_out |= set;
88 ucb->io_out &= ~clear;
89
90 ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out);
91 spin_unlock_irqrestore(&ucb->io_lock, flags);
92}
93
94/**
95 * ucb1x00_io_read - read the current state of the IO pins
96 * @ucb: UCB1x00 structure describing chip
97 *
98 * Return a bitfield describing the logic state of the ten
99 * general purpose IO pins.
100 *
101 * ucb1x00_enable must have been called to enable the comms
102 * before using this function.
103 *
104 * This function does not take any semaphores or spinlocks.
105 */
106unsigned int ucb1x00_io_read(struct ucb1x00 *ucb)
107{
108 return ucb1x00_reg_read(ucb, UCB_IO_DATA);
109}
110
111/*
112 * UCB1300 data sheet says we must:
113 * 1. enable ADC => 5us (including reference startup time)
114 * 2. select input => 51*tsibclk => 4.3us
115 * 3. start conversion => 102*tsibclk => 8.5us
116 * (tsibclk = 1/11981000)
117 * Period between SIB 128-bit frames = 10.7us
118 */
119
120/**
121 * ucb1x00_adc_enable - enable the ADC converter
122 * @ucb: UCB1x00 structure describing chip
123 *
124 * Enable the ucb1x00 and ADC converter on the UCB1x00 for use.
125 * Any code wishing to use the ADC converter must call this
126 * function prior to using it.
127 *
128 * This function takes the ADC semaphore to prevent two or more
129 * concurrent uses, and therefore may sleep. As a result, it
130 * can only be called from process context, not interrupt
131 * context.
132 *
133 * You should release the ADC as soon as possible using
134 * ucb1x00_adc_disable.
135 */
136void ucb1x00_adc_enable(struct ucb1x00 *ucb)
137{
138 down(&ucb->adc_sem);
139
140 ucb->adc_cr |= UCB_ADC_ENA;
141
142 ucb1x00_enable(ucb);
143 ucb1x00_reg_write(ucb, UCB_ADC_CR, ucb->adc_cr);
144}
145
146/**
147 * ucb1x00_adc_read - read the specified ADC channel
148 * @ucb: UCB1x00 structure describing chip
149 * @adc_channel: ADC channel mask
150 * @sync: wait for syncronisation pulse.
151 *
152 * Start an ADC conversion and wait for the result. Note that
153 * synchronised ADC conversions (via the ADCSYNC pin) must wait
154 * until the trigger is asserted and the conversion is finished.
155 *
156 * This function currently spins waiting for the conversion to
157 * complete (2 frames max without sync).
158 *
159 * If called for a synchronised ADC conversion, it may sleep
160 * with the ADC semaphore held.
161 */
162unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync)
163{
164 unsigned int val;
165
166 if (sync)
167 adc_channel |= UCB_ADC_SYNC_ENA;
168
169 ucb1x00_reg_write(ucb, UCB_ADC_CR, ucb->adc_cr | adc_channel);
170 ucb1x00_reg_write(ucb, UCB_ADC_CR, ucb->adc_cr | adc_channel | UCB_ADC_START);
171
172 for (;;) {
173 val = ucb1x00_reg_read(ucb, UCB_ADC_DATA);
174 if (val & UCB_ADC_DAT_VAL)
175 break;
176 /* yield to other processes */
177 set_current_state(TASK_INTERRUPTIBLE);
178 schedule_timeout(1);
179 }
180
181 return UCB_ADC_DAT(val);
182}
183
184/**
185 * ucb1x00_adc_disable - disable the ADC converter
186 * @ucb: UCB1x00 structure describing chip
187 *
188 * Disable the ADC converter and release the ADC semaphore.
189 */
190void ucb1x00_adc_disable(struct ucb1x00 *ucb)
191{
192 ucb->adc_cr &= ~UCB_ADC_ENA;
193 ucb1x00_reg_write(ucb, UCB_ADC_CR, ucb->adc_cr);
194 ucb1x00_disable(ucb);
195
196 up(&ucb->adc_sem);
197}
198
199/*
200 * UCB1x00 Interrupt handling.
201 *
202 * The UCB1x00 can generate interrupts when the SIBCLK is stopped.
203 * Since we need to read an internal register, we must re-enable
204 * SIBCLK to talk to the chip. We leave the clock running until
205 * we have finished processing all interrupts from the chip.
206 */
207static irqreturn_t ucb1x00_irq(int irqnr, void *devid, struct pt_regs *regs)
208{
209 struct ucb1x00 *ucb = devid;
210 struct ucb1x00_irq *irq;
211 unsigned int isr, i;
212
213 ucb1x00_enable(ucb);
214 isr = ucb1x00_reg_read(ucb, UCB_IE_STATUS);
215 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, isr);
216 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0);
217
218 for (i = 0, irq = ucb->irq_handler; i < 16 && isr; i++, isr >>= 1, irq++)
219 if (isr & 1 && irq->fn)
220 irq->fn(i, irq->devid);
221 ucb1x00_disable(ucb);
222
223 return IRQ_HANDLED;
224}
225
226/**
227 * ucb1x00_hook_irq - hook a UCB1x00 interrupt
228 * @ucb: UCB1x00 structure describing chip
229 * @idx: interrupt index
230 * @fn: function to call when interrupt is triggered
231 * @devid: device id to pass to interrupt handler
232 *
233 * Hook the specified interrupt. You can only register one handler
234 * for each interrupt source. The interrupt source is not enabled
235 * by this function; use ucb1x00_enable_irq instead.
236 *
237 * Interrupt handlers will be called with other interrupts enabled.
238 *
239 * Returns zero on success, or one of the following errors:
240 * -EINVAL if the interrupt index is invalid
241 * -EBUSY if the interrupt has already been hooked
242 */
243int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid)
244{
245 struct ucb1x00_irq *irq;
246 int ret = -EINVAL;
247
248 if (idx < 16) {
249 irq = ucb->irq_handler + idx;
250 ret = -EBUSY;
251
252 spin_lock_irq(&ucb->lock);
253 if (irq->fn == NULL) {
254 irq->devid = devid;
255 irq->fn = fn;
256 ret = 0;
257 }
258 spin_unlock_irq(&ucb->lock);
259 }
260 return ret;
261}
262
263/**
264 * ucb1x00_enable_irq - enable an UCB1x00 interrupt source
265 * @ucb: UCB1x00 structure describing chip
266 * @idx: interrupt index
267 * @edges: interrupt edges to enable
268 *
269 * Enable the specified interrupt to trigger on %UCB_RISING,
270 * %UCB_FALLING or both edges. The interrupt should have been
271 * hooked by ucb1x00_hook_irq.
272 */
273void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges)
274{
275 unsigned long flags;
276
277 if (idx < 16) {
278 spin_lock_irqsave(&ucb->lock, flags);
279
280 ucb1x00_enable(ucb);
281 if (edges & UCB_RISING) {
282 ucb->irq_ris_enbl |= 1 << idx;
283 ucb1x00_reg_write(ucb, UCB_IE_RIS, ucb->irq_ris_enbl);
284 }
285 if (edges & UCB_FALLING) {
286 ucb->irq_fal_enbl |= 1 << idx;
287 ucb1x00_reg_write(ucb, UCB_IE_FAL, ucb->irq_fal_enbl);
288 }
289 ucb1x00_disable(ucb);
290 spin_unlock_irqrestore(&ucb->lock, flags);
291 }
292}
293
294/**
295 * ucb1x00_disable_irq - disable an UCB1x00 interrupt source
296 * @ucb: UCB1x00 structure describing chip
297 * @edges: interrupt edges to disable
298 *
299 * Disable the specified interrupt triggering on the specified
300 * (%UCB_RISING, %UCB_FALLING or both) edges.
301 */
302void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges)
303{
304 unsigned long flags;
305
306 if (idx < 16) {
307 spin_lock_irqsave(&ucb->lock, flags);
308
309 ucb1x00_enable(ucb);
310 if (edges & UCB_RISING) {
311 ucb->irq_ris_enbl &= ~(1 << idx);
312 ucb1x00_reg_write(ucb, UCB_IE_RIS, ucb->irq_ris_enbl);
313 }
314 if (edges & UCB_FALLING) {
315 ucb->irq_fal_enbl &= ~(1 << idx);
316 ucb1x00_reg_write(ucb, UCB_IE_FAL, ucb->irq_fal_enbl);
317 }
318 ucb1x00_disable(ucb);
319 spin_unlock_irqrestore(&ucb->lock, flags);
320 }
321}
322
323/**
324 * ucb1x00_free_irq - disable and free the specified UCB1x00 interrupt
325 * @ucb: UCB1x00 structure describing chip
326 * @idx: interrupt index
327 * @devid: device id.
328 *
329 * Disable the interrupt source and remove the handler. devid must
330 * match the devid passed when hooking the interrupt.
331 *
332 * Returns zero on success, or one of the following errors:
333 * -EINVAL if the interrupt index is invalid
334 * -ENOENT if devid does not match
335 */
336int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid)
337{
338 struct ucb1x00_irq *irq;
339 int ret;
340
341 if (idx >= 16)
342 goto bad;
343
344 irq = ucb->irq_handler + idx;
345 ret = -ENOENT;
346
347 spin_lock_irq(&ucb->lock);
348 if (irq->devid == devid) {
349 ucb->irq_ris_enbl &= ~(1 << idx);
350 ucb->irq_fal_enbl &= ~(1 << idx);
351
352 ucb1x00_enable(ucb);
353 ucb1x00_reg_write(ucb, UCB_IE_RIS, ucb->irq_ris_enbl);
354 ucb1x00_reg_write(ucb, UCB_IE_FAL, ucb->irq_fal_enbl);
355 ucb1x00_disable(ucb);
356
357 irq->fn = NULL;
358 irq->devid = NULL;
359 ret = 0;
360 }
361 spin_unlock_irq(&ucb->lock);
362 return ret;
363
364bad:
365 printk(KERN_ERR "Freeing bad UCB1x00 irq %d\n", idx);
366 return -EINVAL;
367}
368
369static int ucb1x00_add_dev(struct ucb1x00 *ucb, struct ucb1x00_driver *drv)
370{
371 struct ucb1x00_dev *dev;
372 int ret = -ENOMEM;
373
374 dev = kmalloc(sizeof(struct ucb1x00_dev), GFP_KERNEL);
375 if (dev) {
376 dev->ucb = ucb;
377 dev->drv = drv;
378
379 ret = drv->add(dev);
380
381 if (ret == 0) {
382 list_add(&dev->dev_node, &ucb->devs);
383 list_add(&dev->drv_node, &drv->devs);
384 } else {
385 kfree(dev);
386 }
387 }
388 return ret;
389}
390
391static void ucb1x00_remove_dev(struct ucb1x00_dev *dev)
392{
393 dev->drv->remove(dev);
394 list_del(&dev->dev_node);
395 list_del(&dev->drv_node);
396 kfree(dev);
397}
398
399/*
400 * Try to probe our interrupt, rather than relying on lots of
401 * hard-coded machine dependencies. For reference, the expected
402 * IRQ mappings are:
403 *
404 * Machine Default IRQ
405 * adsbitsy IRQ_GPCIN4
406 * cerf IRQ_GPIO_UCB1200_IRQ
407 * flexanet IRQ_GPIO_GUI
408 * freebird IRQ_GPIO_FREEBIRD_UCB1300_IRQ
409 * graphicsclient ADS_EXT_IRQ(8)
410 * graphicsmaster ADS_EXT_IRQ(8)
411 * lart LART_IRQ_UCB1200
412 * omnimeter IRQ_GPIO23
413 * pfs168 IRQ_GPIO_UCB1300_IRQ
414 * simpad IRQ_GPIO_UCB1300_IRQ
415 * shannon SHANNON_IRQ_GPIO_IRQ_CODEC
416 * yopy IRQ_GPIO_UCB1200_IRQ
417 */
418static int ucb1x00_detect_irq(struct ucb1x00 *ucb)
419{
420 unsigned long mask;
421
422 mask = probe_irq_on();
423 if (!mask)
424 return NO_IRQ;
425
426 /*
427 * Enable the ADC interrupt.
428 */
429 ucb1x00_reg_write(ucb, UCB_IE_RIS, UCB_IE_ADC);
430 ucb1x00_reg_write(ucb, UCB_IE_FAL, UCB_IE_ADC);
431 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0xffff);
432 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0);
433
434 /*
435 * Cause an ADC interrupt.
436 */
437 ucb1x00_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA);
438 ucb1x00_reg_write(ucb, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START);
439
440 /*
441 * Wait for the conversion to complete.
442 */
443 while ((ucb1x00_reg_read(ucb, UCB_ADC_DATA) & UCB_ADC_DAT_VAL) == 0);
444 ucb1x00_reg_write(ucb, UCB_ADC_CR, 0);
445
446 /*
447 * Disable and clear interrupt.
448 */
449 ucb1x00_reg_write(ucb, UCB_IE_RIS, 0);
450 ucb1x00_reg_write(ucb, UCB_IE_FAL, 0);
451 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0xffff);
452 ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0);
453
454 /*
455 * Read triggered interrupt.
456 */
457 return probe_irq_off(mask);
458}
459
460static int ucb1x00_probe(struct mcp *mcp)
461{
462 struct ucb1x00 *ucb;
463 struct ucb1x00_driver *drv;
464 unsigned int id;
465 int ret = -ENODEV;
466
467 mcp_enable(mcp);
468 id = mcp_reg_read(mcp, UCB_ID);
469
470 if (id != UCB_ID_1200 && id != UCB_ID_1300) {
471 printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id);
472 goto err_disable;
473 }
474
475 ucb = kmalloc(sizeof(struct ucb1x00), GFP_KERNEL);
476 ret = -ENOMEM;
477 if (!ucb)
478 goto err_disable;
479
480 memset(ucb, 0, sizeof(struct ucb1x00));
481
482 ucb->cdev.class = &ucb1x00_class;
483 ucb->cdev.dev = &mcp->attached_device;
484 strlcpy(ucb->cdev.class_id, "ucb1x00", sizeof(ucb->cdev.class_id));
485
486 spin_lock_init(&ucb->lock);
487 spin_lock_init(&ucb->io_lock);
488 sema_init(&ucb->adc_sem, 1);
489
490 ucb->id = id;
491 ucb->mcp = mcp;
492 ucb->irq = ucb1x00_detect_irq(ucb);
493 if (ucb->irq == NO_IRQ) {
494 printk(KERN_ERR "UCB1x00: IRQ probe failed\n");
495 ret = -ENODEV;
496 goto err_free;
497 }
498
499 ret = request_irq(ucb->irq, ucb1x00_irq, 0, "UCB1x00", ucb);
500 if (ret) {
501 printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n",
502 ucb->irq, ret);
503 goto err_free;
504 }
505
506 set_irq_type(ucb->irq, IRQT_RISING);
507 mcp_set_drvdata(mcp, ucb);
508
509 ret = class_device_register(&ucb->cdev);
510 if (ret)
511 goto err_irq;
512
513 INIT_LIST_HEAD(&ucb->devs);
514 down(&ucb1x00_sem);
515 list_add(&ucb->node, &ucb1x00_devices);
516 list_for_each_entry(drv, &ucb1x00_drivers, node) {
517 ucb1x00_add_dev(ucb, drv);
518 }
519 up(&ucb1x00_sem);
520 goto out;
521
522 err_irq:
523 free_irq(ucb->irq, ucb);
524 err_free:
525 kfree(ucb);
526 err_disable:
527 mcp_disable(mcp);
528 out:
529 return ret;
530}
531
532static void ucb1x00_remove(struct mcp *mcp)
533{
534 struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
535 struct list_head *l, *n;
536
537 down(&ucb1x00_sem);
538 list_del(&ucb->node);
539 list_for_each_safe(l, n, &ucb->devs) {
540 struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, dev_node);
541 ucb1x00_remove_dev(dev);
542 }
543 up(&ucb1x00_sem);
544
545 free_irq(ucb->irq, ucb);
546 class_device_unregister(&ucb->cdev);
547}
548
549static void ucb1x00_release(struct class_device *dev)
550{
551 struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
552 kfree(ucb);
553}
554
555static struct class ucb1x00_class = {
556 .name = "ucb1x00",
557 .release = ucb1x00_release,
558};
559
560int ucb1x00_register_driver(struct ucb1x00_driver *drv)
561{
562 struct ucb1x00 *ucb;
563
564 INIT_LIST_HEAD(&drv->devs);
565 down(&ucb1x00_sem);
566 list_add(&drv->node, &ucb1x00_drivers);
567 list_for_each_entry(ucb, &ucb1x00_devices, node) {
568 ucb1x00_add_dev(ucb, drv);
569 }
570 up(&ucb1x00_sem);
571 return 0;
572}
573
574void ucb1x00_unregister_driver(struct ucb1x00_driver *drv)
575{
576 struct list_head *n, *l;
577
578 down(&ucb1x00_sem);
579 list_del(&drv->node);
580 list_for_each_safe(l, n, &drv->devs) {
581 struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, drv_node);
582 ucb1x00_remove_dev(dev);
583 }
584 up(&ucb1x00_sem);
585}
586
587static int ucb1x00_suspend(struct mcp *mcp, pm_message_t state)
588{
589 struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
590 struct ucb1x00_dev *dev;
591
592 down(&ucb1x00_sem);
593 list_for_each_entry(dev, &ucb->devs, dev_node) {
594 if (dev->drv->suspend)
595 dev->drv->suspend(dev, state);
596 }
597 up(&ucb1x00_sem);
598 return 0;
599}
600
601static int ucb1x00_resume(struct mcp *mcp)
602{
603 struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
604 struct ucb1x00_dev *dev;
605
606 down(&ucb1x00_sem);
607 list_for_each_entry(dev, &ucb->devs, dev_node) {
608 if (dev->drv->resume)
609 dev->drv->resume(dev);
610 }
611 up(&ucb1x00_sem);
612 return 0;
613}
614
615static struct mcp_driver ucb1x00_driver = {
616 .drv = {
617 .name = "ucb1x00",
618 },
619 .probe = ucb1x00_probe,
620 .remove = ucb1x00_remove,
621 .suspend = ucb1x00_suspend,
622 .resume = ucb1x00_resume,
623};
624
625static int __init ucb1x00_init(void)
626{
627 int ret = class_register(&ucb1x00_class);
628 if (ret == 0) {
629 ret = mcp_driver_register(&ucb1x00_driver);
630 if (ret)
631 class_unregister(&ucb1x00_class);
632 }
633 return ret;
634}
635
636static void __exit ucb1x00_exit(void)
637{
638 mcp_driver_unregister(&ucb1x00_driver);
639 class_unregister(&ucb1x00_class);
640}
641
642module_init(ucb1x00_init);
643module_exit(ucb1x00_exit);
644
645EXPORT_SYMBOL(ucb1x00_class);
646
647EXPORT_SYMBOL(ucb1x00_io_set_dir);
648EXPORT_SYMBOL(ucb1x00_io_write);
649EXPORT_SYMBOL(ucb1x00_io_read);
650
651EXPORT_SYMBOL(ucb1x00_adc_enable);
652EXPORT_SYMBOL(ucb1x00_adc_read);
653EXPORT_SYMBOL(ucb1x00_adc_disable);
654
655EXPORT_SYMBOL(ucb1x00_hook_irq);
656EXPORT_SYMBOL(ucb1x00_free_irq);
657EXPORT_SYMBOL(ucb1x00_enable_irq);
658EXPORT_SYMBOL(ucb1x00_disable_irq);
659
660EXPORT_SYMBOL(ucb1x00_register_driver);
661EXPORT_SYMBOL(ucb1x00_unregister_driver);
662
663MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
664MODULE_DESCRIPTION("UCB1x00 core driver");
665MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c
new file mode 100644
index 000000000000..a851d65c7cfe
--- /dev/null
+++ b/drivers/mfd/ucb1x00-ts.c
@@ -0,0 +1,399 @@
1/*
2 * Touchscreen driver for UCB1x00-based touchscreens
3 *
4 * Copyright (C) 2001 Russell King, All Rights Reserved.
5 * Copyright (C) 2005 Pavel Machek
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * 21-Jan-2002 <jco@ict.es> :
12 *
13 * Added support for synchronous A/D mode. This mode is useful to
14 * avoid noise induced in the touchpanel by the LCD, provided that
15 * the UCB1x00 has a valid LCD sync signal routed to its ADCSYNC pin.
16 * It is important to note that the signal connected to the ADCSYNC
17 * pin should provide pulses even when the LCD is blanked, otherwise
18 * a pen touch needed to unblank the LCD will never be read.
19 */
20#include <linux/config.h>
21#include <linux/module.h>
22#include <linux/moduleparam.h>
23#include <linux/init.h>
24#include <linux/smp.h>
25#include <linux/smp_lock.h>
26#include <linux/sched.h>
27#include <linux/completion.h>
28#include <linux/delay.h>
29#include <linux/string.h>
30#include <linux/input.h>
31#include <linux/device.h>
32#include <linux/suspend.h>
33#include <linux/slab.h>
34#include <linux/kthread.h>
35
36#include <asm/dma.h>
37#include <asm/semaphore.h>
38
39#include "ucb1x00.h"
40
41
42struct ucb1x00_ts {
43 struct input_dev idev;
44 struct ucb1x00 *ucb;
45
46 wait_queue_head_t irq_wait;
47 struct task_struct *rtask;
48 u16 x_res;
49 u16 y_res;
50
51 int restart:1;
52 int adcsync:1;
53};
54
55static int adcsync;
56
57static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y)
58{
59 input_report_abs(&ts->idev, ABS_X, x);
60 input_report_abs(&ts->idev, ABS_Y, y);
61 input_report_abs(&ts->idev, ABS_PRESSURE, pressure);
62 input_sync(&ts->idev);
63}
64
65static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts)
66{
67 input_report_abs(&ts->idev, ABS_PRESSURE, 0);
68 input_sync(&ts->idev);
69}
70
71/*
72 * Switch to interrupt mode.
73 */
74static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts)
75{
76 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
77 UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW |
78 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND |
79 UCB_TS_CR_MODE_INT);
80}
81
82/*
83 * Switch to pressure mode, and read pressure. We don't need to wait
84 * here, since both plates are being driven.
85 */
86static inline unsigned int ucb1x00_ts_read_pressure(struct ucb1x00_ts *ts)
87{
88 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
89 UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW |
90 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND |
91 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
92
93 return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync);
94}
95
96/*
97 * Switch to X position mode and measure Y plate. We switch the plate
98 * configuration in pressure mode, then switch to position mode. This
99 * gives a faster response time. Even so, we need to wait about 55us
100 * for things to stabilise.
101 */
102static inline unsigned int ucb1x00_ts_read_xpos(struct ucb1x00_ts *ts)
103{
104 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
105 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
106 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
107 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
108 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
109 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
110 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
111 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
112 UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
113
114 udelay(55);
115
116 return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync);
117}
118
119/*
120 * Switch to Y position mode and measure X plate. We switch the plate
121 * configuration in pressure mode, then switch to position mode. This
122 * gives a faster response time. Even so, we need to wait about 55us
123 * for things to stabilise.
124 */
125static inline unsigned int ucb1x00_ts_read_ypos(struct ucb1x00_ts *ts)
126{
127 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
128 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
129 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
130 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
131 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
132 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
133 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
134 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
135 UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
136
137 udelay(55);
138
139 return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPX, ts->adcsync);
140}
141
142/*
143 * Switch to X plate resistance mode. Set MX to ground, PX to
144 * supply. Measure current.
145 */
146static inline unsigned int ucb1x00_ts_read_xres(struct ucb1x00_ts *ts)
147{
148 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
149 UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
150 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
151 return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync);
152}
153
154/*
155 * Switch to Y plate resistance mode. Set MY to ground, PY to
156 * supply. Measure current.
157 */
158static inline unsigned int ucb1x00_ts_read_yres(struct ucb1x00_ts *ts)
159{
160 ucb1x00_reg_write(ts->ucb, UCB_TS_CR,
161 UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
162 UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
163 return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync);
164}
165
166/*
167 * This is a RT kernel thread that handles the ADC accesses
168 * (mainly so we can use semaphores in the UCB1200 core code
169 * to serialise accesses to the ADC).
170 */
171static int ucb1x00_thread(void *_ts)
172{
173 struct ucb1x00_ts *ts = _ts;
174 struct task_struct *tsk = current;
175 DECLARE_WAITQUEUE(wait, tsk);
176 int valid;
177
178 /*
179 * We could run as a real-time thread. However, thus far
180 * this doesn't seem to be necessary.
181 */
182// tsk->policy = SCHED_FIFO;
183// tsk->rt_priority = 1;
184
185 valid = 0;
186
187 add_wait_queue(&ts->irq_wait, &wait);
188 while (!kthread_should_stop()) {
189 unsigned int x, y, p, val;
190 signed long timeout;
191
192 ts->restart = 0;
193
194 ucb1x00_adc_enable(ts->ucb);
195
196 x = ucb1x00_ts_read_xpos(ts);
197 y = ucb1x00_ts_read_ypos(ts);
198 p = ucb1x00_ts_read_pressure(ts);
199
200 /*
201 * Switch back to interrupt mode.
202 */
203 ucb1x00_ts_mode_int(ts);
204 ucb1x00_adc_disable(ts->ucb);
205
206 msleep(10);
207
208 ucb1x00_enable(ts->ucb);
209 val = ucb1x00_reg_read(ts->ucb, UCB_TS_CR);
210
211 if (val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW)) {
212 set_task_state(tsk, TASK_INTERRUPTIBLE);
213
214 ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING);
215 ucb1x00_disable(ts->ucb);
216
217 /*
218 * If we spat out a valid sample set last time,
219 * spit out a "pen off" sample here.
220 */
221 if (valid) {
222 ucb1x00_ts_event_release(ts);
223 valid = 0;
224 }
225
226 timeout = MAX_SCHEDULE_TIMEOUT;
227 } else {
228 ucb1x00_disable(ts->ucb);
229
230 /*
231 * Filtering is policy. Policy belongs in user
232 * space. We therefore leave it to user space
233 * to do any filtering they please.
234 */
235 if (!ts->restart) {
236 ucb1x00_ts_evt_add(ts, p, x, y);
237 valid = 1;
238 }
239
240 set_task_state(tsk, TASK_INTERRUPTIBLE);
241 timeout = HZ / 100;
242 }
243
244 try_to_freeze();
245
246 schedule_timeout(timeout);
247 }
248
249 remove_wait_queue(&ts->irq_wait, &wait);
250
251 ts->rtask = NULL;
252 return 0;
253}
254
255/*
256 * We only detect touch screen _touches_ with this interrupt
257 * handler, and even then we just schedule our task.
258 */
259static void ucb1x00_ts_irq(int idx, void *id)
260{
261 struct ucb1x00_ts *ts = id;
262 ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING);
263 wake_up(&ts->irq_wait);
264}
265
266static int ucb1x00_ts_open(struct input_dev *idev)
267{
268 struct ucb1x00_ts *ts = (struct ucb1x00_ts *)idev;
269 int ret = 0;
270
271 BUG_ON(ts->rtask);
272
273 init_waitqueue_head(&ts->irq_wait);
274 ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts);
275 if (ret < 0)
276 goto out;
277
278 /*
279 * If we do this at all, we should allow the user to
280 * measure and read the X and Y resistance at any time.
281 */
282 ucb1x00_adc_enable(ts->ucb);
283 ts->x_res = ucb1x00_ts_read_xres(ts);
284 ts->y_res = ucb1x00_ts_read_yres(ts);
285 ucb1x00_adc_disable(ts->ucb);
286
287 ts->rtask = kthread_run(ucb1x00_thread, ts, "ktsd");
288 if (!IS_ERR(ts->rtask)) {
289 ret = 0;
290 } else {
291 ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts);
292 ts->rtask = NULL;
293 ret = -EFAULT;
294 }
295
296 out:
297 return ret;
298}
299
300/*
301 * Release touchscreen resources. Disable IRQs.
302 */
303static void ucb1x00_ts_close(struct input_dev *idev)
304{
305 struct ucb1x00_ts *ts = (struct ucb1x00_ts *)idev;
306
307 if (ts->rtask)
308 kthread_stop(ts->rtask);
309
310 ucb1x00_enable(ts->ucb);
311 ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts);
312 ucb1x00_reg_write(ts->ucb, UCB_TS_CR, 0);
313 ucb1x00_disable(ts->ucb);
314}
315
316#ifdef CONFIG_PM
317static int ucb1x00_ts_resume(struct ucb1x00_dev *dev)
318{
319 struct ucb1x00_ts *ts = dev->priv;
320
321 if (ts->rtask != NULL) {
322 /*
323 * Restart the TS thread to ensure the
324 * TS interrupt mode is set up again
325 * after sleep.
326 */
327 ts->restart = 1;
328 wake_up(&ts->irq_wait);
329 }
330 return 0;
331}
332#else
333#define ucb1x00_ts_resume NULL
334#endif
335
336
337/*
338 * Initialisation.
339 */
340static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
341{
342 struct ucb1x00_ts *ts;
343
344 ts = kmalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL);
345 if (!ts)
346 return -ENOMEM;
347
348 memset(ts, 0, sizeof(struct ucb1x00_ts));
349
350 ts->ucb = dev->ucb;
351 ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC;
352
353 ts->idev.name = "Touchscreen panel";
354 ts->idev.id.product = ts->ucb->id;
355 ts->idev.open = ucb1x00_ts_open;
356 ts->idev.close = ucb1x00_ts_close;
357
358 __set_bit(EV_ABS, ts->idev.evbit);
359 __set_bit(ABS_X, ts->idev.absbit);
360 __set_bit(ABS_Y, ts->idev.absbit);
361 __set_bit(ABS_PRESSURE, ts->idev.absbit);
362
363 input_register_device(&ts->idev);
364
365 dev->priv = ts;
366
367 return 0;
368}
369
370static void ucb1x00_ts_remove(struct ucb1x00_dev *dev)
371{
372 struct ucb1x00_ts *ts = dev->priv;
373 input_unregister_device(&ts->idev);
374 kfree(ts);
375}
376
377static struct ucb1x00_driver ucb1x00_ts_driver = {
378 .add = ucb1x00_ts_add,
379 .remove = ucb1x00_ts_remove,
380 .resume = ucb1x00_ts_resume,
381};
382
383static int __init ucb1x00_ts_init(void)
384{
385 return ucb1x00_register_driver(&ucb1x00_ts_driver);
386}
387
388static void __exit ucb1x00_ts_exit(void)
389{
390 ucb1x00_unregister_driver(&ucb1x00_ts_driver);
391}
392
393module_param(adcsync, int, 0444);
394module_init(ucb1x00_ts_init);
395module_exit(ucb1x00_ts_exit);
396
397MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
398MODULE_DESCRIPTION("UCB1x00 touchscreen driver");
399MODULE_LICENSE("GPL");
diff --git a/drivers/mfd/ucb1x00.h b/drivers/mfd/ucb1x00.h
new file mode 100644
index 000000000000..6b632644f59a
--- /dev/null
+++ b/drivers/mfd/ucb1x00.h
@@ -0,0 +1,256 @@
1/*
2 * linux/drivers/mfd/ucb1x00.h
3 *
4 * Copyright (C) 2001 Russell King, All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License.
9 */
10#ifndef UCB1200_H
11#define UCB1200_H
12
13#define UCB_IO_DATA 0x00
14#define UCB_IO_DIR 0x01
15
16#define UCB_IO_0 (1 << 0)
17#define UCB_IO_1 (1 << 1)
18#define UCB_IO_2 (1 << 2)
19#define UCB_IO_3 (1 << 3)
20#define UCB_IO_4 (1 << 4)
21#define UCB_IO_5 (1 << 5)
22#define UCB_IO_6 (1 << 6)
23#define UCB_IO_7 (1 << 7)
24#define UCB_IO_8 (1 << 8)
25#define UCB_IO_9 (1 << 9)
26
27#define UCB_IE_RIS 0x02
28#define UCB_IE_FAL 0x03
29#define UCB_IE_STATUS 0x04
30#define UCB_IE_CLEAR 0x04
31#define UCB_IE_ADC (1 << 11)
32#define UCB_IE_TSPX (1 << 12)
33#define UCB_IE_TSMX (1 << 13)
34#define UCB_IE_TCLIP (1 << 14)
35#define UCB_IE_ACLIP (1 << 15)
36
37#define UCB_IRQ_TSPX 12
38
39#define UCB_TC_A 0x05
40#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */
41#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */
42
43#define UCB_TC_B 0x06
44#define UCB_TC_B_VOICE_ENA (1 << 3)
45#define UCB_TC_B_CLIP (1 << 4)
46#define UCB_TC_B_ATT (1 << 6)
47#define UCB_TC_B_SIDE_ENA (1 << 11)
48#define UCB_TC_B_MUTE (1 << 13)
49#define UCB_TC_B_IN_ENA (1 << 14)
50#define UCB_TC_B_OUT_ENA (1 << 15)
51
52#define UCB_AC_A 0x07
53#define UCB_AC_B 0x08
54#define UCB_AC_B_LOOP (1 << 8)
55#define UCB_AC_B_MUTE (1 << 13)
56#define UCB_AC_B_IN_ENA (1 << 14)
57#define UCB_AC_B_OUT_ENA (1 << 15)
58
59#define UCB_TS_CR 0x09
60#define UCB_TS_CR_TSMX_POW (1 << 0)
61#define UCB_TS_CR_TSPX_POW (1 << 1)
62#define UCB_TS_CR_TSMY_POW (1 << 2)
63#define UCB_TS_CR_TSPY_POW (1 << 3)
64#define UCB_TS_CR_TSMX_GND (1 << 4)
65#define UCB_TS_CR_TSPX_GND (1 << 5)
66#define UCB_TS_CR_TSMY_GND (1 << 6)
67#define UCB_TS_CR_TSPY_GND (1 << 7)
68#define UCB_TS_CR_MODE_INT (0 << 8)
69#define UCB_TS_CR_MODE_PRES (1 << 8)
70#define UCB_TS_CR_MODE_POS (2 << 8)
71#define UCB_TS_CR_BIAS_ENA (1 << 11)
72#define UCB_TS_CR_TSPX_LOW (1 << 12)
73#define UCB_TS_CR_TSMX_LOW (1 << 13)
74
75#define UCB_ADC_CR 0x0a
76#define UCB_ADC_SYNC_ENA (1 << 0)
77#define UCB_ADC_VREFBYP_CON (1 << 1)
78#define UCB_ADC_INP_TSPX (0 << 2)
79#define UCB_ADC_INP_TSMX (1 << 2)
80#define UCB_ADC_INP_TSPY (2 << 2)
81#define UCB_ADC_INP_TSMY (3 << 2)
82#define UCB_ADC_INP_AD0 (4 << 2)
83#define UCB_ADC_INP_AD1 (5 << 2)
84#define UCB_ADC_INP_AD2 (6 << 2)
85#define UCB_ADC_INP_AD3 (7 << 2)
86#define UCB_ADC_EXT_REF (1 << 5)
87#define UCB_ADC_START (1 << 7)
88#define UCB_ADC_ENA (1 << 15)
89
90#define UCB_ADC_DATA 0x0b
91#define UCB_ADC_DAT_VAL (1 << 15)
92#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5)
93
94#define UCB_ID 0x0c
95#define UCB_ID_1200 0x1004
96#define UCB_ID_1300 0x1005
97
98#define UCB_MODE 0x0d
99#define UCB_MODE_DYN_VFLAG_ENA (1 << 12)
100#define UCB_MODE_AUD_OFF_CAN (1 << 13)
101
102#include "mcp.h"
103
104struct ucb1x00_irq {
105 void *devid;
106 void (*fn)(int, void *);
107};
108
109extern struct class ucb1x00_class;
110
111struct ucb1x00 {
112 spinlock_t lock;
113 struct mcp *mcp;
114 unsigned int irq;
115 struct semaphore adc_sem;
116 spinlock_t io_lock;
117 u16 id;
118 u16 io_dir;
119 u16 io_out;
120 u16 adc_cr;
121 u16 irq_fal_enbl;
122 u16 irq_ris_enbl;
123 struct ucb1x00_irq irq_handler[16];
124 struct class_device cdev;
125 struct list_head node;
126 struct list_head devs;
127};
128
129struct ucb1x00_driver;
130
131struct ucb1x00_dev {
132 struct list_head dev_node;
133 struct list_head drv_node;
134 struct ucb1x00 *ucb;
135 struct ucb1x00_driver *drv;
136 void *priv;
137};
138
139struct ucb1x00_driver {
140 struct list_head node;
141 struct list_head devs;
142 int (*add)(struct ucb1x00_dev *dev);
143 void (*remove)(struct ucb1x00_dev *dev);
144 int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state);
145 int (*resume)(struct ucb1x00_dev *dev);
146};
147
148#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, cdev)
149
150int ucb1x00_register_driver(struct ucb1x00_driver *);
151void ucb1x00_unregister_driver(struct ucb1x00_driver *);
152
153/**
154 * ucb1x00_clkrate - return the UCB1x00 SIB clock rate
155 * @ucb: UCB1x00 structure describing chip
156 *
157 * Return the SIB clock rate in Hz.
158 */
159static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb)
160{
161 return mcp_get_sclk_rate(ucb->mcp);
162}
163
164/**
165 * ucb1x00_enable - enable the UCB1x00 SIB clock
166 * @ucb: UCB1x00 structure describing chip
167 *
168 * Enable the SIB clock. This can be called multiple times.
169 */
170static inline void ucb1x00_enable(struct ucb1x00 *ucb)
171{
172 mcp_enable(ucb->mcp);
173}
174
175/**
176 * ucb1x00_disable - disable the UCB1x00 SIB clock
177 * @ucb: UCB1x00 structure describing chip
178 *
179 * Disable the SIB clock. The SIB clock will only be disabled
180 * when the number of ucb1x00_enable calls match the number of
181 * ucb1x00_disable calls.
182 */
183static inline void ucb1x00_disable(struct ucb1x00 *ucb)
184{
185 mcp_disable(ucb->mcp);
186}
187
188/**
189 * ucb1x00_reg_write - write a UCB1x00 register
190 * @ucb: UCB1x00 structure describing chip
191 * @reg: UCB1x00 4-bit register index to write
192 * @val: UCB1x00 16-bit value to write
193 *
194 * Write the UCB1x00 register @reg with value @val. The SIB
195 * clock must be running for this function to return.
196 */
197static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val)
198{
199 mcp_reg_write(ucb->mcp, reg, val);
200}
201
202/**
203 * ucb1x00_reg_read - read a UCB1x00 register
204 * @ucb: UCB1x00 structure describing chip
205 * @reg: UCB1x00 4-bit register index to write
206 *
207 * Read the UCB1x00 register @reg and return its value. The SIB
208 * clock must be running for this function to return.
209 */
210static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg)
211{
212 return mcp_reg_read(ucb->mcp, reg);
213}
214/**
215 * ucb1x00_set_audio_divisor -
216 * @ucb: UCB1x00 structure describing chip
217 * @div: SIB clock divisor
218 */
219static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div)
220{
221 mcp_set_audio_divisor(ucb->mcp, div);
222}
223
224/**
225 * ucb1x00_set_telecom_divisor -
226 * @ucb: UCB1x00 structure describing chip
227 * @div: SIB clock divisor
228 */
229static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div)
230{
231 mcp_set_telecom_divisor(ucb->mcp, div);
232}
233
234void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int);
235void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int);
236unsigned int ucb1x00_io_read(struct ucb1x00 *ucb);
237
238#define UCB_NOSYNC (0)
239#define UCB_SYNC (1)
240
241unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync);
242void ucb1x00_adc_enable(struct ucb1x00 *ucb);
243void ucb1x00_adc_disable(struct ucb1x00 *ucb);
244
245/*
246 * Which edges of the IRQ do you want to control today?
247 */
248#define UCB_RISING (1 << 0)
249#define UCB_FALLING (1 << 1)
250
251int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid);
252void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges);
253void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges);
254int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid);
255
256#endif
diff --git a/drivers/misc/hdpuftrs/hdpu_cpustate.c b/drivers/misc/hdpuftrs/hdpu_cpustate.c
index 7501fab349e4..46de5c940555 100644
--- a/drivers/misc/hdpuftrs/hdpu_cpustate.c
+++ b/drivers/misc/hdpuftrs/hdpu_cpustate.c
@@ -192,22 +192,37 @@ static int hdpu_cpustate_probe(struct device *ddev)
192{ 192{
193 struct platform_device *pdev = to_platform_device(ddev); 193 struct platform_device *pdev = to_platform_device(ddev);
194 struct resource *res; 194 struct resource *res;
195 struct proc_dir_entry *proc_de;
196 int ret;
195 197
196 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 198 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
197 cpustate.set_addr = (unsigned long *)res->start; 199 cpustate.set_addr = (unsigned long *)res->start;
198 cpustate.clr_addr = (unsigned long *)res->end - 1; 200 cpustate.clr_addr = (unsigned long *)res->end - 1;
199 201
200 misc_register(&cpustate_dev); 202 ret = misc_register(&cpustate_dev);
201 create_proc_read_entry("sky_cpustate", 0, 0, cpustate_read_proc, NULL); 203 if (ret) {
204 printk(KERN_WARNING "sky_cpustate: Unable to register misc "
205 "device.\n");
206 cpustate.set_addr = NULL;
207 cpustate.clr_addr = NULL;
208 return ret;
209 }
210
211 proc_de = create_proc_read_entry("sky_cpustate", 0, 0,
212 cpustate_read_proc, NULL);
213 if (proc_de == NULL)
214 printk(KERN_WARNING "sky_cpustate: Unable to create proc "
215 "dir entry\n");
202 216
203 printk(KERN_INFO "Sky CPU State Driver v" SKY_CPUSTATE_VERSION "\n"); 217 printk(KERN_INFO "Sky CPU State Driver v" SKY_CPUSTATE_VERSION "\n");
204 return 0; 218 return 0;
205} 219}
220
206static int hdpu_cpustate_remove(struct device *ddev) 221static int hdpu_cpustate_remove(struct device *ddev)
207{ 222{
208 223
209 cpustate.set_addr = 0; 224 cpustate.set_addr = NULL;
210 cpustate.clr_addr = 0; 225 cpustate.clr_addr = NULL;
211 226
212 remove_proc_entry("sky_cpustate", NULL); 227 remove_proc_entry("sky_cpustate", NULL);
213 misc_deregister(&cpustate_dev); 228 misc_deregister(&cpustate_dev);
diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c
index bb713fed2f37..1443117fd8f4 100644
--- a/drivers/mtd/devices/mtdram.c
+++ b/drivers/mtd/devices/mtdram.c
@@ -91,8 +91,7 @@ static void __exit cleanup_mtdram(void)
91{ 91{
92 if (mtd_info) { 92 if (mtd_info) {
93 del_mtd_device(mtd_info); 93 del_mtd_device(mtd_info);
94 if (mtd_info->priv) 94 vfree(mtd_info->priv);
95 vfree(mtd_info->priv);
96 kfree(mtd_info); 95 kfree(mtd_info);
97 } 96 }
98} 97}
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c
index d9ab60b36fd4..d32c1b3a8ce3 100644
--- a/drivers/mtd/ftl.c
+++ b/drivers/mtd/ftl.c
@@ -1017,27 +1017,16 @@ static int ftl_writesect(struct mtd_blktrans_dev *dev,
1017 1017
1018void ftl_freepart(partition_t *part) 1018void ftl_freepart(partition_t *part)
1019{ 1019{
1020 if (part->VirtualBlockMap) {
1021 vfree(part->VirtualBlockMap); 1020 vfree(part->VirtualBlockMap);
1022 part->VirtualBlockMap = NULL; 1021 part->VirtualBlockMap = NULL;
1023 }
1024 if (part->VirtualPageMap) {
1025 kfree(part->VirtualPageMap); 1022 kfree(part->VirtualPageMap);
1026 part->VirtualPageMap = NULL; 1023 part->VirtualPageMap = NULL;
1027 }
1028 if (part->EUNInfo) {
1029 kfree(part->EUNInfo); 1024 kfree(part->EUNInfo);
1030 part->EUNInfo = NULL; 1025 part->EUNInfo = NULL;
1031 }
1032 if (part->XferInfo) {
1033 kfree(part->XferInfo); 1026 kfree(part->XferInfo);
1034 part->XferInfo = NULL; 1027 part->XferInfo = NULL;
1035 }
1036 if (part->bam_cache) {
1037 kfree(part->bam_cache); 1028 kfree(part->bam_cache);
1038 part->bam_cache = NULL; 1029 part->bam_cache = NULL;
1039 }
1040
1041} /* ftl_freepart */ 1030} /* ftl_freepart */
1042 1031
1043static void ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) 1032static void ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
diff --git a/drivers/net/bsd_comp.c b/drivers/net/bsd_comp.c
index 3d88ad622bdb..fb4098ed469e 100644
--- a/drivers/net/bsd_comp.c
+++ b/drivers/net/bsd_comp.c
@@ -323,33 +323,27 @@ static void bsd_reset (void *state)
323 */ 323 */
324 324
325static void bsd_free (void *state) 325static void bsd_free (void *state)
326 { 326{
327 struct bsd_db *db = (struct bsd_db *) state; 327 struct bsd_db *db = state;
328 328
329 if (db) 329 if (!db)
330 { 330 return;
331
331/* 332/*
332 * Release the dictionary 333 * Release the dictionary
333 */ 334 */
334 if (db->dict) 335 vfree(db->dict);
335 { 336 db->dict = NULL;
336 vfree (db->dict);
337 db->dict = NULL;
338 }
339/* 337/*
340 * Release the string buffer 338 * Release the string buffer
341 */ 339 */
342 if (db->lens) 340 vfree(db->lens);
343 { 341 db->lens = NULL;
344 vfree (db->lens);
345 db->lens = NULL;
346 }
347/* 342/*
348 * Finally release the structure itself. 343 * Finally release the structure itself.
349 */ 344 */
350 kfree (db); 345 kfree(db);
351 } 346}
352 }
353 347
354/* 348/*
355 * Allocate space for a (de) compressor. 349 * Allocate space for a (de) compressor.
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
index bb71638a7c44..0df7e92b0bf8 100644
--- a/drivers/net/ppp_generic.c
+++ b/drivers/net/ppp_generic.c
@@ -1232,9 +1232,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
1232 navail = 0; /* total # of usable channels (not deregistered) */ 1232 navail = 0; /* total # of usable channels (not deregistered) */
1233 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; 1233 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
1234 i = 0; 1234 i = 0;
1235 list = &ppp->channels; 1235 list_for_each_entry(pch, &ppp->channels, clist) {
1236 while ((list = list->next) != &ppp->channels) {
1237 pch = list_entry(list, struct channel, clist);
1238 navail += pch->avail = (pch->chan != NULL); 1236 navail += pch->avail = (pch->chan != NULL);
1239 if (pch->avail) { 1237 if (pch->avail) {
1240 if (skb_queue_empty(&pch->file.xq) || 1238 if (skb_queue_empty(&pch->file.xq) ||
@@ -1280,6 +1278,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb)
1280 1278
1281 /* skip to the channel after the one we last used 1279 /* skip to the channel after the one we last used
1282 and start at that one */ 1280 and start at that one */
1281 list = &ppp->channels;
1283 for (i = 0; i < ppp->nxchan; ++i) { 1282 for (i = 0; i < ppp->nxchan; ++i) {
1284 list = list->next; 1283 list = list->next;
1285 if (list == &ppp->channels) { 1284 if (list == &ppp->channels) {
@@ -1730,7 +1729,7 @@ static void
1730ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) 1729ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
1731{ 1730{
1732 u32 mask, seq; 1731 u32 mask, seq;
1733 struct list_head *l; 1732 struct channel *ch;
1734 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; 1733 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN;
1735 1734
1736 if (!pskb_may_pull(skb, mphdrlen) || ppp->mrru == 0) 1735 if (!pskb_may_pull(skb, mphdrlen) || ppp->mrru == 0)
@@ -1784,8 +1783,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
1784 * The list of channels can't change because we have the receive 1783 * The list of channels can't change because we have the receive
1785 * side of the ppp unit locked. 1784 * side of the ppp unit locked.
1786 */ 1785 */
1787 for (l = ppp->channels.next; l != &ppp->channels; l = l->next) { 1786 list_for_each_entry(ch, &ppp->channels, clist) {
1788 struct channel *ch = list_entry(l, struct channel, clist);
1789 if (seq_before(ch->lastseq, seq)) 1787 if (seq_before(ch->lastseq, seq))
1790 seq = ch->lastseq; 1788 seq = ch->lastseq;
1791 } 1789 }
@@ -2271,10 +2269,8 @@ static struct compressor_entry *
2271find_comp_entry(int proto) 2269find_comp_entry(int proto)
2272{ 2270{
2273 struct compressor_entry *ce; 2271 struct compressor_entry *ce;
2274 struct list_head *list = &compressor_list;
2275 2272
2276 while ((list = list->next) != &compressor_list) { 2273 list_for_each_entry(ce, &compressor_list, list) {
2277 ce = list_entry(list, struct compressor_entry, list);
2278 if (ce->comp->compress_proto == proto) 2274 if (ce->comp->compress_proto == proto)
2279 return ce; 2275 return ce;
2280 } 2276 }
@@ -2540,20 +2536,15 @@ static struct channel *
2540ppp_find_channel(int unit) 2536ppp_find_channel(int unit)
2541{ 2537{
2542 struct channel *pch; 2538 struct channel *pch;
2543 struct list_head *list;
2544 2539
2545 list = &new_channels; 2540 list_for_each_entry(pch, &new_channels, list) {
2546 while ((list = list->next) != &new_channels) {
2547 pch = list_entry(list, struct channel, list);
2548 if (pch->file.index == unit) { 2541 if (pch->file.index == unit) {
2549 list_del(&pch->list); 2542 list_del(&pch->list);
2550 list_add(&pch->list, &all_channels); 2543 list_add(&pch->list, &all_channels);
2551 return pch; 2544 return pch;
2552 } 2545 }
2553 } 2546 }
2554 list = &all_channels; 2547 list_for_each_entry(pch, &all_channels, list) {
2555 while ((list = list->next) != &all_channels) {
2556 pch = list_entry(list, struct channel, list);
2557 if (pch->file.index == unit) 2548 if (pch->file.index == unit)
2558 return pch; 2549 return pch;
2559 } 2550 }
diff --git a/drivers/net/tulip/de4x5.c b/drivers/net/tulip/de4x5.c
index 93800c126e86..ee48bfd67349 100644
--- a/drivers/net/tulip/de4x5.c
+++ b/drivers/net/tulip/de4x5.c
@@ -2144,9 +2144,9 @@ srom_search(struct net_device *dev, struct pci_dev *pdev)
2144 u_long iobase = 0; /* Clear upper 32 bits in Alphas */ 2144 u_long iobase = 0; /* Clear upper 32 bits in Alphas */
2145 int i, j, cfrv; 2145 int i, j, cfrv;
2146 struct de4x5_private *lp = netdev_priv(dev); 2146 struct de4x5_private *lp = netdev_priv(dev);
2147 struct list_head *walk = &pdev->bus_list; 2147 struct list_head *walk;
2148 2148
2149 for (walk = walk->next; walk != &pdev->bus_list; walk = walk->next) { 2149 list_for_each(walk, &pdev->bus_list) {
2150 struct pci_dev *this_dev = pci_dev_b(walk); 2150 struct pci_dev *this_dev = pci_dev_b(walk);
2151 2151
2152 /* Skip the pci_bus list entry */ 2152 /* Skip the pci_bus list entry */
diff --git a/drivers/parisc/lasi.c b/drivers/parisc/lasi.c
index 731855053392..cb84a4e84a2f 100644
--- a/drivers/parisc/lasi.c
+++ b/drivers/parisc/lasi.c
@@ -20,7 +20,6 @@
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/pm.h> 22#include <linux/pm.h>
23#include <linux/slab.h>
24#include <linux/types.h> 23#include <linux/types.h>
25 24
26#include <asm/io.h> 25#include <asm/io.h>
diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c
index 694bae162fed..5b887ba5aaf9 100644
--- a/drivers/parport/ieee1284.c
+++ b/drivers/parport/ieee1284.c
@@ -196,7 +196,7 @@ int parport_wait_peripheral(struct parport *port,
196 return 1; 196 return 1;
197 197
198 /* 40ms of slow polling. */ 198 /* 40ms of slow polling. */
199 deadline = jiffies + (HZ + 24) / 25; 199 deadline = jiffies + msecs_to_jiffies(40);
200 while (time_before (jiffies, deadline)) { 200 while (time_before (jiffies, deadline)) {
201 int ret; 201 int ret;
202 202
@@ -205,7 +205,7 @@ int parport_wait_peripheral(struct parport *port,
205 205
206 /* Wait for 10ms (or until an interrupt occurs if 206 /* Wait for 10ms (or until an interrupt occurs if
207 * the handler is set) */ 207 * the handler is set) */
208 if ((ret = parport_wait_event (port, (HZ + 99) / 100)) < 0) 208 if ((ret = parport_wait_event (port, msecs_to_jiffies(10))) < 0)
209 return ret; 209 return ret;
210 210
211 status = parport_read_status (port); 211 status = parport_read_status (port);
@@ -216,8 +216,7 @@ int parport_wait_peripheral(struct parport *port,
216 /* parport_wait_event didn't time out, but the 216 /* parport_wait_event didn't time out, but the
217 * peripheral wasn't actually ready either. 217 * peripheral wasn't actually ready either.
218 * Wait for another 10ms. */ 218 * Wait for another 10ms. */
219 __set_current_state (TASK_INTERRUPTIBLE); 219 schedule_timeout_interruptible(msecs_to_jiffies(10));
220 schedule_timeout ((HZ+ 99) / 100);
221 } 220 }
222 } 221 }
223 222
diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c
index 6624278c6ed8..ce1e2aad8b10 100644
--- a/drivers/parport/ieee1284_ops.c
+++ b/drivers/parport/ieee1284_ops.c
@@ -60,7 +60,7 @@ size_t parport_ieee1284_write_compat (struct parport *port,
60 parport_data_forward (port); 60 parport_data_forward (port);
61 while (count < len) { 61 while (count < len) {
62 unsigned long expire = jiffies + dev->timeout; 62 unsigned long expire = jiffies + dev->timeout;
63 long wait = (HZ + 99) / 100; 63 long wait = msecs_to_jiffies(10);
64 unsigned char mask = (PARPORT_STATUS_ERROR 64 unsigned char mask = (PARPORT_STATUS_ERROR
65 | PARPORT_STATUS_BUSY); 65 | PARPORT_STATUS_BUSY);
66 unsigned char val = (PARPORT_STATUS_ERROR 66 unsigned char val = (PARPORT_STATUS_ERROR
@@ -97,8 +97,7 @@ size_t parport_ieee1284_write_compat (struct parport *port,
97 our interrupt handler called. */ 97 our interrupt handler called. */
98 if (count && no_irq) { 98 if (count && no_irq) {
99 parport_release (dev); 99 parport_release (dev);
100 __set_current_state (TASK_INTERRUPTIBLE); 100 schedule_timeout_interruptible(wait);
101 schedule_timeout (wait);
102 parport_claim_or_block (dev); 101 parport_claim_or_block (dev);
103 } 102 }
104 else 103 else
@@ -542,13 +541,12 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port,
542 /* Yield the port for a while. */ 541 /* Yield the port for a while. */
543 if (count && dev->port->irq != PARPORT_IRQ_NONE) { 542 if (count && dev->port->irq != PARPORT_IRQ_NONE) {
544 parport_release (dev); 543 parport_release (dev);
545 __set_current_state (TASK_INTERRUPTIBLE); 544 schedule_timeout_interruptible(msecs_to_jiffies(40));
546 schedule_timeout ((HZ + 24) / 25);
547 parport_claim_or_block (dev); 545 parport_claim_or_block (dev);
548 } 546 }
549 else 547 else
550 /* We must have the device claimed here. */ 548 /* We must have the device claimed here. */
551 parport_wait_event (port, (HZ + 24) / 25); 549 parport_wait_event (port, msecs_to_jiffies(40));
552 550
553 /* Is there a signal pending? */ 551 /* Is there a signal pending? */
554 if (signal_pending (current)) 552 if (signal_pending (current))
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c
index 1b938bb9be3c..c6493ad7c0c8 100644
--- a/drivers/parport/parport_pc.c
+++ b/drivers/parport/parport_pc.c
@@ -173,8 +173,7 @@ static int change_mode(struct parport *p, int m)
173 if (time_after_eq (jiffies, expire)) 173 if (time_after_eq (jiffies, expire))
174 /* The FIFO is stuck. */ 174 /* The FIFO is stuck. */
175 return -EBUSY; 175 return -EBUSY;
176 __set_current_state (TASK_INTERRUPTIBLE); 176 schedule_timeout_interruptible(msecs_to_jiffies(10));
177 schedule_timeout ((HZ + 99) / 100);
178 if (signal_pending (current)) 177 if (signal_pending (current))
179 break; 178 break;
180 } 179 }
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index cc9d65388e62..56a3b397efee 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -44,10 +44,14 @@ pci_config_attr(subsystem_device, "0x%04x\n");
44pci_config_attr(class, "0x%06x\n"); 44pci_config_attr(class, "0x%06x\n");
45pci_config_attr(irq, "%u\n"); 45pci_config_attr(irq, "%u\n");
46 46
47static ssize_t local_cpus_show(struct device *dev, struct device_attribute *attr, char *buf) 47static ssize_t local_cpus_show(struct device *dev,
48 struct device_attribute *attr, char *buf)
48{ 49{
49 cpumask_t mask = pcibus_to_cpumask(to_pci_dev(dev)->bus); 50 cpumask_t mask;
50 int len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask); 51 int len;
52
53 mask = pcibus_to_cpumask(to_pci_dev(dev)->bus);
54 len = cpumask_scnprintf(buf, PAGE_SIZE-2, mask);
51 strcat(buf,"\n"); 55 strcat(buf,"\n");
52 return 1+len; 56 return 1+len;
53} 57}
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 35caec13023a..26a55d08b506 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -72,11 +72,13 @@ void pci_remove_legacy_files(struct pci_bus *bus) { return; }
72/* 72/*
73 * PCI Bus Class Devices 73 * PCI Bus Class Devices
74 */ 74 */
75static ssize_t pci_bus_show_cpuaffinity(struct class_device *class_dev, char *buf) 75static ssize_t pci_bus_show_cpuaffinity(struct class_device *class_dev,
76 char *buf)
76{ 77{
77 cpumask_t cpumask = pcibus_to_cpumask(to_pci_bus(class_dev));
78 int ret; 78 int ret;
79 cpumask_t cpumask;
79 80
81 cpumask = pcibus_to_cpumask(to_pci_bus(class_dev));
80 ret = cpumask_scnprintf(buf, PAGE_SIZE, cpumask); 82 ret = cpumask_scnprintf(buf, PAGE_SIZE, cpumask);
81 if (ret < PAGE_SIZE) 83 if (ret < PAGE_SIZE)
82 buf[ret++] = '\n'; 84 buf[ret++] = '\n';
diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c
index d44205d52bf3..d89f83f769f5 100644
--- a/drivers/sbus/char/bbc_envctrl.c
+++ b/drivers/sbus/char/bbc_envctrl.c
@@ -5,6 +5,7 @@
5 */ 5 */
6 6
7#define __KERNEL_SYSCALLS__ 7#define __KERNEL_SYSCALLS__
8static int errno;
8 9
9#include <linux/kernel.h> 10#include <linux/kernel.h>
10#include <linux/kthread.h> 11#include <linux/kthread.h>
@@ -13,8 +14,6 @@
13#include <linux/delay.h> 14#include <linux/delay.h>
14#include <asm/oplib.h> 15#include <asm/oplib.h>
15#include <asm/ebus.h> 16#include <asm/ebus.h>
16static int errno;
17#include <asm/unistd.h>
18 17
19#include "bbc_i2c.h" 18#include "bbc_i2c.h"
20#include "max1617.h" 19#include "max1617.h"
diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c
index d765cc1bf060..b0cc3c2588fd 100644
--- a/drivers/sbus/char/envctrl.c
+++ b/drivers/sbus/char/envctrl.c
@@ -20,6 +20,7 @@
20 */ 20 */
21 21
22#define __KERNEL_SYSCALLS__ 22#define __KERNEL_SYSCALLS__
23static int errno;
23 24
24#include <linux/config.h> 25#include <linux/config.h>
25#include <linux/module.h> 26#include <linux/module.h>
@@ -38,9 +39,6 @@
38#include <asm/uaccess.h> 39#include <asm/uaccess.h>
39#include <asm/envctrl.h> 40#include <asm/envctrl.h>
40 41
41static int errno;
42#include <asm/unistd.h>
43
44#define ENVCTRL_MINOR 162 42#define ENVCTRL_MINOR 162
45 43
46#define PCF8584_ADDRESS 0x55 44#define PCF8584_ADDRESS 0x55
diff --git a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c
index 2341d27ceed7..7a33c708f5b3 100644
--- a/drivers/scsi/53c7xx.c
+++ b/drivers/scsi/53c7xx.c
@@ -6090,8 +6090,8 @@ NCR53c7x0_release(struct Scsi_Host *host) {
6090 if (hostdata->num_cmds) 6090 if (hostdata->num_cmds)
6091 printk ("scsi%d : leaked %d NCR53c7x0_cmd structures\n", 6091 printk ("scsi%d : leaked %d NCR53c7x0_cmd structures\n",
6092 host->host_no, hostdata->num_cmds); 6092 host->host_no, hostdata->num_cmds);
6093 if (hostdata->events) 6093
6094 vfree ((void *)hostdata->events); 6094 vfree(hostdata->events);
6095 6095
6096 /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING, which 6096 /* XXX This assumes default cache mode to be IOMAP_FULL_CACHING, which
6097 * XXX may be invalid (CONFIG_060_WRITETHROUGH) 6097 * XXX may be invalid (CONFIG_060_WRITETHROUGH)
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 13ecd0c47404..da6e51c7fe69 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -560,7 +560,7 @@ ch_set_voltag(scsi_changer *ch, u_int elem,
560 return result; 560 return result;
561} 561}
562 562
563static int ch_gstatus(scsi_changer *ch, int type, unsigned char *dest) 563static int ch_gstatus(scsi_changer *ch, int type, unsigned char __user *dest)
564{ 564{
565 int retval = 0; 565 int retval = 0;
566 u_char data[16]; 566 u_char data[16];
@@ -634,6 +634,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
634{ 634{
635 scsi_changer *ch = file->private_data; 635 scsi_changer *ch = file->private_data;
636 int retval; 636 int retval;
637 void __user *argp = (void __user *)arg;
637 638
638 switch (cmd) { 639 switch (cmd) {
639 case CHIOGPARAMS: 640 case CHIOGPARAMS:
@@ -646,7 +647,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
646 params.cp_nportals = ch->counts[CHET_IE]; 647 params.cp_nportals = ch->counts[CHET_IE];
647 params.cp_ndrives = ch->counts[CHET_DT]; 648 params.cp_ndrives = ch->counts[CHET_DT];
648 649
649 if (copy_to_user((void *) arg, &params, sizeof(params))) 650 if (copy_to_user(argp, &params, sizeof(params)))
650 return -EFAULT; 651 return -EFAULT;
651 return 0; 652 return 0;
652 } 653 }
@@ -671,7 +672,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
671 vparams.cvp_n4 = ch->counts[CHET_V4]; 672 vparams.cvp_n4 = ch->counts[CHET_V4];
672 strncpy(vparams.cvp_label4,vendor_labels[3],16); 673 strncpy(vparams.cvp_label4,vendor_labels[3],16);
673 } 674 }
674 if (copy_to_user((void *) arg, &vparams, sizeof(vparams))) 675 if (copy_to_user(argp, &vparams, sizeof(vparams)))
675 return -EFAULT; 676 return -EFAULT;
676 return 0; 677 return 0;
677 } 678 }
@@ -680,7 +681,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
680 { 681 {
681 struct changer_position pos; 682 struct changer_position pos;
682 683
683 if (copy_from_user(&pos, (void*)arg, sizeof (pos))) 684 if (copy_from_user(&pos, argp, sizeof (pos)))
684 return -EFAULT; 685 return -EFAULT;
685 686
686 if (0 != ch_checkrange(ch, pos.cp_type, pos.cp_unit)) { 687 if (0 != ch_checkrange(ch, pos.cp_type, pos.cp_unit)) {
@@ -699,7 +700,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
699 { 700 {
700 struct changer_move mv; 701 struct changer_move mv;
701 702
702 if (copy_from_user(&mv, (void*)arg, sizeof (mv))) 703 if (copy_from_user(&mv, argp, sizeof (mv)))
703 return -EFAULT; 704 return -EFAULT;
704 705
705 if (0 != ch_checkrange(ch, mv.cm_fromtype, mv.cm_fromunit) || 706 if (0 != ch_checkrange(ch, mv.cm_fromtype, mv.cm_fromunit) ||
@@ -721,7 +722,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
721 { 722 {
722 struct changer_exchange mv; 723 struct changer_exchange mv;
723 724
724 if (copy_from_user(&mv, (void*)arg, sizeof (mv))) 725 if (copy_from_user(&mv, argp, sizeof (mv)))
725 return -EFAULT; 726 return -EFAULT;
726 727
727 if (0 != ch_checkrange(ch, mv.ce_srctype, mv.ce_srcunit ) || 728 if (0 != ch_checkrange(ch, mv.ce_srctype, mv.ce_srcunit ) ||
@@ -746,7 +747,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
746 { 747 {
747 struct changer_element_status ces; 748 struct changer_element_status ces;
748 749
749 if (copy_from_user(&ces, (void*)arg, sizeof (ces))) 750 if (copy_from_user(&ces, argp, sizeof (ces)))
750 return -EFAULT; 751 return -EFAULT;
751 if (ces.ces_type < 0 || ces.ces_type >= CH_TYPES) 752 if (ces.ces_type < 0 || ces.ces_type >= CH_TYPES)
752 return -EINVAL; 753 return -EINVAL;
@@ -762,7 +763,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
762 unsigned int elem; 763 unsigned int elem;
763 int result,i; 764 int result,i;
764 765
765 if (copy_from_user(&cge, (void*)arg, sizeof (cge))) 766 if (copy_from_user(&cge, argp, sizeof (cge)))
766 return -EFAULT; 767 return -EFAULT;
767 768
768 if (0 != ch_checkrange(ch, cge.cge_type, cge.cge_unit)) 769 if (0 != ch_checkrange(ch, cge.cge_type, cge.cge_unit))
@@ -825,7 +826,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
825 kfree(buffer); 826 kfree(buffer);
826 up(&ch->lock); 827 up(&ch->lock);
827 828
828 if (copy_to_user((void*)arg, &cge, sizeof (cge))) 829 if (copy_to_user(argp, &cge, sizeof (cge)))
829 return -EFAULT; 830 return -EFAULT;
830 return result; 831 return result;
831 } 832 }
@@ -843,7 +844,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
843 struct changer_set_voltag csv; 844 struct changer_set_voltag csv;
844 int elem; 845 int elem;
845 846
846 if (copy_from_user(&csv, (void*)arg, sizeof(csv))) 847 if (copy_from_user(&csv, argp, sizeof(csv)))
847 return -EFAULT; 848 return -EFAULT;
848 849
849 if (0 != ch_checkrange(ch, csv.csv_type, csv.csv_unit)) { 850 if (0 != ch_checkrange(ch, csv.csv_type, csv.csv_unit)) {
@@ -861,7 +862,7 @@ static int ch_ioctl(struct inode * inode, struct file * file,
861 } 862 }
862 863
863 default: 864 default:
864 return scsi_ioctl(ch->device, cmd, (void*)arg); 865 return scsi_ioctl(ch->device, cmd, argp);
865 866
866 } 867 }
867} 868}
@@ -894,9 +895,9 @@ static long ch_ioctl_compat(struct file * file,
894 case CHIOGSTATUS32: 895 case CHIOGSTATUS32:
895 { 896 {
896 struct changer_element_status32 ces32; 897 struct changer_element_status32 ces32;
897 unsigned char *data; 898 unsigned char __user *data;
898 899
899 if (copy_from_user(&ces32, (void*)arg, sizeof (ces32))) 900 if (copy_from_user(&ces32, (void __user *)arg, sizeof (ces32)))
900 return -EFAULT; 901 return -EFAULT;
901 if (ces32.ces_type < 0 || ces32.ces_type >= CH_TYPES) 902 if (ces32.ces_type < 0 || ces32.ces_type >= CH_TYPES)
902 return -EINVAL; 903 return -EINVAL;
diff --git a/drivers/scsi/cpqfcTSinit.c b/drivers/scsi/cpqfcTSinit.c
index d72be0ce89c8..3fda8d455c5b 100644
--- a/drivers/scsi/cpqfcTSinit.c
+++ b/drivers/scsi/cpqfcTSinit.c
@@ -691,8 +691,7 @@ int cpqfcTS_ioctl( struct scsi_device *ScsiDev, int Cmnd, void *arg)
691 if( copy_to_user( vendor_cmd->bufp, buf, vendor_cmd->len)) 691 if( copy_to_user( vendor_cmd->bufp, buf, vendor_cmd->len))
692 result = -EFAULT; 692 result = -EFAULT;
693 693
694 if( buf) 694 kfree(buf);
695 kfree( buf);
696 695
697 return result; 696 return result;
698 } 697 }
diff --git a/drivers/scsi/ibmmca.c b/drivers/scsi/ibmmca.c
index b5dc35355570..6e54c7d9b33c 100644
--- a/drivers/scsi/ibmmca.c
+++ b/drivers/scsi/ibmmca.c
@@ -36,7 +36,6 @@
36#include <linux/proc_fs.h> 36#include <linux/proc_fs.h>
37#include <linux/stat.h> 37#include <linux/stat.h>
38#include <linux/mca.h> 38#include <linux/mca.h>
39#include <linux/string.h>
40#include <linux/spinlock.h> 39#include <linux/spinlock.h>
41#include <linux/init.h> 40#include <linux/init.h>
42#include <linux/mca-legacy.h> 41#include <linux/mca-legacy.h>
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
index 89a4a0615c22..3f2f2464fa63 100644
--- a/drivers/scsi/osst.c
+++ b/drivers/scsi/osst.c
@@ -1377,7 +1377,7 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
1377 1377
1378 if ((STp->buffer)->syscall_result || !SRpnt) { 1378 if ((STp->buffer)->syscall_result || !SRpnt) {
1379 printk(KERN_ERR "%s:E: Failed to read frame back from OnStream buffer\n", name); 1379 printk(KERN_ERR "%s:E: Failed to read frame back from OnStream buffer\n", name);
1380 vfree((void *)buffer); 1380 vfree(buffer);
1381 *aSRpnt = SRpnt; 1381 *aSRpnt = SRpnt;
1382 return (-EIO); 1382 return (-EIO);
1383 } 1383 }
@@ -1419,7 +1419,7 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
1419 1419
1420 if (new_frame > frame + 1000) { 1420 if (new_frame > frame + 1000) {
1421 printk(KERN_ERR "%s:E: Failed to find writable tape media\n", name); 1421 printk(KERN_ERR "%s:E: Failed to find writable tape media\n", name);
1422 vfree((void *)buffer); 1422 vfree(buffer);
1423 return (-EIO); 1423 return (-EIO);
1424 } 1424 }
1425 if ( i >= nframes + pending ) break; 1425 if ( i >= nframes + pending ) break;
@@ -1500,7 +1500,7 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
1500 SRpnt->sr_sense_buffer[12] == 0 && 1500 SRpnt->sr_sense_buffer[12] == 0 &&
1501 SRpnt->sr_sense_buffer[13] == 2) { 1501 SRpnt->sr_sense_buffer[13] == 2) {
1502 printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); 1502 printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name);
1503 vfree((void *)buffer); 1503 vfree(buffer);
1504 return (-EIO); /* hit end of tape = fail */ 1504 return (-EIO); /* hit end of tape = fail */
1505 } 1505 }
1506 i = ((SRpnt->sr_sense_buffer[3] << 24) | 1506 i = ((SRpnt->sr_sense_buffer[3] << 24) |
@@ -1525,7 +1525,7 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
1525 } 1525 }
1526 if (!pending) 1526 if (!pending)
1527 osst_copy_to_buffer(STp->buffer, p); /* so buffer content == at entry in all cases */ 1527 osst_copy_to_buffer(STp->buffer, p); /* so buffer content == at entry in all cases */
1528 vfree((void *)buffer); 1528 vfree(buffer);
1529 return 0; 1529 return 0;
1530} 1530}
1531 1531
@@ -5852,7 +5852,7 @@ static int osst_remove(struct device *dev)
5852 os_scsi_tapes[i] = NULL; 5852 os_scsi_tapes[i] = NULL;
5853 osst_nr_dev--; 5853 osst_nr_dev--;
5854 write_unlock(&os_scsi_tapes_lock); 5854 write_unlock(&os_scsi_tapes_lock);
5855 if (tpnt->header_cache != NULL) vfree(tpnt->header_cache); 5855 vfree(tpnt->header_cache);
5856 if (tpnt->buffer) { 5856 if (tpnt->buffer) {
5857 normalize_buffer(tpnt->buffer); 5857 normalize_buffer(tpnt->buffer);
5858 kfree(tpnt->buffer); 5858 kfree(tpnt->buffer);
@@ -5896,8 +5896,7 @@ static void __exit exit_osst (void)
5896 for (i=0; i < osst_max_dev; ++i) { 5896 for (i=0; i < osst_max_dev; ++i) {
5897 if (!(STp = os_scsi_tapes[i])) continue; 5897 if (!(STp = os_scsi_tapes[i])) continue;
5898 /* This is defensive, supposed to happen during detach */ 5898 /* This is defensive, supposed to happen during detach */
5899 if (STp->header_cache) 5899 vfree(STp->header_cache);
5900 vfree(STp->header_cache);
5901 if (STp->buffer) { 5900 if (STp->buffer) {
5902 normalize_buffer(STp->buffer); 5901 normalize_buffer(STp->buffer);
5903 kfree(STp->buffer); 5902 kfree(STp->buffer);
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index 5b65e208893b..4d75cdfa0a0a 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -864,7 +864,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
864 /* 864 /*
865 * We're pretty sure there's a port here. Lets find out what 865 * We're pretty sure there's a port here. Lets find out what
866 * type of port it is. The IIR top two bits allows us to find 866 * type of port it is. The IIR top two bits allows us to find
867 * out if its 8250 or 16450, 16550, 16550A or later. This 867 * out if it's 8250 or 16450, 16550, 16550A or later. This
868 * determines what we test for next. 868 * determines what we test for next.
869 * 869 *
870 * We also initialise the EFR (if any) to zero for later. The 870 * We also initialise the EFR (if any) to zero for later. The
diff --git a/drivers/telephony/ixj.c b/drivers/telephony/ixj.c
index f2c9fa423d40..f6704688ee8c 100644
--- a/drivers/telephony/ixj.c
+++ b/drivers/telephony/ixj.c
@@ -774,10 +774,7 @@ static int ixj_wink(IXJ *j)
774 j->pots_winkstart = jiffies; 774 j->pots_winkstart = jiffies;
775 SLIC_SetState(PLD_SLIC_STATE_OC, j); 775 SLIC_SetState(PLD_SLIC_STATE_OC, j);
776 776
777 while (time_before(jiffies, j->pots_winkstart + j->winktime)) { 777 msleep(jiffies_to_msecs(j->winktime));
778 set_current_state(TASK_INTERRUPTIBLE);
779 schedule_timeout(1);
780 }
781 778
782 SLIC_SetState(slicnow, j); 779 SLIC_SetState(slicnow, j);
783 return 0; 780 return 0;
@@ -1912,7 +1909,6 @@ static int ixj_pcmcia_cable_check(IXJ *j)
1912 1909
1913static int ixj_hookstate(IXJ *j) 1910static int ixj_hookstate(IXJ *j)
1914{ 1911{
1915 unsigned long det;
1916 int fOffHook = 0; 1912 int fOffHook = 0;
1917 1913
1918 switch (j->cardtype) { 1914 switch (j->cardtype) {
@@ -1943,11 +1939,7 @@ static int ixj_hookstate(IXJ *j)
1943 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) { 1939 j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
1944 if (j->flags.ringing || j->flags.cringing) { 1940 if (j->flags.ringing || j->flags.cringing) {
1945 if (!in_interrupt()) { 1941 if (!in_interrupt()) {
1946 det = jiffies + (hertz / 50); 1942 msleep(20);
1947 while (time_before(jiffies, det)) {
1948 set_current_state(TASK_INTERRUPTIBLE);
1949 schedule_timeout(1);
1950 }
1951 } 1943 }
1952 SLIC_GetState(j); 1944 SLIC_GetState(j);
1953 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) { 1945 if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
@@ -2062,7 +2054,7 @@ static void ixj_ring_start(IXJ *j)
2062static int ixj_ring(IXJ *j) 2054static int ixj_ring(IXJ *j)
2063{ 2055{
2064 char cntr; 2056 char cntr;
2065 unsigned long jif, det; 2057 unsigned long jif;
2066 2058
2067 j->flags.ringing = 1; 2059 j->flags.ringing = 1;
2068 if (ixj_hookstate(j) & 1) { 2060 if (ixj_hookstate(j) & 1) {
@@ -2070,7 +2062,6 @@ static int ixj_ring(IXJ *j)
2070 j->flags.ringing = 0; 2062 j->flags.ringing = 0;
2071 return 1; 2063 return 1;
2072 } 2064 }
2073 det = 0;
2074 for (cntr = 0; cntr < j->maxrings; cntr++) { 2065 for (cntr = 0; cntr < j->maxrings; cntr++) {
2075 jif = jiffies + (1 * hertz); 2066 jif = jiffies + (1 * hertz);
2076 ixj_ring_on(j); 2067 ixj_ring_on(j);
@@ -2080,8 +2071,7 @@ static int ixj_ring(IXJ *j)
2080 j->flags.ringing = 0; 2071 j->flags.ringing = 0;
2081 return 1; 2072 return 1;
2082 } 2073 }
2083 set_current_state(TASK_INTERRUPTIBLE); 2074 schedule_timeout_interruptible(1);
2084 schedule_timeout(1);
2085 if (signal_pending(current)) 2075 if (signal_pending(current))
2086 break; 2076 break;
2087 } 2077 }
@@ -2089,20 +2079,13 @@ static int ixj_ring(IXJ *j)
2089 ixj_ring_off(j); 2079 ixj_ring_off(j);
2090 while (time_before(jiffies, jif)) { 2080 while (time_before(jiffies, jif)) {
2091 if (ixj_hookstate(j) & 1) { 2081 if (ixj_hookstate(j) & 1) {
2092 det = jiffies + (hertz / 100); 2082 msleep(10);
2093 while (time_before(jiffies, det)) {
2094 set_current_state(TASK_INTERRUPTIBLE);
2095 schedule_timeout(1);
2096 if (signal_pending(current))
2097 break;
2098 }
2099 if (ixj_hookstate(j) & 1) { 2083 if (ixj_hookstate(j) & 1) {
2100 j->flags.ringing = 0; 2084 j->flags.ringing = 0;
2101 return 1; 2085 return 1;
2102 } 2086 }
2103 } 2087 }
2104 set_current_state(TASK_INTERRUPTIBLE); 2088 schedule_timeout_interruptible(1);
2105 schedule_timeout(1);
2106 if (signal_pending(current)) 2089 if (signal_pending(current))
2107 break; 2090 break;
2108 } 2091 }
@@ -2168,10 +2151,8 @@ static int ixj_release(struct inode *inode, struct file *file_p)
2168 * Set up locks to ensure that only one process is talking to the DSP at a time. 2151 * Set up locks to ensure that only one process is talking to the DSP at a time.
2169 * This is necessary to keep the DSP from locking up. 2152 * This is necessary to keep the DSP from locking up.
2170 */ 2153 */
2171 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) { 2154 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
2172 set_current_state(TASK_INTERRUPTIBLE); 2155 schedule_timeout_interruptible(1);
2173 schedule_timeout(1);
2174 }
2175 if (ixjdebug & 0x0002) 2156 if (ixjdebug & 0x0002)
2176 printk(KERN_INFO "Closing board %d\n", NUM(inode)); 2157 printk(KERN_INFO "Closing board %d\n", NUM(inode));
2177 2158
@@ -3301,14 +3282,10 @@ static void ixj_write_cidcw(IXJ *j)
3301 ixj_play_tone(j, 23); 3282 ixj_play_tone(j, 23);
3302 3283
3303 clear_bit(j->board, &j->busyflags); 3284 clear_bit(j->board, &j->busyflags);
3304 while(j->tone_state) { 3285 while(j->tone_state)
3305 set_current_state(TASK_INTERRUPTIBLE); 3286 schedule_timeout_interruptible(1);
3306 schedule_timeout(1); 3287 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3307 } 3288 schedule_timeout_interruptible(1);
3308 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3309 set_current_state(TASK_INTERRUPTIBLE);
3310 schedule_timeout(1);
3311 }
3312 if(ixjdebug & 0x0200) { 3289 if(ixjdebug & 0x0200) {
3313 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies); 3290 printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
3314 } 3291 }
@@ -3328,14 +3305,10 @@ static void ixj_write_cidcw(IXJ *j)
3328 ixj_play_tone(j, 24); 3305 ixj_play_tone(j, 24);
3329 3306
3330 clear_bit(j->board, &j->busyflags); 3307 clear_bit(j->board, &j->busyflags);
3331 while(j->tone_state) { 3308 while(j->tone_state)
3332 set_current_state(TASK_INTERRUPTIBLE); 3309 schedule_timeout_interruptible(1);
3333 schedule_timeout(1); 3310 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3334 } 3311 schedule_timeout_interruptible(1);
3335 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3336 set_current_state(TASK_INTERRUPTIBLE);
3337 schedule_timeout(1);
3338 }
3339 if(ixjdebug & 0x0200) { 3312 if(ixjdebug & 0x0200) {
3340 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies); 3313 printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
3341 } 3314 }
@@ -3343,14 +3316,10 @@ static void ixj_write_cidcw(IXJ *j)
3343 j->cidcw_wait = jiffies + ((50 * hertz) / 100); 3316 j->cidcw_wait = jiffies + ((50 * hertz) / 100);
3344 3317
3345 clear_bit(j->board, &j->busyflags); 3318 clear_bit(j->board, &j->busyflags);
3346 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait)) { 3319 while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
3347 set_current_state(TASK_INTERRUPTIBLE); 3320 schedule_timeout_interruptible(1);
3348 schedule_timeout(1); 3321 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
3349 } 3322 schedule_timeout_interruptible(1);
3350 while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0) {
3351 set_current_state(TASK_INTERRUPTIBLE);
3352 schedule_timeout(1);
3353 }
3354 j->cidcw_wait = 0; 3323 j->cidcw_wait = 0;
3355 if(!j->flags.cidcw_ack) { 3324 if(!j->flags.cidcw_ack) {
3356 if(ixjdebug & 0x0200) { 3325 if(ixjdebug & 0x0200) {
@@ -6125,10 +6094,8 @@ static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd,
6125 * Set up locks to ensure that only one process is talking to the DSP at a time. 6094 * Set up locks to ensure that only one process is talking to the DSP at a time.
6126 * This is necessary to keep the DSP from locking up. 6095 * This is necessary to keep the DSP from locking up.
6127 */ 6096 */
6128 while(test_and_set_bit(board, (void *)&j->busyflags) != 0) { 6097 while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
6129 set_current_state(TASK_INTERRUPTIBLE); 6098 schedule_timeout_interruptible(1);
6130 schedule_timeout(1);
6131 }
6132 if (ixjdebug & 0x0040) 6099 if (ixjdebug & 0x0040)
6133 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg); 6100 printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
6134 if (minor >= IXJMAX) { 6101 if (minor >= IXJMAX) {
@@ -6694,8 +6661,6 @@ static struct file_operations ixj_fops =
6694 6661
6695static int ixj_linetest(IXJ *j) 6662static int ixj_linetest(IXJ *j)
6696{ 6663{
6697 unsigned long jifwait;
6698
6699 j->flags.pstncheck = 1; /* Testing */ 6664 j->flags.pstncheck = 1; /* Testing */
6700 j->flags.pstn_present = 0; /* Assume the line is not there */ 6665 j->flags.pstn_present = 0; /* Assume the line is not there */
6701 6666
@@ -6726,11 +6691,7 @@ static int ixj_linetest(IXJ *j)
6726 6691
6727 outb_p(j->pld_scrw.byte, j->XILINXbase); 6692 outb_p(j->pld_scrw.byte, j->XILINXbase);
6728 daa_set_mode(j, SOP_PU_CONVERSATION); 6693 daa_set_mode(j, SOP_PU_CONVERSATION);
6729 jifwait = jiffies + hertz; 6694 msleep(1000);
6730 while (time_before(jiffies, jifwait)) {
6731 set_current_state(TASK_INTERRUPTIBLE);
6732 schedule_timeout(1);
6733 }
6734 daa_int_read(j); 6695 daa_int_read(j);
6735 daa_set_mode(j, SOP_PU_RESET); 6696 daa_set_mode(j, SOP_PU_RESET);
6736 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { 6697 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
@@ -6750,11 +6711,7 @@ static int ixj_linetest(IXJ *j)
6750 j->pld_slicw.bits.rly3 = 0; 6711 j->pld_slicw.bits.rly3 = 0;
6751 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01); 6712 outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
6752 daa_set_mode(j, SOP_PU_CONVERSATION); 6713 daa_set_mode(j, SOP_PU_CONVERSATION);
6753 jifwait = jiffies + hertz; 6714 msleep(1000);
6754 while (time_before(jiffies, jifwait)) {
6755 set_current_state(TASK_INTERRUPTIBLE);
6756 schedule_timeout(1);
6757 }
6758 daa_int_read(j); 6715 daa_int_read(j);
6759 daa_set_mode(j, SOP_PU_RESET); 6716 daa_set_mode(j, SOP_PU_RESET);
6760 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) { 6717 if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
@@ -6783,7 +6740,6 @@ static int ixj_linetest(IXJ *j)
6783static int ixj_selfprobe(IXJ *j) 6740static int ixj_selfprobe(IXJ *j)
6784{ 6741{
6785 unsigned short cmd; 6742 unsigned short cmd;
6786 unsigned long jif;
6787 int cnt; 6743 int cnt;
6788 BYTES bytes; 6744 BYTES bytes;
6789 6745
@@ -6933,29 +6889,13 @@ static int ixj_selfprobe(IXJ *j)
6933 } else { 6889 } else {
6934 if (j->cardtype == QTI_LINEJACK) { 6890 if (j->cardtype == QTI_LINEJACK) {
6935 LED_SetState(0x1, j); 6891 LED_SetState(0x1, j);
6936 jif = jiffies + (hertz / 10); 6892 msleep(100);
6937 while (time_before(jiffies, jif)) {
6938 set_current_state(TASK_INTERRUPTIBLE);
6939 schedule_timeout(1);
6940 }
6941 LED_SetState(0x2, j); 6893 LED_SetState(0x2, j);
6942 jif = jiffies + (hertz / 10); 6894 msleep(100);
6943 while (time_before(jiffies, jif)) {
6944 set_current_state(TASK_INTERRUPTIBLE);
6945 schedule_timeout(1);
6946 }
6947 LED_SetState(0x4, j); 6895 LED_SetState(0x4, j);
6948 jif = jiffies + (hertz / 10); 6896 msleep(100);
6949 while (time_before(jiffies, jif)) {
6950 set_current_state(TASK_INTERRUPTIBLE);
6951 schedule_timeout(1);
6952 }
6953 LED_SetState(0x8, j); 6897 LED_SetState(0x8, j);
6954 jif = jiffies + (hertz / 10); 6898 msleep(100);
6955 while (time_before(jiffies, jif)) {
6956 set_current_state(TASK_INTERRUPTIBLE);
6957 schedule_timeout(1);
6958 }
6959 LED_SetState(0x0, j); 6899 LED_SetState(0x0, j);
6960 daa_get_version(j); 6900 daa_get_version(j);
6961 if (ixjdebug & 0x0002) 6901 if (ixjdebug & 0x0002)
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
index 1ab95d24c5e2..e108e0a36b74 100644
--- a/drivers/usb/input/hid-core.c
+++ b/drivers/usb/input/hid-core.c
@@ -2,7 +2,8 @@
2 * USB HID support for Linux 2 * USB HID support for Linux
3 * 3 *
4 * Copyright (c) 1999 Andreas Gal 4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2001 Vojtech Pavlik <vojtech@suse.cz> 5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
6 */ 7 */
7 8
8/* 9/*
@@ -38,7 +39,7 @@
38 * Version Information 39 * Version Information
39 */ 40 */
40 41
41#define DRIVER_VERSION "v2.01" 42#define DRIVER_VERSION "v2.6"
42#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik" 43#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik"
43#define DRIVER_DESC "USB HID core driver" 44#define DRIVER_DESC "USB HID core driver"
44#define DRIVER_LICENSE "GPL" 45#define DRIVER_LICENSE "GPL"
@@ -1058,8 +1059,8 @@ static int hid_submit_ctrl(struct hid_device *hid)
1058 if (maxpacket > 0) { 1059 if (maxpacket > 0) {
1059 padlen = (len + maxpacket - 1) / maxpacket; 1060 padlen = (len + maxpacket - 1) / maxpacket;
1060 padlen *= maxpacket; 1061 padlen *= maxpacket;
1061 if (padlen > HID_BUFFER_SIZE) 1062 if (padlen > hid->bufsize)
1062 padlen = HID_BUFFER_SIZE; 1063 padlen = hid->bufsize;
1063 } else 1064 } else
1064 padlen = 0; 1065 padlen = 0;
1065 hid->urbctrl->transfer_buffer_length = padlen; 1066 hid->urbctrl->transfer_buffer_length = padlen;
@@ -1096,6 +1097,7 @@ static void hid_irq_out(struct urb *urb, struct pt_regs *regs)
1096 1097
1097 switch (urb->status) { 1098 switch (urb->status) {
1098 case 0: /* success */ 1099 case 0: /* success */
1100 break;
1099 case -ESHUTDOWN: /* unplug */ 1101 case -ESHUTDOWN: /* unplug */
1100 case -EILSEQ: /* unplug timeout on uhci */ 1102 case -EILSEQ: /* unplug timeout on uhci */
1101 unplug = 1; 1103 unplug = 1;
@@ -1143,6 +1145,7 @@ static void hid_ctrl(struct urb *urb, struct pt_regs *regs)
1143 case 0: /* success */ 1145 case 0: /* success */
1144 if (hid->ctrl[hid->ctrltail].dir == USB_DIR_IN) 1146 if (hid->ctrl[hid->ctrltail].dir == USB_DIR_IN)
1145 hid_input_report(hid->ctrl[hid->ctrltail].report->type, urb, 0, regs); 1147 hid_input_report(hid->ctrl[hid->ctrltail].report->type, urb, 0, regs);
1148 break;
1146 case -ESHUTDOWN: /* unplug */ 1149 case -ESHUTDOWN: /* unplug */
1147 case -EILSEQ: /* unplug timectrl on uhci */ 1150 case -EILSEQ: /* unplug timectrl on uhci */
1148 unplug = 1; 1151 unplug = 1;
@@ -1284,13 +1287,8 @@ void hid_init_reports(struct hid_device *hid)
1284 struct hid_report *report; 1287 struct hid_report *report;
1285 int err, ret; 1288 int err, ret;
1286 1289
1287 list_for_each_entry(report, &hid->report_enum[HID_INPUT_REPORT].report_list, list) { 1290 list_for_each_entry(report, &hid->report_enum[HID_INPUT_REPORT].report_list, list)
1288 int size = ((report->size - 1) >> 3) + 1 + hid->report_enum[HID_INPUT_REPORT].numbered;
1289 if (size > HID_BUFFER_SIZE) size = HID_BUFFER_SIZE;
1290 if (size > hid->urbin->transfer_buffer_length)
1291 hid->urbin->transfer_buffer_length = size;
1292 hid_submit_report(hid, report, USB_DIR_IN); 1291 hid_submit_report(hid, report, USB_DIR_IN);
1293 }
1294 1292
1295 list_for_each_entry(report, &hid->report_enum[HID_FEATURE_REPORT].report_list, list) 1293 list_for_each_entry(report, &hid->report_enum[HID_FEATURE_REPORT].report_list, list)
1296 hid_submit_report(hid, report, USB_DIR_IN); 1294 hid_submit_report(hid, report, USB_DIR_IN);
@@ -1372,12 +1370,14 @@ void hid_init_reports(struct hid_device *hid)
1372#define USB_VENDOR_ID_A4TECH 0x09da 1370#define USB_VENDOR_ID_A4TECH 0x09da
1373#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 1371#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
1374 1372
1375#define USB_VENDOR_ID_AASHIMA 0x06D6 1373#define USB_VENDOR_ID_AASHIMA 0x06d6
1376#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 1374#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
1375#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026
1377 1376
1378#define USB_VENDOR_ID_CYPRESS 0x04b4 1377#define USB_VENDOR_ID_CYPRESS 0x04b4
1379#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001 1378#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001
1380#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500 1379#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500
1380#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
1381 1381
1382#define USB_VENDOR_ID_BERKSHIRE 0x0c98 1382#define USB_VENDOR_ID_BERKSHIRE 0x0c98
1383#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 1383#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
@@ -1432,7 +1432,7 @@ void hid_init_reports(struct hid_device *hid)
1432#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 1432#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
1433 1433
1434#define USB_VENDOR_ID_LD 0x0f11 1434#define USB_VENDOR_ID_LD 0x0f11
1435#define USB_DEVICE_ID_CASSY 0x1000 1435#define USB_DEVICE_ID_CASSY 0x1000
1436#define USB_DEVICE_ID_POCKETCASSY 0x1010 1436#define USB_DEVICE_ID_POCKETCASSY 0x1010
1437#define USB_DEVICE_ID_MOBILECASSY 0x1020 1437#define USB_DEVICE_ID_MOBILECASSY 0x1020
1438#define USB_DEVICE_ID_JWM 0x1080 1438#define USB_DEVICE_ID_JWM 0x1080
@@ -1445,7 +1445,8 @@ void hid_init_reports(struct hid_device *hid)
1445#define USB_DEVICE_ID_POWERCONTROL 0x2030 1445#define USB_DEVICE_ID_POWERCONTROL 0x2030
1446 1446
1447#define USB_VENDOR_ID_APPLE 0x05ac 1447#define USB_VENDOR_ID_APPLE 0x05ac
1448#define USB_DEVICE_ID_APPLE_BLUETOOTH 0x1000 1448#define USB_DEVICE_ID_APPLE_POWERMOUSE 0x0304
1449#define USB_DEVICE_ID_APPLE_BLUETOOTH 0x1000
1449 1450
1450/* 1451/*
1451 * Alphabetically sorted blacklist by quirk type. 1452 * Alphabetically sorted blacklist by quirk type.
@@ -1471,6 +1472,7 @@ static struct hid_blacklist {
1471 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW48, HID_QUIRK_IGNORE }, 1472 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW48, HID_QUIRK_IGNORE },
1472 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE }, 1473 { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE },
1473 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE }, 1474 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE },
1475 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE },
1474 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE }, 1476 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE },
1475 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE }, 1477 { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE },
1476 { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE }, 1478 { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE },
@@ -1551,10 +1553,12 @@ static struct hid_blacklist {
1551 { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_USBHUB_KB, HID_QUIRK_NOGET}, 1553 { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_USBHUB_KB, HID_QUIRK_NOGET},
1552 { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET }, 1554 { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET },
1553 1555
1556 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE },
1554 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, 1557 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
1555 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 }, 1558 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
1556 1559
1557 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD }, 1560 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
1561 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
1558 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD }, 1562 { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD },
1559 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD }, 1563 { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD },
1560 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, 1564 { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT },
@@ -1567,15 +1571,32 @@ static struct hid_blacklist {
1567 { 0, 0 } 1571 { 0, 0 }
1568}; 1572};
1569 1573
1574/*
1575 * Traverse the supplied list of reports and find the longest
1576 */
1577static void hid_find_max_report(struct hid_device *hid, unsigned int type, int *max)
1578{
1579 struct hid_report *report;
1580 int size;
1581
1582 list_for_each_entry(report, &hid->report_enum[type].report_list, list) {
1583 size = ((report->size - 1) >> 3) + 1;
1584 if (type == HID_INPUT_REPORT && hid->report_enum[type].numbered)
1585 size++;
1586 if (*max < size)
1587 *max = size;
1588 }
1589}
1590
1570static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid) 1591static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
1571{ 1592{
1572 if (!(hid->inbuf = usb_buffer_alloc(dev, HID_BUFFER_SIZE, SLAB_ATOMIC, &hid->inbuf_dma))) 1593 if (!(hid->inbuf = usb_buffer_alloc(dev, hid->bufsize, SLAB_ATOMIC, &hid->inbuf_dma)))
1573 return -1; 1594 return -1;
1574 if (!(hid->outbuf = usb_buffer_alloc(dev, HID_BUFFER_SIZE, SLAB_ATOMIC, &hid->outbuf_dma))) 1595 if (!(hid->outbuf = usb_buffer_alloc(dev, hid->bufsize, SLAB_ATOMIC, &hid->outbuf_dma)))
1575 return -1; 1596 return -1;
1576 if (!(hid->cr = usb_buffer_alloc(dev, sizeof(*(hid->cr)), SLAB_ATOMIC, &hid->cr_dma))) 1597 if (!(hid->cr = usb_buffer_alloc(dev, sizeof(*(hid->cr)), SLAB_ATOMIC, &hid->cr_dma)))
1577 return -1; 1598 return -1;
1578 if (!(hid->ctrlbuf = usb_buffer_alloc(dev, HID_BUFFER_SIZE, SLAB_ATOMIC, &hid->ctrlbuf_dma))) 1599 if (!(hid->ctrlbuf = usb_buffer_alloc(dev, hid->bufsize, SLAB_ATOMIC, &hid->ctrlbuf_dma)))
1579 return -1; 1600 return -1;
1580 1601
1581 return 0; 1602 return 0;
@@ -1584,13 +1605,13 @@ static int hid_alloc_buffers(struct usb_device *dev, struct hid_device *hid)
1584static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid) 1605static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid)
1585{ 1606{
1586 if (hid->inbuf) 1607 if (hid->inbuf)
1587 usb_buffer_free(dev, HID_BUFFER_SIZE, hid->inbuf, hid->inbuf_dma); 1608 usb_buffer_free(dev, hid->bufsize, hid->inbuf, hid->inbuf_dma);
1588 if (hid->outbuf) 1609 if (hid->outbuf)
1589 usb_buffer_free(dev, HID_BUFFER_SIZE, hid->outbuf, hid->outbuf_dma); 1610 usb_buffer_free(dev, hid->bufsize, hid->outbuf, hid->outbuf_dma);
1590 if (hid->cr) 1611 if (hid->cr)
1591 usb_buffer_free(dev, sizeof(*(hid->cr)), hid->cr, hid->cr_dma); 1612 usb_buffer_free(dev, sizeof(*(hid->cr)), hid->cr, hid->cr_dma);
1592 if (hid->ctrlbuf) 1613 if (hid->ctrlbuf)
1593 usb_buffer_free(dev, HID_BUFFER_SIZE, hid->ctrlbuf, hid->ctrlbuf_dma); 1614 usb_buffer_free(dev, hid->bufsize, hid->ctrlbuf, hid->ctrlbuf_dma);
1594} 1615}
1595 1616
1596static struct hid_device *usb_hid_configure(struct usb_interface *intf) 1617static struct hid_device *usb_hid_configure(struct usb_interface *intf)
@@ -1601,7 +1622,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1601 struct hid_device *hid; 1622 struct hid_device *hid;
1602 unsigned quirks = 0, rsize = 0; 1623 unsigned quirks = 0, rsize = 0;
1603 char *buf, *rdesc; 1624 char *buf, *rdesc;
1604 int n; 1625 int n, insize = 0;
1605 1626
1606 for (n = 0; hid_blacklist[n].idVendor; n++) 1627 for (n = 0; hid_blacklist[n].idVendor; n++)
1607 if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) && 1628 if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) &&
@@ -1655,6 +1676,19 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1655 kfree(rdesc); 1676 kfree(rdesc);
1656 hid->quirks = quirks; 1677 hid->quirks = quirks;
1657 1678
1679 hid->bufsize = HID_MIN_BUFFER_SIZE;
1680 hid_find_max_report(hid, HID_INPUT_REPORT, &hid->bufsize);
1681 hid_find_max_report(hid, HID_OUTPUT_REPORT, &hid->bufsize);
1682 hid_find_max_report(hid, HID_FEATURE_REPORT, &hid->bufsize);
1683
1684 if (hid->bufsize > HID_MAX_BUFFER_SIZE)
1685 hid->bufsize = HID_MAX_BUFFER_SIZE;
1686
1687 hid_find_max_report(hid, HID_INPUT_REPORT, &insize);
1688
1689 if (insize > HID_MAX_BUFFER_SIZE)
1690 insize = HID_MAX_BUFFER_SIZE;
1691
1658 if (hid_alloc_buffers(dev, hid)) { 1692 if (hid_alloc_buffers(dev, hid)) {
1659 hid_free_buffers(dev, hid); 1693 hid_free_buffers(dev, hid);
1660 goto fail; 1694 goto fail;
@@ -1685,7 +1719,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1685 if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL))) 1719 if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL)))
1686 goto fail; 1720 goto fail;
1687 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); 1721 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
1688 usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, 0, 1722 usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, insize,
1689 hid_irq_in, hid, interval); 1723 hid_irq_in, hid, interval);
1690 hid->urbin->transfer_dma = hid->inbuf_dma; 1724 hid->urbin->transfer_dma = hid->inbuf_dma;
1691 hid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1725 hid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
diff --git a/drivers/usb/input/hid-debug.h b/drivers/usb/input/hid-debug.h
index 52437e5e2e78..ceebab99eff2 100644
--- a/drivers/usb/input/hid-debug.h
+++ b/drivers/usb/input/hid-debug.h
@@ -85,6 +85,23 @@ static const struct hid_usage_entry hid_usage_table[] = {
85 {0, 0x91, "D-PadDown"}, 85 {0, 0x91, "D-PadDown"},
86 {0, 0x92, "D-PadRight"}, 86 {0, 0x92, "D-PadRight"},
87 {0, 0x93, "D-PadLeft"}, 87 {0, 0x93, "D-PadLeft"},
88 { 2, 0, "Simulation" },
89 {0, 0xb0, "Aileron"},
90 {0, 0xb1, "AileronTrim"},
91 {0, 0xb2, "Anti-Torque"},
92 {0, 0xb3, "Autopilot"},
93 {0, 0xb4, "Chaff"},
94 {0, 0xb5, "Collective"},
95 {0, 0xb6, "DiveBrake"},
96 {0, 0xb7, "ElectronicCountermeasures"},
97 {0, 0xb8, "Elevator"},
98 {0, 0xb9, "ElevatorTrim"},
99 {0, 0xba, "Rudder"},
100 {0, 0xbb, "Throttle"},
101 {0, 0xbc, "FlightCommunications"},
102 {0, 0xbd, "FlareRelease"},
103 {0, 0xbe, "LandingGear"},
104 {0, 0xbf, "ToeBrake"},
88 { 7, 0, "Keyboard" }, 105 { 7, 0, "Keyboard" },
89 { 8, 0, "LED" }, 106 { 8, 0, "LED" },
90 {0, 0x01, "NumLock"}, 107 {0, 0x01, "NumLock"},
@@ -92,6 +109,7 @@ static const struct hid_usage_entry hid_usage_table[] = {
92 {0, 0x03, "ScrollLock"}, 109 {0, 0x03, "ScrollLock"},
93 {0, 0x04, "Compose"}, 110 {0, 0x04, "Compose"},
94 {0, 0x05, "Kana"}, 111 {0, 0x05, "Kana"},
112 {0, 0x4b, "GenericIndicator"},
95 { 9, 0, "Button" }, 113 { 9, 0, "Button" },
96 { 10, 0, "Ordinal" }, 114 { 10, 0, "Ordinal" },
97 { 12, 0, "Consumer" }, 115 { 12, 0, "Consumer" },
@@ -574,7 +592,8 @@ static char *keys[KEY_MAX + 1] = {
574 [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move", 592 [KEY_EXIT] = "Exit", [KEY_MOVE] = "Move",
575 [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp", 593 [KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp",
576 [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis", 594 [KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis",
577 [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_F13] = "F13", 595 [KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_NEW] = "New",
596 [KEY_REDO] = "Redo", [KEY_F13] = "F13",
578 [KEY_F14] = "F14", [KEY_F15] = "F15", 597 [KEY_F14] = "F14", [KEY_F15] = "F15",
579 [KEY_F16] = "F16", [KEY_F17] = "F17", 598 [KEY_F16] = "F16", [KEY_F17] = "F17",
580 [KEY_F18] = "F18", [KEY_F19] = "F19", 599 [KEY_F18] = "F18", [KEY_F19] = "F19",
@@ -584,15 +603,15 @@ static char *keys[KEY_MAX + 1] = {
584 [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3", 603 [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",
585 [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend", 604 [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",
586 [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play", 605 [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",
587 [KEY_FASTFORWARD] = "Fast Forward", [KEY_BASSBOOST] = "Bass Boost", 606 [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost",
588 [KEY_PRINT] = "Print", [KEY_HP] = "HP", 607 [KEY_PRINT] = "Print", [KEY_HP] = "HP",
589 [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound", 608 [KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound",
590 [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email", 609 [KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email",
591 [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search", 610 [KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search",
592 [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance", 611 [KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance",
593 [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop", 612 [KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop",
594 [KEY_ALTERASE] = "Alternate Erase", [KEY_CANCEL] = "Cancel", 613 [KEY_ALTERASE] = "AlternateErase", [KEY_CANCEL] = "Cancel",
595 [KEY_BRIGHTNESSDOWN] = "Brightness down", [KEY_BRIGHTNESSUP] = "Brightness up", 614 [KEY_BRIGHTNESSDOWN] = "BrightnessDown", [KEY_BRIGHTNESSUP] = "BrightnessUp",
596 [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown", 615 [KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown",
597 [BTN_0] = "Btn0", [BTN_1] = "Btn1", 616 [BTN_0] = "Btn0", [BTN_1] = "Btn1",
598 [BTN_2] = "Btn2", [BTN_3] = "Btn3", 617 [BTN_2] = "Btn2", [BTN_3] = "Btn3",
@@ -622,8 +641,8 @@ static char *keys[KEY_MAX + 1] = {
622 [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger", 641 [BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger",
623 [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens", 642 [BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens",
624 [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus", 643 [BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus",
625 [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "Tool Doubletap", 644 [BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "ToolDoubleTap",
626 [BTN_TOOL_TRIPLETAP] = "Tool Tripletap", [BTN_GEAR_DOWN] = "WheelBtn", 645 [BTN_TOOL_TRIPLETAP] = "ToolTripleTap", [BTN_GEAR_DOWN] = "WheelBtn",
627 [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok", 646 [BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok",
628 [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto", 647 [KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",
629 [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2", 648 [KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",
@@ -659,6 +678,9 @@ static char *keys[KEY_MAX + 1] = {
659 [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL", 678 [KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "DeleteEOL",
660 [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine", 679 [KEY_DEL_EOS] = "DeleteEOS", [KEY_INS_LINE] = "InsertLine",
661 [KEY_DEL_LINE] = "DeleteLine", 680 [KEY_DEL_LINE] = "DeleteLine",
681 [KEY_SEND] = "Send", [KEY_REPLY] = "Reply",
682 [KEY_FORWARDMAIL] = "ForwardMail", [KEY_SAVE] = "Save",
683 [KEY_DOCUMENTS] = "Documents",
662}; 684};
663 685
664static char *relatives[REL_MAX + 1] = { 686static char *relatives[REL_MAX + 1] = {
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c
index 63a4db721f7e..0b6452248a39 100644
--- a/drivers/usb/input/hid-input.c
+++ b/drivers/usb/input/hid-input.c
@@ -78,8 +78,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
78{ 78{
79 struct input_dev *input = &hidinput->input; 79 struct input_dev *input = &hidinput->input;
80 struct hid_device *device = hidinput->input.private; 80 struct hid_device *device = hidinput->input.private;
81 int max, code; 81 int max = 0, code;
82 unsigned long *bit; 82 unsigned long *bit = NULL;
83 83
84 field->hidinput = hidinput; 84 field->hidinput = hidinput;
85 85
@@ -131,6 +131,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
131 map_key(code); 131 map_key(code);
132 break; 132 break;
133 133
134
135 case HID_UP_SIMULATION:
136
137 switch (usage->hid & 0xffff) {
138 case 0xba: map_abs(ABS_RUDDER); break;
139 case 0xbb: map_abs(ABS_THROTTLE); break;
140 }
141 break;
142
134 case HID_UP_GENDESK: 143 case HID_UP_GENDESK:
135 144
136 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */ 145 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
@@ -238,8 +247,12 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
238 case 0x000: goto ignore; 247 case 0x000: goto ignore;
239 case 0x034: map_key_clear(KEY_SLEEP); break; 248 case 0x034: map_key_clear(KEY_SLEEP); break;
240 case 0x036: map_key_clear(BTN_MISC); break; 249 case 0x036: map_key_clear(BTN_MISC); break;
250 case 0x045: map_key_clear(KEY_RADIO); break;
241 case 0x08a: map_key_clear(KEY_WWW); break; 251 case 0x08a: map_key_clear(KEY_WWW); break;
252 case 0x08d: map_key_clear(KEY_PROGRAM); break;
242 case 0x095: map_key_clear(KEY_HELP); break; 253 case 0x095: map_key_clear(KEY_HELP); break;
254 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
255 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
243 case 0x0b0: map_key_clear(KEY_PLAY); break; 256 case 0x0b0: map_key_clear(KEY_PLAY); break;
244 case 0x0b1: map_key_clear(KEY_PAUSE); break; 257 case 0x0b1: map_key_clear(KEY_PAUSE); break;
245 case 0x0b2: map_key_clear(KEY_RECORD); break; 258 case 0x0b2: map_key_clear(KEY_RECORD); break;
@@ -259,6 +272,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
259 case 0x18a: map_key_clear(KEY_MAIL); break; 272 case 0x18a: map_key_clear(KEY_MAIL); break;
260 case 0x192: map_key_clear(KEY_CALC); break; 273 case 0x192: map_key_clear(KEY_CALC); break;
261 case 0x194: map_key_clear(KEY_FILE); break; 274 case 0x194: map_key_clear(KEY_FILE); break;
275 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
276 case 0x201: map_key_clear(KEY_NEW); break;
277 case 0x207: map_key_clear(KEY_SAVE); break;
278 case 0x208: map_key_clear(KEY_PRINT); break;
279 case 0x209: map_key_clear(KEY_PROPS); break;
262 case 0x21a: map_key_clear(KEY_UNDO); break; 280 case 0x21a: map_key_clear(KEY_UNDO); break;
263 case 0x21b: map_key_clear(KEY_COPY); break; 281 case 0x21b: map_key_clear(KEY_COPY); break;
264 case 0x21c: map_key_clear(KEY_CUT); break; 282 case 0x21c: map_key_clear(KEY_CUT); break;
@@ -271,7 +289,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
271 case 0x227: map_key_clear(KEY_REFRESH); break; 289 case 0x227: map_key_clear(KEY_REFRESH); break;
272 case 0x22a: map_key_clear(KEY_BOOKMARKS); break; 290 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
273 case 0x238: map_rel(REL_HWHEEL); break; 291 case 0x238: map_rel(REL_HWHEEL); break;
274 default: goto unknown; 292 case 0x279: map_key_clear(KEY_REDO); break;
293 case 0x289: map_key_clear(KEY_REPLY); break;
294 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
295 case 0x28c: map_key_clear(KEY_SEND); break;
296 default: goto ignore;
275 } 297 }
276 break; 298 break;
277 299
@@ -296,9 +318,42 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
296 break; 318 break;
297 319
298 case HID_UP_MSVENDOR: 320 case HID_UP_MSVENDOR:
299
300 goto ignore; 321 goto ignore;
301 322
323 case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */
324
325 set_bit(EV_REP, input->evbit);
326 switch(usage->hid & HID_USAGE) {
327 case 0x003: map_key_clear(KEY_FN); break;
328 default: goto ignore;
329 }
330 break;
331
332 case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */
333
334 set_bit(EV_REP, input->evbit);
335 switch(usage->hid & HID_USAGE) {
336 case 0x004: map_key_clear(KEY_AGAIN); break;
337 case 0x00d: map_key_clear(KEY_HOME); break;
338 case 0x024: map_key_clear(KEY_SHUFFLE); break;
339 case 0x025: map_key_clear(KEY_TV); break;
340 case 0x026: map_key_clear(KEY_MENU); break;
341 case 0x031: map_key_clear(KEY_AUDIO); break;
342 case 0x032: map_key_clear(KEY_SUBTITLE); break;
343 case 0x033: map_key_clear(KEY_LAST); break;
344 case 0x047: map_key_clear(KEY_MP3); break;
345 case 0x048: map_key_clear(KEY_DVD); break;
346 case 0x049: map_key_clear(KEY_MEDIA); break;
347 case 0x04a: map_key_clear(KEY_VIDEO); break;
348 case 0x04b: map_key_clear(KEY_ANGLE); break;
349 case 0x04c: map_key_clear(KEY_LANGUAGE); break;
350 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
351 case 0x051: map_key_clear(KEY_RED); break;
352 case 0x052: map_key_clear(KEY_CLOSE); break;
353 default: goto ignore;
354 }
355 break;
356
302 case HID_UP_PID: 357 case HID_UP_PID:
303 358
304 set_bit(EV_FF, input->evbit); 359 set_bit(EV_FF, input->evbit);
@@ -349,6 +404,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
349 if (usage->code > max) 404 if (usage->code > max)
350 goto ignore; 405 goto ignore;
351 406
407 if (((device->quirks & (HID_QUIRK_2WHEEL_POWERMOUSE)) && (usage->hid == 0x00010032)))
408 map_rel(REL_HWHEEL);
409
352 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) && 410 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) &&
353 (usage->type == EV_REL) && (usage->code == REL_WHEEL)) 411 (usage->type == EV_REL) && (usage->code == REL_WHEEL))
354 set_bit(REL_HWHEEL, bit); 412 set_bit(REL_HWHEEL, bit);
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h
index c1b6b69bc4a4..ec2412c42f1e 100644
--- a/drivers/usb/input/hid.h
+++ b/drivers/usb/input/hid.h
@@ -173,6 +173,7 @@ struct hid_item {
173 173
174#define HID_UP_UNDEFINED 0x00000000 174#define HID_UP_UNDEFINED 0x00000000
175#define HID_UP_GENDESK 0x00010000 175#define HID_UP_GENDESK 0x00010000
176#define HID_UP_SIMULATION 0x00020000
176#define HID_UP_KEYBOARD 0x00070000 177#define HID_UP_KEYBOARD 0x00070000
177#define HID_UP_LED 0x00080000 178#define HID_UP_LED 0x00080000
178#define HID_UP_BUTTON 0x00090000 179#define HID_UP_BUTTON 0x00090000
@@ -182,6 +183,8 @@ struct hid_item {
182#define HID_UP_PID 0x000f0000 183#define HID_UP_PID 0x000f0000
183#define HID_UP_HPVENDOR 0xff7f0000 184#define HID_UP_HPVENDOR 0xff7f0000
184#define HID_UP_MSVENDOR 0xff000000 185#define HID_UP_MSVENDOR 0xff000000
186#define HID_UP_CUSTOM 0x00ff0000
187#define HID_UP_LOGIVENDOR 0xffbc0000
185 188
186#define HID_USAGE 0x0000ffff 189#define HID_USAGE 0x0000ffff
187 190
@@ -242,6 +245,7 @@ struct hid_item {
242#define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x080 245#define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x080
243#define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x100 246#define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x100
244#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x200 247#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x200
248#define HID_QUIRK_2WHEEL_POWERMOUSE 0x400
245 249
246/* 250/*
247 * This is the global environment of the parser. This information is 251 * This is the global environment of the parser. This information is
@@ -348,7 +352,8 @@ struct hid_report_enum {
348 352
349#define HID_REPORT_TYPES 3 353#define HID_REPORT_TYPES 3
350 354
351#define HID_BUFFER_SIZE 64 /* use 64 for compatibility with all possible packetlen */ 355#define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */
356#define HID_MAX_BUFFER_SIZE 4096 /* 4kb */
352#define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ 357#define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */
353#define HID_OUTPUT_FIFO_SIZE 64 358#define HID_OUTPUT_FIFO_SIZE 64
354 359
@@ -386,6 +391,8 @@ struct hid_device { /* device report descriptor */
386 391
387 unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ 392 unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */
388 393
394 unsigned int bufsize; /* URB buffer size */
395
389 struct urb *urbin; /* Input URB */ 396 struct urb *urbin; /* Input URB */
390 char *inbuf; /* Input buffer */ 397 char *inbuf; /* Input buffer */
391 dma_addr_t inbuf_dma; /* Input buffer dma */ 398 dma_addr_t inbuf_dma; /* Input buffer dma */
diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c
index 4c13331b5f41..d32427818af7 100644
--- a/drivers/usb/input/hiddev.c
+++ b/drivers/usb/input/hiddev.c
@@ -507,6 +507,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
507 return -EINVAL; 507 return -EINVAL;
508 508
509 hid_submit_report(hid, report, USB_DIR_OUT); 509 hid_submit_report(hid, report, USB_DIR_OUT);
510 hid_wait_io(hid);
510 511
511 return 0; 512 return 0;
512 513
diff --git a/drivers/usb/media/stv680.c b/drivers/usb/media/stv680.c
index 7398a7f19c1e..0fd0fa9fec21 100644
--- a/drivers/usb/media/stv680.c
+++ b/drivers/usb/media/stv680.c
@@ -260,7 +260,7 @@ static int stv_stop_video (struct usb_stv *dev)
260 PDEBUG (0, "STV(i): Camera set to original resolution"); 260 PDEBUG (0, "STV(i): Camera set to original resolution");
261 } 261 }
262 /* origMode */ 262 /* origMode */
263 kfree (buf); 263 kfree(buf);
264 return i; 264 return i;
265} 265}
266 266
@@ -276,7 +276,7 @@ static int stv_set_video_mode (struct usb_stv *dev)
276 } 276 }
277 277
278 if ((i = stv_set_config (dev, 1, 0, 0)) < 0) { 278 if ((i = stv_set_config (dev, 1, 0, 0)) < 0) {
279 kfree (buf); 279 kfree(buf);
280 return i; 280 return i;
281 } 281 }
282 282
@@ -301,13 +301,13 @@ static int stv_set_video_mode (struct usb_stv *dev)
301 goto exit; 301 goto exit;
302 302
303error: 303error:
304 kfree (buf); 304 kfree(buf);
305 if (stop_video == 1) 305 if (stop_video == 1)
306 stv_stop_video (dev); 306 stv_stop_video (dev);
307 return -1; 307 return -1;
308 308
309exit: 309exit:
310 kfree (buf); 310 kfree(buf);
311 return 0; 311 return 0;
312} 312}
313 313
@@ -327,7 +327,7 @@ static int stv_init (struct usb_stv *stv680)
327 327
328 /* set config 1, interface 0, alternate 0 */ 328 /* set config 1, interface 0, alternate 0 */
329 if ((i = stv_set_config (stv680, 1, 0, 0)) < 0) { 329 if ((i = stv_set_config (stv680, 1, 0, 0)) < 0) {
330 kfree (buffer); 330 kfree(buffer);
331 PDEBUG (0, "STV(e): set config 1,0,0 failed"); 331 PDEBUG (0, "STV(e): set config 1,0,0 failed");
332 return -1; 332 return -1;
333 } 333 }
@@ -435,11 +435,11 @@ static int stv_init (struct usb_stv *stv680)
435error: 435error:
436 i = stv_sndctrl (0, stv680, 0x80, 0, buffer, 0x02); /* Get Last Error */ 436 i = stv_sndctrl (0, stv680, 0x80, 0, buffer, 0x02); /* Get Last Error */
437 PDEBUG (1, "STV(i): last error: %i, command = 0x%x", buffer[0], buffer[1]); 437 PDEBUG (1, "STV(i): last error: %i, command = 0x%x", buffer[0], buffer[1]);
438 kfree (buffer); 438 kfree(buffer);
439 return -1; 439 return -1;
440 440
441exit: 441exit:
442 kfree (buffer); 442 kfree(buffer);
443 443
444 /* video = 320x240, 352x288 */ 444 /* video = 320x240, 352x288 */
445 if (stv680->CIF == 1) { 445 if (stv680->CIF == 1) {
@@ -708,10 +708,10 @@ static int stv680_stop_stream (struct usb_stv *stv680)
708 usb_kill_urb (stv680->urb[i]); 708 usb_kill_urb (stv680->urb[i]);
709 usb_free_urb (stv680->urb[i]); 709 usb_free_urb (stv680->urb[i]);
710 stv680->urb[i] = NULL; 710 stv680->urb[i] = NULL;
711 kfree (stv680->sbuf[i].data); 711 kfree(stv680->sbuf[i].data);
712 } 712 }
713 for (i = 0; i < STV680_NUMSCRATCH; i++) { 713 for (i = 0; i < STV680_NUMSCRATCH; i++) {
714 kfree (stv680->scratch[i].data); 714 kfree(stv680->scratch[i].data);
715 stv680->scratch[i].data = NULL; 715 stv680->scratch[i].data = NULL;
716 } 716 }
717 717
@@ -1068,7 +1068,7 @@ static int stv_close (struct inode *inode, struct file *file)
1068 stv680->user = 0; 1068 stv680->user = 0;
1069 1069
1070 if (stv680->removed) { 1070 if (stv680->removed) {
1071 kfree (stv680); 1071 kfree(stv680);
1072 stv680 = NULL; 1072 stv680 = NULL;
1073 PDEBUG (0, "STV(i): device unregistered"); 1073 PDEBUG (0, "STV(i): device unregistered");
1074 } 1074 }
@@ -1445,14 +1445,14 @@ static inline void usb_stv680_remove_disconnected (struct usb_stv *stv680)
1445 usb_kill_urb (stv680->urb[i]); 1445 usb_kill_urb (stv680->urb[i]);
1446 usb_free_urb (stv680->urb[i]); 1446 usb_free_urb (stv680->urb[i]);
1447 stv680->urb[i] = NULL; 1447 stv680->urb[i] = NULL;
1448 kfree (stv680->sbuf[i].data); 1448 kfree(stv680->sbuf[i].data);
1449 } 1449 }
1450 for (i = 0; i < STV680_NUMSCRATCH; i++) 1450 for (i = 0; i < STV680_NUMSCRATCH; i++)
1451 kfree (stv680->scratch[i].data); 1451 kfree(stv680->scratch[i].data);
1452 PDEBUG (0, "STV(i): %s disconnected", stv680->camera_name); 1452 PDEBUG (0, "STV(i): %s disconnected", stv680->camera_name);
1453 1453
1454 /* Free the memory */ 1454 /* Free the memory */
1455 kfree (stv680); 1455 kfree(stv680);
1456} 1456}
1457 1457
1458static void stv680_disconnect (struct usb_interface *intf) 1458static void stv680_disconnect (struct usb_interface *intf)
diff --git a/drivers/video/nvidia/nv_of.c b/drivers/video/nvidia/nv_of.c
index 7d12eb85310d..4fa2cf9a8af2 100644
--- a/drivers/video/nvidia/nv_of.c
+++ b/drivers/video/nvidia/nv_of.c
@@ -30,8 +30,9 @@
30void nvidia_create_i2c_busses(struct nvidia_par *par) {} 30void nvidia_create_i2c_busses(struct nvidia_par *par) {}
31void nvidia_delete_i2c_busses(struct nvidia_par *par) {} 31void nvidia_delete_i2c_busses(struct nvidia_par *par) {}
32 32
33int nvidia_probe_i2c_connector(struct nvidia_par *par, int conn, u8 **out_edid) 33int nvidia_probe_i2c_connector(struct fb_info *info, int conn, u8 **out_edid)
34{ 34{
35 struct nvidia_par *par = info->par;
35 struct device_node *dp; 36 struct device_node *dp;
36 unsigned char *pedid = NULL; 37 unsigned char *pedid = NULL;
37 unsigned char *disptype = NULL; 38 unsigned char *disptype = NULL;
diff --git a/drivers/video/vgastate.c b/drivers/video/vgastate.c
index 0ea62d8bc703..ca92940f3943 100644
--- a/drivers/video/vgastate.c
+++ b/drivers/video/vgastate.c
@@ -342,16 +342,11 @@ static void vga_cleanup(struct vgastate *state)
342 if (state->vidstate != NULL) { 342 if (state->vidstate != NULL) {
343 struct regstate *saved = (struct regstate *) state->vidstate; 343 struct regstate *saved = (struct regstate *) state->vidstate;
344 344
345 if (saved->vga_font0) 345 vfree(saved->vga_font0);
346 vfree(saved->vga_font0); 346 vfree(saved->vga_font1);
347 if (saved->vga_font1) 347 vfree(saved->vga_text);
348 vfree(saved->vga_font1); 348 vfree(saved->vga_cmap);
349 if (saved->vga_text) 349 vfree(saved->attr);
350 vfree(saved->vga_text);
351 if (saved->vga_cmap)
352 vfree(saved->vga_cmap);
353 if (saved->attr)
354 vfree(saved->attr);
355 kfree(saved); 350 kfree(saved);
356 state->vidstate = NULL; 351 state->vidstate = NULL;
357 } 352 }
diff --git a/fs/buffer.c b/fs/buffer.c
index 1c62203a4906..6cbfceabd95d 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -40,6 +40,7 @@
40#include <linux/cpu.h> 40#include <linux/cpu.h>
41#include <linux/bitops.h> 41#include <linux/bitops.h>
42#include <linux/mpage.h> 42#include <linux/mpage.h>
43#include <linux/bit_spinlock.h>
43 44
44static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); 45static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
45static void invalidate_bh_lrus(void); 46static void invalidate_bh_lrus(void);
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 3217ac5f6bd7..2335f14a1583 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -3215,10 +3215,8 @@ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
3215 } 3215 }
3216 3216
3217 cifs_sb->tcon = NULL; 3217 cifs_sb->tcon = NULL;
3218 if (ses) { 3218 if (ses)
3219 set_current_state(TASK_INTERRUPTIBLE); 3219 schedule_timeout_interruptible(msecs_to_jiffies(500));
3220 schedule_timeout(HZ / 2);
3221 }
3222 if (ses) 3220 if (ses)
3223 sesInfoFree(ses); 3221 sesInfoFree(ses);
3224 3222
diff --git a/fs/cramfs/uncompress.c b/fs/cramfs/uncompress.c
index 5034365b06a8..8def89f2c438 100644
--- a/fs/cramfs/uncompress.c
+++ b/fs/cramfs/uncompress.c
@@ -19,6 +19,7 @@
19#include <linux/errno.h> 19#include <linux/errno.h>
20#include <linux/vmalloc.h> 20#include <linux/vmalloc.h>
21#include <linux/zlib.h> 21#include <linux/zlib.h>
22#include <linux/cramfs_fs.h>
22 23
23static z_stream stream; 24static z_stream stream;
24static int initialized; 25static int initialized;
diff --git a/fs/dcache.c b/fs/dcache.c
index a15a2e1f5520..7376b61269fb 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -337,12 +337,10 @@ struct dentry * d_find_alias(struct inode *inode)
337 */ 337 */
338void d_prune_aliases(struct inode *inode) 338void d_prune_aliases(struct inode *inode)
339{ 339{
340 struct list_head *tmp, *head = &inode->i_dentry; 340 struct dentry *dentry;
341restart: 341restart:
342 spin_lock(&dcache_lock); 342 spin_lock(&dcache_lock);
343 tmp = head; 343 list_for_each_entry(dentry, &inode->i_dentry, d_alias) {
344 while ((tmp = tmp->next) != head) {
345 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
346 spin_lock(&dentry->d_lock); 344 spin_lock(&dentry->d_lock);
347 if (!atomic_read(&dentry->d_count)) { 345 if (!atomic_read(&dentry->d_count)) {
348 __dget_locked(dentry); 346 __dget_locked(dentry);
@@ -463,10 +461,7 @@ void shrink_dcache_sb(struct super_block * sb)
463 * superblock to the most recent end of the unused list. 461 * superblock to the most recent end of the unused list.
464 */ 462 */
465 spin_lock(&dcache_lock); 463 spin_lock(&dcache_lock);
466 next = dentry_unused.next; 464 list_for_each_safe(tmp, next, &dentry_unused) {
467 while (next != &dentry_unused) {
468 tmp = next;
469 next = tmp->next;
470 dentry = list_entry(tmp, struct dentry, d_lru); 465 dentry = list_entry(tmp, struct dentry, d_lru);
471 if (dentry->d_sb != sb) 466 if (dentry->d_sb != sb)
472 continue; 467 continue;
@@ -478,10 +473,7 @@ void shrink_dcache_sb(struct super_block * sb)
478 * Pass two ... free the dentries for this superblock. 473 * Pass two ... free the dentries for this superblock.
479 */ 474 */
480repeat: 475repeat:
481 next = dentry_unused.next; 476 list_for_each_safe(tmp, next, &dentry_unused) {
482 while (next != &dentry_unused) {
483 tmp = next;
484 next = tmp->next;
485 dentry = list_entry(tmp, struct dentry, d_lru); 477 dentry = list_entry(tmp, struct dentry, d_lru);
486 if (dentry->d_sb != sb) 478 if (dentry->d_sb != sb)
487 continue; 479 continue;
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c
index c6ec66fd8766..49bbc2be3d72 100644
--- a/fs/jbd/transaction.c
+++ b/fs/jbd/transaction.c
@@ -1340,8 +1340,7 @@ int journal_stop(handle_t *handle)
1340 if (handle->h_sync) { 1340 if (handle->h_sync) {
1341 do { 1341 do {
1342 old_handle_count = transaction->t_handle_count; 1342 old_handle_count = transaction->t_handle_count;
1343 set_current_state(TASK_UNINTERRUPTIBLE); 1343 schedule_timeout_uninterruptible(1);
1344 schedule_timeout(1);
1345 } while (old_handle_count != transaction->t_handle_count); 1344 } while (old_handle_count != transaction->t_handle_count);
1346 } 1345 }
1347 1346
diff --git a/fs/jffs/intrep.c b/fs/jffs/intrep.c
index 456d7e6e29c2..27f199e94cfc 100644
--- a/fs/jffs/intrep.c
+++ b/fs/jffs/intrep.c
@@ -1701,12 +1701,10 @@ jffs_find_file(struct jffs_control *c, __u32 ino)
1701{ 1701{
1702 struct jffs_file *f; 1702 struct jffs_file *f;
1703 int i = ino % c->hash_len; 1703 int i = ino % c->hash_len;
1704 struct list_head *tmp;
1705 1704
1706 D3(printk("jffs_find_file(): ino: %u\n", ino)); 1705 D3(printk("jffs_find_file(): ino: %u\n", ino));
1707 1706
1708 for (tmp = c->hash[i].next; tmp != &c->hash[i]; tmp = tmp->next) { 1707 list_for_each_entry(f, &c->hash[i], hash) {
1709 f = list_entry(tmp, struct jffs_file, hash);
1710 if (ino != f->ino) 1708 if (ino != f->ino)
1711 continue; 1709 continue;
1712 D3(printk("jffs_find_file(): Found file with ino " 1710 D3(printk("jffs_find_file(): Found file with ino "
@@ -2102,13 +2100,12 @@ jffs_foreach_file(struct jffs_control *c, int (*func)(struct jffs_file *))
2102 int result = 0; 2100 int result = 0;
2103 2101
2104 for (pos = 0; pos < c->hash_len; pos++) { 2102 for (pos = 0; pos < c->hash_len; pos++) {
2105 struct list_head *p, *next; 2103 struct jffs_file *f, *next;
2106 for (p = c->hash[pos].next; p != &c->hash[pos]; p = next) { 2104
2107 /* We need a reference to the next file in the 2105 /* We must do _safe, because 'func' might remove the
2108 list because `func' might remove the current 2106 current file 'f' from the list. */
2109 file `f'. */ 2107 list_for_each_entry_safe(f, next, &c->hash[pos], hash) {
2110 next = p->next; 2108 r = func(f);
2111 r = func(list_entry(p, struct jffs_file, hash));
2112 if (r < 0) 2109 if (r < 0)
2113 return r; 2110 return r;
2114 result += r; 2111 result += r;
@@ -2613,9 +2610,8 @@ jffs_print_hash_table(struct jffs_control *c)
2613 2610
2614 printk("JFFS: Dumping the file system's hash table...\n"); 2611 printk("JFFS: Dumping the file system's hash table...\n");
2615 for (i = 0; i < c->hash_len; i++) { 2612 for (i = 0; i < c->hash_len; i++) {
2616 struct list_head *p; 2613 struct jffs_file *f;
2617 for (p = c->hash[i].next; p != &c->hash[i]; p = p->next) { 2614 list_for_each_entry(f, &c->hash[i], hash) {
2618 struct jffs_file *f=list_entry(p,struct jffs_file,hash);
2619 printk("*** c->hash[%u]: \"%s\" " 2615 printk("*** c->hash[%u]: \"%s\" "
2620 "(ino: %u, pino: %u)\n", 2616 "(ino: %u, pino: %u)\n",
2621 i, (f->name ? f->name : ""), 2617 i, (f->name ? f->name : ""),
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c
index 14b3ce87fa29..87332f30141b 100644
--- a/fs/lockd/clntproc.c
+++ b/fs/lockd/clntproc.c
@@ -299,8 +299,7 @@ nlmclnt_alloc_call(void)
299 return call; 299 return call;
300 } 300 }
301 printk("nlmclnt_alloc_call: failed, waiting for memory\n"); 301 printk("nlmclnt_alloc_call: failed, waiting for memory\n");
302 current->state = TASK_INTERRUPTIBLE; 302 schedule_timeout_interruptible(5*HZ);
303 schedule_timeout(5*HZ);
304 } 303 }
305 return NULL; 304 return NULL;
306} 305}
diff --git a/fs/namespace.c b/fs/namespace.c
index 34156260c9b6..2fa9fdf7d6f5 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -537,7 +537,6 @@ lives_below_in_same_fs(struct dentry *d, struct dentry *dentry)
537static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry) 537static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry)
538{ 538{
539 struct vfsmount *res, *p, *q, *r, *s; 539 struct vfsmount *res, *p, *q, *r, *s;
540 struct list_head *h;
541 struct nameidata nd; 540 struct nameidata nd;
542 541
543 res = q = clone_mnt(mnt, dentry); 542 res = q = clone_mnt(mnt, dentry);
@@ -546,8 +545,7 @@ static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry)
546 q->mnt_mountpoint = mnt->mnt_mountpoint; 545 q->mnt_mountpoint = mnt->mnt_mountpoint;
547 546
548 p = mnt; 547 p = mnt;
549 for (h = mnt->mnt_mounts.next; h != &mnt->mnt_mounts; h = h->next) { 548 list_for_each_entry(r, &mnt->mnt_mounts, mnt_child) {
550 r = list_entry(h, struct vfsmount, mnt_child);
551 if (!lives_below_in_same_fs(r->mnt_mountpoint, dentry)) 549 if (!lives_below_in_same_fs(r->mnt_mountpoint, dentry))
552 continue; 550 continue;
553 551
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
index 2681485cf2d0..edc95514046d 100644
--- a/fs/nfs/nfs3proc.c
+++ b/fs/nfs/nfs3proc.c
@@ -34,8 +34,7 @@ nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
34 res = rpc_call_sync(clnt, msg, flags); 34 res = rpc_call_sync(clnt, msg, flags);
35 if (res != -EJUKEBOX) 35 if (res != -EJUKEBOX)
36 break; 36 break;
37 set_current_state(TASK_INTERRUPTIBLE); 37 schedule_timeout_interruptible(NFS_JUKEBOX_RETRY_TIME);
38 schedule_timeout(NFS_JUKEBOX_RETRY_TIME);
39 res = -ERESTARTSYS; 38 res = -ERESTARTSYS;
40 } while (!signalled()); 39 } while (!signalled());
41 rpc_clnt_sigunmask(clnt, &oldset); 40 rpc_clnt_sigunmask(clnt, &oldset);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 0c5a308e4963..9701ca8c9428 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2418,14 +2418,11 @@ static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2418 *timeout = NFS4_POLL_RETRY_MAX; 2418 *timeout = NFS4_POLL_RETRY_MAX;
2419 rpc_clnt_sigmask(clnt, &oldset); 2419 rpc_clnt_sigmask(clnt, &oldset);
2420 if (clnt->cl_intr) { 2420 if (clnt->cl_intr) {
2421 set_current_state(TASK_INTERRUPTIBLE); 2421 schedule_timeout_interruptible(*timeout);
2422 schedule_timeout(*timeout);
2423 if (signalled()) 2422 if (signalled())
2424 res = -ERESTARTSYS; 2423 res = -ERESTARTSYS;
2425 } else { 2424 } else
2426 set_current_state(TASK_UNINTERRUPTIBLE); 2425 schedule_timeout_uninterruptible(*timeout);
2427 schedule_timeout(*timeout);
2428 }
2429 rpc_clnt_sigunmask(clnt, &oldset); 2426 rpc_clnt_sigunmask(clnt, &oldset);
2430 *timeout <<= 1; 2427 *timeout <<= 1;
2431 return res; 2428 return res;
@@ -2578,8 +2575,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
2578static unsigned long 2575static unsigned long
2579nfs4_set_lock_task_retry(unsigned long timeout) 2576nfs4_set_lock_task_retry(unsigned long timeout)
2580{ 2577{
2581 current->state = TASK_INTERRUPTIBLE; 2578 schedule_timeout_interruptible(timeout);
2582 schedule_timeout(timeout);
2583 timeout <<= 1; 2579 timeout <<= 1;
2584 if (timeout > NFS4_LOCK_MAXTIMEOUT) 2580 if (timeout > NFS4_LOCK_MAXTIMEOUT)
2585 return NFS4_LOCK_MAXTIMEOUT; 2581 return NFS4_LOCK_MAXTIMEOUT;
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
index 545236414d59..b6cc8cf24626 100644
--- a/fs/ntfs/aops.c
+++ b/fs/ntfs/aops.c
@@ -27,6 +27,7 @@
27#include <linux/swap.h> 27#include <linux/swap.h>
28#include <linux/buffer_head.h> 28#include <linux/buffer_head.h>
29#include <linux/writeback.h> 29#include <linux/writeback.h>
30#include <linux/bit_spinlock.h>
30 31
31#include "aops.h" 32#include "aops.h"
32#include "attrib.h" 33#include "attrib.h"
diff --git a/fs/pipe.c b/fs/pipe.c
index 2c7a23dde2d8..66aa0b938d6a 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -39,7 +39,11 @@ void pipe_wait(struct inode * inode)
39{ 39{
40 DEFINE_WAIT(wait); 40 DEFINE_WAIT(wait);
41 41
42 prepare_to_wait(PIPE_WAIT(*inode), &wait, TASK_INTERRUPTIBLE); 42 /*
43 * Pipes are system-local resources, so sleeping on them
44 * is considered a noninteractive wait:
45 */
46 prepare_to_wait(PIPE_WAIT(*inode), &wait, TASK_INTERRUPTIBLE|TASK_NONINTERACTIVE);
43 up(PIPE_SEM(*inode)); 47 up(PIPE_SEM(*inode));
44 schedule(); 48 schedule();
45 finish_wait(PIPE_WAIT(*inode), &wait); 49 finish_wait(PIPE_WAIT(*inode), &wait);
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index a8e29e9bbbd0..4b15761434bc 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -2868,8 +2868,7 @@ static void let_transaction_grow(struct super_block *sb, unsigned long trans_id)
2868 struct reiserfs_journal *journal = SB_JOURNAL(sb); 2868 struct reiserfs_journal *journal = SB_JOURNAL(sb);
2869 unsigned long bcount = journal->j_bcount; 2869 unsigned long bcount = journal->j_bcount;
2870 while (1) { 2870 while (1) {
2871 set_current_state(TASK_UNINTERRUPTIBLE); 2871 schedule_timeout_uninterruptible(1);
2872 schedule_timeout(1);
2873 journal->j_current_jl->j_state |= LIST_COMMIT_PENDING; 2872 journal->j_current_jl->j_state |= LIST_COMMIT_PENDING;
2874 while ((atomic_read(&journal->j_wcount) > 0 || 2873 while ((atomic_read(&journal->j_wcount) > 0 ||
2875 atomic_read(&journal->j_jlock)) && 2874 atomic_read(&journal->j_jlock)) &&
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
index 6951c35755be..44b02fc02ebe 100644
--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -1934,8 +1934,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
1934 if (SB_AP_BITMAP(s)) 1934 if (SB_AP_BITMAP(s))
1935 brelse(SB_AP_BITMAP(s)[j].bh); 1935 brelse(SB_AP_BITMAP(s)[j].bh);
1936 } 1936 }
1937 if (SB_AP_BITMAP(s)) 1937 vfree(SB_AP_BITMAP(s));
1938 vfree(SB_AP_BITMAP(s));
1939 } 1938 }
1940 if (SB_BUFFER_WITH_SB(s)) 1939 if (SB_BUFFER_WITH_SB(s))
1941 brelse(SB_BUFFER_WITH_SB(s)); 1940 brelse(SB_BUFFER_WITH_SB(s));
diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c
index 220babe91efd..38ab558835c4 100644
--- a/fs/smbfs/proc.c
+++ b/fs/smbfs/proc.c
@@ -2397,8 +2397,7 @@ smb_proc_readdir_long(struct file *filp, void *dirent, filldir_t filldir,
2397 if (req->rq_rcls == ERRSRV && req->rq_err == ERRerror) { 2397 if (req->rq_rcls == ERRSRV && req->rq_err == ERRerror) {
2398 /* a damn Win95 bug - sometimes it clags if you 2398 /* a damn Win95 bug - sometimes it clags if you
2399 ask it too fast */ 2399 ask it too fast */
2400 current->state = TASK_INTERRUPTIBLE; 2400 schedule_timeout_interruptible(msecs_to_jiffies(200));
2401 schedule_timeout(HZ/5);
2402 continue; 2401 continue;
2403 } 2402 }
2404 2403
diff --git a/fs/xfs/linux-2.6/time.h b/fs/xfs/linux-2.6/time.h
index 6c6fd0faa8e1..b0d2873ab274 100644
--- a/fs/xfs/linux-2.6/time.h
+++ b/fs/xfs/linux-2.6/time.h
@@ -39,8 +39,7 @@ typedef struct timespec timespec_t;
39 39
40static inline void delay(long ticks) 40static inline void delay(long ticks)
41{ 41{
42 set_current_state(TASK_UNINTERRUPTIBLE); 42 schedule_timeout_uninterruptible(ticks);
43 schedule_timeout(ticks);
44} 43}
45 44
46static inline void nanotime(struct timespec *tvp) 45static inline void nanotime(struct timespec *tvp)
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index 655bf4a78afe..e82cf72ac599 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -1780,10 +1780,10 @@ xfsbufd(
1780 xfsbufd_force_sleep = 0; 1780 xfsbufd_force_sleep = 0;
1781 } 1781 }
1782 1782
1783 set_current_state(TASK_INTERRUPTIBLE); 1783 schedule_timeout_interruptible
1784 schedule_timeout((xfs_buf_timer_centisecs * HZ) / 100); 1784 (xfs_buf_timer_centisecs * msecs_to_jiffies(10));
1785 1785
1786 age = (xfs_buf_age_centisecs * HZ) / 100; 1786 age = xfs_buf_age_centisecs * msecs_to_jiffies(10);
1787 spin_lock(&pbd_delwrite_lock); 1787 spin_lock(&pbd_delwrite_lock);
1788 list_for_each_entry_safe(pb, n, &pbd_delwrite_queue, pb_list) { 1788 list_for_each_entry_safe(pb, n, &pbd_delwrite_queue, pb_list) {
1789 PB_TRACE(pb, "walkq1", (long)pagebuf_ispin(pb)); 1789 PB_TRACE(pb, "walkq1", (long)pagebuf_ispin(pb));
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
index 0da87bfc9999..2302454d8d47 100644
--- a/fs/xfs/linux-2.6/xfs_super.c
+++ b/fs/xfs/linux-2.6/xfs_super.c
@@ -467,7 +467,7 @@ xfs_flush_inode(
467 467
468 igrab(inode); 468 igrab(inode);
469 xfs_syncd_queue_work(vfs, inode, xfs_flush_inode_work); 469 xfs_syncd_queue_work(vfs, inode, xfs_flush_inode_work);
470 delay(HZ/2); 470 delay(msecs_to_jiffies(500));
471} 471}
472 472
473/* 473/*
@@ -492,7 +492,7 @@ xfs_flush_device(
492 492
493 igrab(inode); 493 igrab(inode);
494 xfs_syncd_queue_work(vfs, inode, xfs_flush_device_work); 494 xfs_syncd_queue_work(vfs, inode, xfs_flush_device_work);
495 delay(HZ/2); 495 delay(msecs_to_jiffies(500));
496 xfs_log_force(ip->i_mount, (xfs_lsn_t)0, XFS_LOG_FORCE|XFS_LOG_SYNC); 496 xfs_log_force(ip->i_mount, (xfs_lsn_t)0, XFS_LOG_FORCE|XFS_LOG_SYNC);
497} 497}
498 498
@@ -520,10 +520,9 @@ xfssyncd(
520 struct vfs_sync_work *work, *n; 520 struct vfs_sync_work *work, *n;
521 LIST_HEAD (tmp); 521 LIST_HEAD (tmp);
522 522
523 timeleft = (xfs_syncd_centisecs * HZ) / 100; 523 timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10);
524 for (;;) { 524 for (;;) {
525 set_current_state(TASK_INTERRUPTIBLE); 525 timeleft = schedule_timeout_interruptible(timeleft);
526 timeleft = schedule_timeout(timeleft);
527 /* swsusp */ 526 /* swsusp */
528 try_to_freeze(); 527 try_to_freeze();
529 if (kthread_should_stop()) 528 if (kthread_should_stop())
@@ -537,7 +536,8 @@ xfssyncd(
537 */ 536 */
538 if (!timeleft || list_empty(&vfsp->vfs_sync_list)) { 537 if (!timeleft || list_empty(&vfsp->vfs_sync_list)) {
539 if (!timeleft) 538 if (!timeleft)
540 timeleft = (xfs_syncd_centisecs * HZ) / 100; 539 timeleft = xfs_syncd_centisecs *
540 msecs_to_jiffies(10);
541 INIT_LIST_HEAD(&vfsp->vfs_sync_work.w_list); 541 INIT_LIST_HEAD(&vfsp->vfs_sync_work.w_list);
542 list_add_tail(&vfsp->vfs_sync_work.w_list, 542 list_add_tail(&vfsp->vfs_sync_work.w_list,
543 &vfsp->vfs_sync_list); 543 &vfsp->vfs_sync_list);
diff --git a/include/asm-alpha/spinlock.h b/include/asm-alpha/spinlock.h
index 80780dba9986..8197c69eff44 100644
--- a/include/asm-alpha/spinlock.h
+++ b/include/asm-alpha/spinlock.h
@@ -6,7 +6,6 @@
6#include <linux/kernel.h> 6#include <linux/kernel.h>
7#include <asm/current.h> 7#include <asm/current.h>
8 8
9
10/* 9/*
11 * Simple spin lock operations. There are two variants, one clears IRQ's 10 * Simple spin lock operations. There are two variants, one clears IRQ's
12 * on the local processor, one does not. 11 * on the local processor, one does not.
@@ -14,43 +13,18 @@
14 * We make no fairness assumptions. They have a cost. 13 * We make no fairness assumptions. They have a cost.
15 */ 14 */
16 15
17typedef struct { 16#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
18 volatile unsigned int lock; 17#define __raw_spin_is_locked(x) ((x)->lock != 0)
19#ifdef CONFIG_DEBUG_SPINLOCK 18#define __raw_spin_unlock_wait(x) \
20 int on_cpu; 19 do { cpu_relax(); } while ((x)->lock)
21 int line_no; 20
22 void *previous; 21static inline void __raw_spin_unlock(raw_spinlock_t * lock)
23 struct task_struct * task;
24 const char *base_file;
25#endif
26} spinlock_t;
27
28#ifdef CONFIG_DEBUG_SPINLOCK
29#define SPIN_LOCK_UNLOCKED (spinlock_t){ 0, -1, 0, NULL, NULL, NULL }
30#else
31#define SPIN_LOCK_UNLOCKED (spinlock_t){ 0 }
32#endif
33
34#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
35#define spin_is_locked(x) ((x)->lock != 0)
36#define spin_unlock_wait(x) do { barrier(); } while ((x)->lock)
37
38#ifdef CONFIG_DEBUG_SPINLOCK
39extern void _raw_spin_unlock(spinlock_t * lock);
40extern void debug_spin_lock(spinlock_t * lock, const char *, int);
41extern int debug_spin_trylock(spinlock_t * lock, const char *, int);
42#define _raw_spin_lock(LOCK) \
43 debug_spin_lock(LOCK, __BASE_FILE__, __LINE__)
44#define _raw_spin_trylock(LOCK) \
45 debug_spin_trylock(LOCK, __BASE_FILE__, __LINE__)
46#else
47static inline void _raw_spin_unlock(spinlock_t * lock)
48{ 22{
49 mb(); 23 mb();
50 lock->lock = 0; 24 lock->lock = 0;
51} 25}
52 26
53static inline void _raw_spin_lock(spinlock_t * lock) 27static inline void __raw_spin_lock(raw_spinlock_t * lock)
54{ 28{
55 long tmp; 29 long tmp;
56 30
@@ -70,80 +44,64 @@ static inline void _raw_spin_lock(spinlock_t * lock)
70 : "m"(lock->lock) : "memory"); 44 : "m"(lock->lock) : "memory");
71} 45}
72 46
73static inline int _raw_spin_trylock(spinlock_t *lock) 47static inline int __raw_spin_trylock(raw_spinlock_t *lock)
74{ 48{
75 return !test_and_set_bit(0, &lock->lock); 49 return !test_and_set_bit(0, &lock->lock);
76} 50}
77#endif /* CONFIG_DEBUG_SPINLOCK */
78
79#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
80 51
81/***********************************************************/ 52/***********************************************************/
82 53
83typedef struct { 54static inline int __raw_read_can_lock(raw_rwlock_t *lock)
84 volatile unsigned int lock;
85} rwlock_t;
86
87#define RW_LOCK_UNLOCKED (rwlock_t){ 0 }
88
89#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
90
91static inline int read_can_lock(rwlock_t *lock)
92{ 55{
93 return (lock->lock & 1) == 0; 56 return (lock->lock & 1) == 0;
94} 57}
95 58
96static inline int write_can_lock(rwlock_t *lock) 59static inline int __raw_write_can_lock(raw_rwlock_t *lock)
97{ 60{
98 return lock->lock == 0; 61 return lock->lock == 0;
99} 62}
100 63
101#ifdef CONFIG_DEBUG_RWLOCK 64static inline void __raw_read_lock(raw_rwlock_t *lock)
102extern void _raw_write_lock(rwlock_t * lock);
103extern void _raw_read_lock(rwlock_t * lock);
104#else
105static inline void _raw_write_lock(rwlock_t * lock)
106{ 65{
107 long regx; 66 long regx;
108 67
109 __asm__ __volatile__( 68 __asm__ __volatile__(
110 "1: ldl_l %1,%0\n" 69 "1: ldl_l %1,%0\n"
111 " bne %1,6f\n" 70 " blbs %1,6f\n"
112 " lda %1,1\n" 71 " subl %1,2,%1\n"
113 " stl_c %1,%0\n" 72 " stl_c %1,%0\n"
114 " beq %1,6f\n" 73 " beq %1,6f\n"
115 " mb\n" 74 " mb\n"
116 ".subsection 2\n" 75 ".subsection 2\n"
117 "6: ldl %1,%0\n" 76 "6: ldl %1,%0\n"
118 " bne %1,6b\n" 77 " blbs %1,6b\n"
119 " br 1b\n" 78 " br 1b\n"
120 ".previous" 79 ".previous"
121 : "=m" (*lock), "=&r" (regx) 80 : "=m" (*lock), "=&r" (regx)
122 : "m" (*lock) : "memory"); 81 : "m" (*lock) : "memory");
123} 82}
124 83
125static inline void _raw_read_lock(rwlock_t * lock) 84static inline void __raw_write_lock(raw_rwlock_t *lock)
126{ 85{
127 long regx; 86 long regx;
128 87
129 __asm__ __volatile__( 88 __asm__ __volatile__(
130 "1: ldl_l %1,%0\n" 89 "1: ldl_l %1,%0\n"
131 " blbs %1,6f\n" 90 " bne %1,6f\n"
132 " subl %1,2,%1\n" 91 " lda %1,1\n"
133 " stl_c %1,%0\n" 92 " stl_c %1,%0\n"
134 " beq %1,6f\n" 93 " beq %1,6f\n"
135 " mb\n" 94 " mb\n"
136 ".subsection 2\n" 95 ".subsection 2\n"
137 "6: ldl %1,%0\n" 96 "6: ldl %1,%0\n"
138 " blbs %1,6b\n" 97 " bne %1,6b\n"
139 " br 1b\n" 98 " br 1b\n"
140 ".previous" 99 ".previous"
141 : "=m" (*lock), "=&r" (regx) 100 : "=m" (*lock), "=&r" (regx)
142 : "m" (*lock) : "memory"); 101 : "m" (*lock) : "memory");
143} 102}
144#endif /* CONFIG_DEBUG_RWLOCK */
145 103
146static inline int _raw_read_trylock(rwlock_t * lock) 104static inline int __raw_read_trylock(raw_rwlock_t * lock)
147{ 105{
148 long regx; 106 long regx;
149 int success; 107 int success;
@@ -165,7 +123,7 @@ static inline int _raw_read_trylock(rwlock_t * lock)
165 return success; 123 return success;
166} 124}
167 125
168static inline int _raw_write_trylock(rwlock_t * lock) 126static inline int __raw_write_trylock(raw_rwlock_t * lock)
169{ 127{
170 long regx; 128 long regx;
171 int success; 129 int success;
@@ -187,13 +145,7 @@ static inline int _raw_write_trylock(rwlock_t * lock)
187 return success; 145 return success;
188} 146}
189 147
190static inline void _raw_write_unlock(rwlock_t * lock) 148static inline void __raw_read_unlock(raw_rwlock_t * lock)
191{
192 mb();
193 lock->lock = 0;
194}
195
196static inline void _raw_read_unlock(rwlock_t * lock)
197{ 149{
198 long regx; 150 long regx;
199 __asm__ __volatile__( 151 __asm__ __volatile__(
@@ -209,4 +161,10 @@ static inline void _raw_read_unlock(rwlock_t * lock)
209 : "m" (*lock) : "memory"); 161 : "m" (*lock) : "memory");
210} 162}
211 163
164static inline void __raw_write_unlock(raw_rwlock_t * lock)
165{
166 mb();
167 lock->lock = 0;
168}
169
212#endif /* _ALPHA_SPINLOCK_H */ 170#endif /* _ALPHA_SPINLOCK_H */
diff --git a/include/asm-alpha/spinlock_types.h b/include/asm-alpha/spinlock_types.h
new file mode 100644
index 000000000000..8141eb5ebf0d
--- /dev/null
+++ b/include/asm-alpha/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef _ALPHA_SPINLOCK_TYPES_H
2#define _ALPHA_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-arm/spinlock.h b/include/asm-arm/spinlock.h
index 1f906d09b688..cb4906b45555 100644
--- a/include/asm-arm/spinlock.h
+++ b/include/asm-arm/spinlock.h
@@ -16,21 +16,14 @@
16 * Unlocked value: 0 16 * Unlocked value: 0
17 * Locked value: 1 17 * Locked value: 1
18 */ 18 */
19typedef struct {
20 volatile unsigned int lock;
21#ifdef CONFIG_PREEMPT
22 unsigned int break_lock;
23#endif
24} spinlock_t;
25 19
26#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } 20#define __raw_spin_is_locked(x) ((x)->lock != 0)
21#define __raw_spin_unlock_wait(lock) \
22 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
27 23
28#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while (0) 24#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
29#define spin_is_locked(x) ((x)->lock != 0)
30#define spin_unlock_wait(x) do { barrier(); } while (spin_is_locked(x))
31#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
32 25
33static inline void _raw_spin_lock(spinlock_t *lock) 26static inline void __raw_spin_lock(raw_spinlock_t *lock)
34{ 27{
35 unsigned long tmp; 28 unsigned long tmp;
36 29
@@ -47,7 +40,7 @@ static inline void _raw_spin_lock(spinlock_t *lock)
47 smp_mb(); 40 smp_mb();
48} 41}
49 42
50static inline int _raw_spin_trylock(spinlock_t *lock) 43static inline int __raw_spin_trylock(raw_spinlock_t *lock)
51{ 44{
52 unsigned long tmp; 45 unsigned long tmp;
53 46
@@ -67,7 +60,7 @@ static inline int _raw_spin_trylock(spinlock_t *lock)
67 } 60 }
68} 61}
69 62
70static inline void _raw_spin_unlock(spinlock_t *lock) 63static inline void __raw_spin_unlock(raw_spinlock_t *lock)
71{ 64{
72 smp_mb(); 65 smp_mb();
73 66
@@ -80,23 +73,14 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
80 73
81/* 74/*
82 * RWLOCKS 75 * RWLOCKS
83 */ 76 *
84typedef struct { 77 *
85 volatile unsigned int lock;
86#ifdef CONFIG_PREEMPT
87 unsigned int break_lock;
88#endif
89} rwlock_t;
90
91#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
92#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while (0)
93#define rwlock_is_locked(x) (*((volatile unsigned int *)(x)) != 0)
94
95/*
96 * Write locks are easy - we just set bit 31. When unlocking, we can 78 * Write locks are easy - we just set bit 31. When unlocking, we can
97 * just write zero since the lock is exclusively held. 79 * just write zero since the lock is exclusively held.
98 */ 80 */
99static inline void _raw_write_lock(rwlock_t *rw) 81#define rwlock_is_locked(x) (*((volatile unsigned int *)(x)) != 0)
82
83static inline void __raw_write_lock(rwlock_t *rw)
100{ 84{
101 unsigned long tmp; 85 unsigned long tmp;
102 86
@@ -113,7 +97,7 @@ static inline void _raw_write_lock(rwlock_t *rw)
113 smp_mb(); 97 smp_mb();
114} 98}
115 99
116static inline int _raw_write_trylock(rwlock_t *rw) 100static inline int __raw_write_trylock(rwlock_t *rw)
117{ 101{
118 unsigned long tmp; 102 unsigned long tmp;
119 103
@@ -133,7 +117,7 @@ static inline int _raw_write_trylock(rwlock_t *rw)
133 } 117 }
134} 118}
135 119
136static inline void _raw_write_unlock(rwlock_t *rw) 120static inline void __raw_write_unlock(raw_rwlock_t *rw)
137{ 121{
138 smp_mb(); 122 smp_mb();
139 123
@@ -156,7 +140,7 @@ static inline void _raw_write_unlock(rwlock_t *rw)
156 * currently active. However, we know we won't have any write 140 * currently active. However, we know we won't have any write
157 * locks. 141 * locks.
158 */ 142 */
159static inline void _raw_read_lock(rwlock_t *rw) 143static inline void __raw_read_lock(raw_rwlock_t *rw)
160{ 144{
161 unsigned long tmp, tmp2; 145 unsigned long tmp, tmp2;
162 146
@@ -173,7 +157,7 @@ static inline void _raw_read_lock(rwlock_t *rw)
173 smp_mb(); 157 smp_mb();
174} 158}
175 159
176static inline void _raw_read_unlock(rwlock_t *rw) 160static inline void __raw_read_unlock(rwlock_t *rw)
177{ 161{
178 unsigned long tmp, tmp2; 162 unsigned long tmp, tmp2;
179 163
@@ -190,6 +174,6 @@ static inline void _raw_read_unlock(rwlock_t *rw)
190 : "cc"); 174 : "cc");
191} 175}
192 176
193#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 177#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
194 178
195#endif /* __ASM_SPINLOCK_H */ 179#endif /* __ASM_SPINLOCK_H */
diff --git a/include/asm-arm/spinlock_types.h b/include/asm-arm/spinlock_types.h
new file mode 100644
index 000000000000..43e83f6d2ee5
--- /dev/null
+++ b/include/asm-arm/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h
index 278de61224d1..c49df635a80f 100644
--- a/include/asm-arm/unistd.h
+++ b/include/asm-arm/unistd.h
@@ -355,6 +355,9 @@
355#define __NR_inotify_init (__NR_SYSCALL_BASE+316) 355#define __NR_inotify_init (__NR_SYSCALL_BASE+316)
356#define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317) 356#define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317)
357#define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318) 357#define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318)
358#define __NR_mbind (__NR_SYSCALL_BASE+319)
359#define __NR_get_mempolicy (__NR_SYSCALL_BASE+320)
360#define __NR_set_mempolicy (__NR_SYSCALL_BASE+321)
358 361
359/* 362/*
360 * The following SWIs are ARM private. 363 * The following SWIs are ARM private.
diff --git a/include/asm-arm26/hardirq.h b/include/asm-arm26/hardirq.h
index 791ee1da9bfa..dc28daab8aa8 100644
--- a/include/asm-arm26/hardirq.h
+++ b/include/asm-arm26/hardirq.h
@@ -22,8 +22,6 @@ typedef struct {
22# error HARDIRQ_BITS is too low! 22# error HARDIRQ_BITS is too low!
23#endif 23#endif
24 24
25#define irq_enter() (preempt_count() += HARDIRQ_OFFSET)
26
27#ifndef CONFIG_SMP 25#ifndef CONFIG_SMP
28 26
29extern asmlinkage void __do_softirq(void); 27extern asmlinkage void __do_softirq(void);
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 6f857be2b644..a9c55490fb82 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -103,3 +103,41 @@
103 VMLINUX_SYMBOL(__kprobes_text_start) = .; \ 103 VMLINUX_SYMBOL(__kprobes_text_start) = .; \
104 *(.kprobes.text) \ 104 *(.kprobes.text) \
105 VMLINUX_SYMBOL(__kprobes_text_end) = .; 105 VMLINUX_SYMBOL(__kprobes_text_end) = .;
106
107 /* DWARF debug sections.
108 Symbols in the DWARF debugging sections are relative to
109 the beginning of the section so we begin them at 0. */
110#define DWARF_DEBUG \
111 /* DWARF 1 */ \
112 .debug 0 : { *(.debug) } \
113 .line 0 : { *(.line) } \
114 /* GNU DWARF 1 extensions */ \
115 .debug_srcinfo 0 : { *(.debug_srcinfo) } \
116 .debug_sfnames 0 : { *(.debug_sfnames) } \
117 /* DWARF 1.1 and DWARF 2 */ \
118 .debug_aranges 0 : { *(.debug_aranges) } \
119 .debug_pubnames 0 : { *(.debug_pubnames) } \
120 /* DWARF 2 */ \
121 .debug_info 0 : { *(.debug_info \
122 .gnu.linkonce.wi.*) } \
123 .debug_abbrev 0 : { *(.debug_abbrev) } \
124 .debug_line 0 : { *(.debug_line) } \
125 .debug_frame 0 : { *(.debug_frame) } \
126 .debug_str 0 : { *(.debug_str) } \
127 .debug_loc 0 : { *(.debug_loc) } \
128 .debug_macinfo 0 : { *(.debug_macinfo) } \
129 /* SGI/MIPS DWARF 2 extensions */ \
130 .debug_weaknames 0 : { *(.debug_weaknames) } \
131 .debug_funcnames 0 : { *(.debug_funcnames) } \
132 .debug_typenames 0 : { *(.debug_typenames) } \
133 .debug_varnames 0 : { *(.debug_varnames) } \
134
135 /* Stabs debugging sections. */
136#define STABS_DEBUG \
137 .stab 0 : { *(.stab) } \
138 .stabstr 0 : { *(.stabstr) } \
139 .stab.excl 0 : { *(.stab.excl) } \
140 .stab.exclstr 0 : { *(.stab.exclstr) } \
141 .stab.index 0 : { *(.stab.index) } \
142 .stab.indexstr 0 : { *(.stab.indexstr) } \
143 .comment 0 : { *(.comment) }
diff --git a/include/asm-i386/div64.h b/include/asm-i386/div64.h
index 28ed8b296afc..75c67c785bb8 100644
--- a/include/asm-i386/div64.h
+++ b/include/asm-i386/div64.h
@@ -35,7 +35,7 @@
35 */ 35 */
36#define div_long_long_rem(a,b,c) div_ll_X_l_rem(a,b,c) 36#define div_long_long_rem(a,b,c) div_ll_X_l_rem(a,b,c)
37 37
38extern inline long 38static inline long
39div_ll_X_l_rem(long long divs, long div, long *rem) 39div_ll_X_l_rem(long long divs, long div, long *rem)
40{ 40{
41 long dum2; 41 long dum2;
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h
index 37bef8ed7bed..0a4ec764377c 100644
--- a/include/asm-i386/processor.h
+++ b/include/asm-i386/processor.h
@@ -679,7 +679,7 @@ static inline void rep_nop(void)
679 However we don't do prefetches for pre XP Athlons currently 679 However we don't do prefetches for pre XP Athlons currently
680 That should be fixed. */ 680 That should be fixed. */
681#define ARCH_HAS_PREFETCH 681#define ARCH_HAS_PREFETCH
682extern inline void prefetch(const void *x) 682static inline void prefetch(const void *x)
683{ 683{
684 alternative_input(ASM_NOP4, 684 alternative_input(ASM_NOP4,
685 "prefetchnta (%1)", 685 "prefetchnta (%1)",
@@ -693,7 +693,7 @@ extern inline void prefetch(const void *x)
693 693
694/* 3dnow! prefetch to get an exclusive cache line. Useful for 694/* 3dnow! prefetch to get an exclusive cache line. Useful for
695 spinlocks to avoid one state transition in the cache coherency protocol. */ 695 spinlocks to avoid one state transition in the cache coherency protocol. */
696extern inline void prefetchw(const void *x) 696static inline void prefetchw(const void *x)
697{ 697{
698 alternative_input(ASM_NOP4, 698 alternative_input(ASM_NOP4,
699 "prefetchw (%1)", 699 "prefetchw (%1)",
diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h
index f9ff31f40036..23604350cdf4 100644
--- a/include/asm-i386/spinlock.h
+++ b/include/asm-i386/spinlock.h
@@ -7,46 +7,21 @@
7#include <linux/config.h> 7#include <linux/config.h>
8#include <linux/compiler.h> 8#include <linux/compiler.h>
9 9
10asmlinkage int printk(const char * fmt, ...)
11 __attribute__ ((format (printf, 1, 2)));
12
13/* 10/*
14 * Your basic SMP spinlocks, allowing only a single CPU anywhere 11 * Your basic SMP spinlocks, allowing only a single CPU anywhere
15 */ 12 *
16
17typedef struct {
18 volatile unsigned int slock;
19#ifdef CONFIG_DEBUG_SPINLOCK
20 unsigned magic;
21#endif
22#ifdef CONFIG_PREEMPT
23 unsigned int break_lock;
24#endif
25} spinlock_t;
26
27#define SPINLOCK_MAGIC 0xdead4ead
28
29#ifdef CONFIG_DEBUG_SPINLOCK
30#define SPINLOCK_MAGIC_INIT , SPINLOCK_MAGIC
31#else
32#define SPINLOCK_MAGIC_INIT /* */
33#endif
34
35#define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 SPINLOCK_MAGIC_INIT }
36
37#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
38
39/*
40 * Simple spin lock operations. There are two variants, one clears IRQ's 13 * Simple spin lock operations. There are two variants, one clears IRQ's
41 * on the local processor, one does not. 14 * on the local processor, one does not.
42 * 15 *
43 * We make no fairness assumptions. They have a cost. 16 * We make no fairness assumptions. They have a cost.
17 *
18 * (the type definitions are in asm/spinlock_types.h)
44 */ 19 */
45 20
46#define spin_is_locked(x) (*(volatile signed char *)(&(x)->slock) <= 0) 21#define __raw_spin_is_locked(x) \
47#define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x)) 22 (*(volatile signed char *)(&(x)->slock) <= 0)
48 23
49#define spin_lock_string \ 24#define __raw_spin_lock_string \
50 "\n1:\t" \ 25 "\n1:\t" \
51 "lock ; decb %0\n\t" \ 26 "lock ; decb %0\n\t" \
52 "jns 3f\n" \ 27 "jns 3f\n" \
@@ -57,7 +32,7 @@ typedef struct {
57 "jmp 1b\n" \ 32 "jmp 1b\n" \
58 "3:\n\t" 33 "3:\n\t"
59 34
60#define spin_lock_string_flags \ 35#define __raw_spin_lock_string_flags \
61 "\n1:\t" \ 36 "\n1:\t" \
62 "lock ; decb %0\n\t" \ 37 "lock ; decb %0\n\t" \
63 "jns 4f\n\t" \ 38 "jns 4f\n\t" \
@@ -73,86 +48,71 @@ typedef struct {
73 "jmp 1b\n" \ 48 "jmp 1b\n" \
74 "4:\n\t" 49 "4:\n\t"
75 50
51static inline void __raw_spin_lock(raw_spinlock_t *lock)
52{
53 __asm__ __volatile__(
54 __raw_spin_lock_string
55 :"=m" (lock->slock) : : "memory");
56}
57
58static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
59{
60 __asm__ __volatile__(
61 __raw_spin_lock_string_flags
62 :"=m" (lock->slock) : "r" (flags) : "memory");
63}
64
65static inline int __raw_spin_trylock(raw_spinlock_t *lock)
66{
67 char oldval;
68 __asm__ __volatile__(
69 "xchgb %b0,%1"
70 :"=q" (oldval), "=m" (lock->slock)
71 :"0" (0) : "memory");
72 return oldval > 0;
73}
74
76/* 75/*
77 * This works. Despite all the confusion. 76 * __raw_spin_unlock based on writing $1 to the low byte.
78 * (except on PPro SMP or if we are using OOSTORE) 77 * This method works. Despite all the confusion.
78 * (except on PPro SMP or if we are using OOSTORE, so we use xchgb there)
79 * (PPro errata 66, 92) 79 * (PPro errata 66, 92)
80 */ 80 */
81 81
82#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE) 82#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE)
83 83
84#define spin_unlock_string \ 84#define __raw_spin_unlock_string \
85 "movb $1,%0" \ 85 "movb $1,%0" \
86 :"=m" (lock->slock) : : "memory" 86 :"=m" (lock->slock) : : "memory"
87 87
88 88
89static inline void _raw_spin_unlock(spinlock_t *lock) 89static inline void __raw_spin_unlock(raw_spinlock_t *lock)
90{ 90{
91#ifdef CONFIG_DEBUG_SPINLOCK
92 BUG_ON(lock->magic != SPINLOCK_MAGIC);
93 BUG_ON(!spin_is_locked(lock));
94#endif
95 __asm__ __volatile__( 91 __asm__ __volatile__(
96 spin_unlock_string 92 __raw_spin_unlock_string
97 ); 93 );
98} 94}
99 95
100#else 96#else
101 97
102#define spin_unlock_string \ 98#define __raw_spin_unlock_string \
103 "xchgb %b0, %1" \ 99 "xchgb %b0, %1" \
104 :"=q" (oldval), "=m" (lock->slock) \ 100 :"=q" (oldval), "=m" (lock->slock) \
105 :"0" (oldval) : "memory" 101 :"0" (oldval) : "memory"
106 102
107static inline void _raw_spin_unlock(spinlock_t *lock) 103static inline void __raw_spin_unlock(raw_spinlock_t *lock)
108{ 104{
109 char oldval = 1; 105 char oldval = 1;
110#ifdef CONFIG_DEBUG_SPINLOCK
111 BUG_ON(lock->magic != SPINLOCK_MAGIC);
112 BUG_ON(!spin_is_locked(lock));
113#endif
114 __asm__ __volatile__(
115 spin_unlock_string
116 );
117}
118 106
119#endif
120
121static inline int _raw_spin_trylock(spinlock_t *lock)
122{
123 char oldval;
124 __asm__ __volatile__( 107 __asm__ __volatile__(
125 "xchgb %b0,%1" 108 __raw_spin_unlock_string
126 :"=q" (oldval), "=m" (lock->slock) 109 );
127 :"0" (0) : "memory");
128 return oldval > 0;
129} 110}
130 111
131static inline void _raw_spin_lock(spinlock_t *lock)
132{
133#ifdef CONFIG_DEBUG_SPINLOCK
134 if (unlikely(lock->magic != SPINLOCK_MAGIC)) {
135 printk("eip: %p\n", __builtin_return_address(0));
136 BUG();
137 }
138#endif 112#endif
139 __asm__ __volatile__(
140 spin_lock_string
141 :"=m" (lock->slock) : : "memory");
142}
143 113
144static inline void _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags) 114#define __raw_spin_unlock_wait(lock) \
145{ 115 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
146#ifdef CONFIG_DEBUG_SPINLOCK
147 if (unlikely(lock->magic != SPINLOCK_MAGIC)) {
148 printk("eip: %p\n", __builtin_return_address(0));
149 BUG();
150 }
151#endif
152 __asm__ __volatile__(
153 spin_lock_string_flags
154 :"=m" (lock->slock) : "r" (flags) : "memory");
155}
156 116
157/* 117/*
158 * Read-write spinlocks, allowing multiple readers 118 * Read-write spinlocks, allowing multiple readers
@@ -163,72 +123,41 @@ static inline void _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags)
163 * can "mix" irq-safe locks - any writer needs to get a 123 * can "mix" irq-safe locks - any writer needs to get a
164 * irq-safe write-lock, but readers can get non-irqsafe 124 * irq-safe write-lock, but readers can get non-irqsafe
165 * read-locks. 125 * read-locks.
126 *
127 * On x86, we implement read-write locks as a 32-bit counter
128 * with the high bit (sign) being the "contended" bit.
129 *
130 * The inline assembly is non-obvious. Think about it.
131 *
132 * Changed to use the same technique as rw semaphores. See
133 * semaphore.h for details. -ben
134 *
135 * the helpers are in arch/i386/kernel/semaphore.c
166 */ 136 */
167typedef struct {
168 volatile unsigned int lock;
169#ifdef CONFIG_DEBUG_SPINLOCK
170 unsigned magic;
171#endif
172#ifdef CONFIG_PREEMPT
173 unsigned int break_lock;
174#endif
175} rwlock_t;
176
177#define RWLOCK_MAGIC 0xdeaf1eed
178
179#ifdef CONFIG_DEBUG_SPINLOCK
180#define RWLOCK_MAGIC_INIT , RWLOCK_MAGIC
181#else
182#define RWLOCK_MAGIC_INIT /* */
183#endif
184
185#define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
186
187#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
188 137
189/** 138/**
190 * read_can_lock - would read_trylock() succeed? 139 * read_can_lock - would read_trylock() succeed?
191 * @lock: the rwlock in question. 140 * @lock: the rwlock in question.
192 */ 141 */
193#define read_can_lock(x) ((int)(x)->lock > 0) 142#define __raw_read_can_lock(x) ((int)(x)->lock > 0)
194 143
195/** 144/**
196 * write_can_lock - would write_trylock() succeed? 145 * write_can_lock - would write_trylock() succeed?
197 * @lock: the rwlock in question. 146 * @lock: the rwlock in question.
198 */ 147 */
199#define write_can_lock(x) ((x)->lock == RW_LOCK_BIAS) 148#define __raw_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
200 149
201/* 150static inline void __raw_read_lock(raw_rwlock_t *rw)
202 * On x86, we implement read-write locks as a 32-bit counter
203 * with the high bit (sign) being the "contended" bit.
204 *
205 * The inline assembly is non-obvious. Think about it.
206 *
207 * Changed to use the same technique as rw semaphores. See
208 * semaphore.h for details. -ben
209 */
210/* the spinlock helpers are in arch/i386/kernel/semaphore.c */
211
212static inline void _raw_read_lock(rwlock_t *rw)
213{ 151{
214#ifdef CONFIG_DEBUG_SPINLOCK
215 BUG_ON(rw->magic != RWLOCK_MAGIC);
216#endif
217 __build_read_lock(rw, "__read_lock_failed"); 152 __build_read_lock(rw, "__read_lock_failed");
218} 153}
219 154
220static inline void _raw_write_lock(rwlock_t *rw) 155static inline void __raw_write_lock(raw_rwlock_t *rw)
221{ 156{
222#ifdef CONFIG_DEBUG_SPINLOCK
223 BUG_ON(rw->magic != RWLOCK_MAGIC);
224#endif
225 __build_write_lock(rw, "__write_lock_failed"); 157 __build_write_lock(rw, "__write_lock_failed");
226} 158}
227 159
228#define _raw_read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") 160static inline int __raw_read_trylock(raw_rwlock_t *lock)
229#define _raw_write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory")
230
231static inline int _raw_read_trylock(rwlock_t *lock)
232{ 161{
233 atomic_t *count = (atomic_t *)lock; 162 atomic_t *count = (atomic_t *)lock;
234 atomic_dec(count); 163 atomic_dec(count);
@@ -238,7 +167,7 @@ static inline int _raw_read_trylock(rwlock_t *lock)
238 return 0; 167 return 0;
239} 168}
240 169
241static inline int _raw_write_trylock(rwlock_t *lock) 170static inline int __raw_write_trylock(raw_rwlock_t *lock)
242{ 171{
243 atomic_t *count = (atomic_t *)lock; 172 atomic_t *count = (atomic_t *)lock;
244 if (atomic_sub_and_test(RW_LOCK_BIAS, count)) 173 if (atomic_sub_and_test(RW_LOCK_BIAS, count))
@@ -247,4 +176,15 @@ static inline int _raw_write_trylock(rwlock_t *lock)
247 return 0; 176 return 0;
248} 177}
249 178
179static inline void __raw_read_unlock(raw_rwlock_t *rw)
180{
181 asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
182}
183
184static inline void __raw_write_unlock(raw_rwlock_t *rw)
185{
186 asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0"
187 : "=m" (rw->lock) : : "memory");
188}
189
250#endif /* __ASM_SPINLOCK_H */ 190#endif /* __ASM_SPINLOCK_H */
diff --git a/include/asm-i386/spinlock_types.h b/include/asm-i386/spinlock_types.h
new file mode 100644
index 000000000000..59efe849f351
--- /dev/null
+++ b/include/asm-i386/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int slock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 1 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS }
19
20#endif
diff --git a/include/asm-ia64/spinlock.h b/include/asm-ia64/spinlock.h
index d2430aa0d49d..5b78611411c3 100644
--- a/include/asm-ia64/spinlock.h
+++ b/include/asm-ia64/spinlock.h
@@ -17,28 +17,20 @@
17#include <asm/intrinsics.h> 17#include <asm/intrinsics.h>
18#include <asm/system.h> 18#include <asm/system.h>
19 19
20typedef struct { 20#define __raw_spin_lock_init(x) ((x)->lock = 0)
21 volatile unsigned int lock;
22#ifdef CONFIG_PREEMPT
23 unsigned int break_lock;
24#endif
25} spinlock_t;
26
27#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
28#define spin_lock_init(x) ((x)->lock = 0)
29 21
30#ifdef ASM_SUPPORTED 22#ifdef ASM_SUPPORTED
31/* 23/*
32 * Try to get the lock. If we fail to get the lock, make a non-standard call to 24 * Try to get the lock. If we fail to get the lock, make a non-standard call to
33 * ia64_spinlock_contention(). We do not use a normal call because that would force all 25 * ia64_spinlock_contention(). We do not use a normal call because that would force all
34 * callers of spin_lock() to be non-leaf routines. Instead, ia64_spinlock_contention() is 26 * callers of __raw_spin_lock() to be non-leaf routines. Instead, ia64_spinlock_contention() is
35 * carefully coded to touch only those registers that spin_lock() marks "clobbered". 27 * carefully coded to touch only those registers that __raw_spin_lock() marks "clobbered".
36 */ 28 */
37 29
38#define IA64_SPINLOCK_CLOBBERS "ar.ccv", "ar.pfs", "p14", "p15", "r27", "r28", "r29", "r30", "b6", "memory" 30#define IA64_SPINLOCK_CLOBBERS "ar.ccv", "ar.pfs", "p14", "p15", "r27", "r28", "r29", "r30", "b6", "memory"
39 31
40static inline void 32static inline void
41_raw_spin_lock_flags (spinlock_t *lock, unsigned long flags) 33__raw_spin_lock_flags (raw_spinlock_t *lock, unsigned long flags)
42{ 34{
43 register volatile unsigned int *ptr asm ("r31") = &lock->lock; 35 register volatile unsigned int *ptr asm ("r31") = &lock->lock;
44 36
@@ -94,17 +86,17 @@ _raw_spin_lock_flags (spinlock_t *lock, unsigned long flags)
94#endif 86#endif
95} 87}
96 88
97#define _raw_spin_lock(lock) _raw_spin_lock_flags(lock, 0) 89#define __raw_spin_lock(lock) __raw_spin_lock_flags(lock, 0)
98 90
99/* Unlock by doing an ordered store and releasing the cacheline with nta */ 91/* Unlock by doing an ordered store and releasing the cacheline with nta */
100static inline void _raw_spin_unlock(spinlock_t *x) { 92static inline void __raw_spin_unlock(raw_spinlock_t *x) {
101 barrier(); 93 barrier();
102 asm volatile ("st4.rel.nta [%0] = r0\n\t" :: "r"(x)); 94 asm volatile ("st4.rel.nta [%0] = r0\n\t" :: "r"(x));
103} 95}
104 96
105#else /* !ASM_SUPPORTED */ 97#else /* !ASM_SUPPORTED */
106#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) 98#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
107# define _raw_spin_lock(x) \ 99# define __raw_spin_lock(x) \
108do { \ 100do { \
109 __u32 *ia64_spinlock_ptr = (__u32 *) (x); \ 101 __u32 *ia64_spinlock_ptr = (__u32 *) (x); \
110 __u64 ia64_spinlock_val; \ 102 __u64 ia64_spinlock_val; \
@@ -117,29 +109,20 @@ do { \
117 } while (ia64_spinlock_val); \ 109 } while (ia64_spinlock_val); \
118 } \ 110 } \
119} while (0) 111} while (0)
120#define _raw_spin_unlock(x) do { barrier(); ((spinlock_t *) x)->lock = 0; } while (0) 112#define __raw_spin_unlock(x) do { barrier(); ((raw_spinlock_t *) x)->lock = 0; } while (0)
121#endif /* !ASM_SUPPORTED */ 113#endif /* !ASM_SUPPORTED */
122 114
123#define spin_is_locked(x) ((x)->lock != 0) 115#define __raw_spin_is_locked(x) ((x)->lock != 0)
124#define _raw_spin_trylock(x) (cmpxchg_acq(&(x)->lock, 0, 1) == 0) 116#define __raw_spin_trylock(x) (cmpxchg_acq(&(x)->lock, 0, 1) == 0)
125#define spin_unlock_wait(x) do { barrier(); } while ((x)->lock) 117#define __raw_spin_unlock_wait(lock) \
126 118 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
127typedef struct {
128 volatile unsigned int read_counter : 24;
129 volatile unsigned int write_lock : 8;
130#ifdef CONFIG_PREEMPT
131 unsigned int break_lock;
132#endif
133} rwlock_t;
134#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
135 119
136#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0) 120#define __raw_read_can_lock(rw) (*(volatile int *)(rw) >= 0)
137#define read_can_lock(rw) (*(volatile int *)(rw) >= 0) 121#define __raw_write_can_lock(rw) (*(volatile int *)(rw) == 0)
138#define write_can_lock(rw) (*(volatile int *)(rw) == 0)
139 122
140#define _raw_read_lock(rw) \ 123#define __raw_read_lock(rw) \
141do { \ 124do { \
142 rwlock_t *__read_lock_ptr = (rw); \ 125 raw_rwlock_t *__read_lock_ptr = (rw); \
143 \ 126 \
144 while (unlikely(ia64_fetchadd(1, (int *) __read_lock_ptr, acq) < 0)) { \ 127 while (unlikely(ia64_fetchadd(1, (int *) __read_lock_ptr, acq) < 0)) { \
145 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \ 128 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \
@@ -148,14 +131,14 @@ do { \
148 } \ 131 } \
149} while (0) 132} while (0)
150 133
151#define _raw_read_unlock(rw) \ 134#define __raw_read_unlock(rw) \
152do { \ 135do { \
153 rwlock_t *__read_lock_ptr = (rw); \ 136 raw_rwlock_t *__read_lock_ptr = (rw); \
154 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \ 137 ia64_fetchadd(-1, (int *) __read_lock_ptr, rel); \
155} while (0) 138} while (0)
156 139
157#ifdef ASM_SUPPORTED 140#ifdef ASM_SUPPORTED
158#define _raw_write_lock(rw) \ 141#define __raw_write_lock(rw) \
159do { \ 142do { \
160 __asm__ __volatile__ ( \ 143 __asm__ __volatile__ ( \
161 "mov ar.ccv = r0\n" \ 144 "mov ar.ccv = r0\n" \
@@ -170,7 +153,7 @@ do { \
170 :: "r"(rw) : "ar.ccv", "p7", "r2", "r29", "memory"); \ 153 :: "r"(rw) : "ar.ccv", "p7", "r2", "r29", "memory"); \
171} while(0) 154} while(0)
172 155
173#define _raw_write_trylock(rw) \ 156#define __raw_write_trylock(rw) \
174({ \ 157({ \
175 register long result; \ 158 register long result; \
176 \ 159 \
@@ -182,7 +165,7 @@ do { \
182 (result == 0); \ 165 (result == 0); \
183}) 166})
184 167
185static inline void _raw_write_unlock(rwlock_t *x) 168static inline void __raw_write_unlock(raw_rwlock_t *x)
186{ 169{
187 u8 *y = (u8 *)x; 170 u8 *y = (u8 *)x;
188 barrier(); 171 barrier();
@@ -191,7 +174,7 @@ static inline void _raw_write_unlock(rwlock_t *x)
191 174
192#else /* !ASM_SUPPORTED */ 175#else /* !ASM_SUPPORTED */
193 176
194#define _raw_write_lock(l) \ 177#define __raw_write_lock(l) \
195({ \ 178({ \
196 __u64 ia64_val, ia64_set_val = ia64_dep_mi(-1, 0, 31, 1); \ 179 __u64 ia64_val, ia64_set_val = ia64_dep_mi(-1, 0, 31, 1); \
197 __u32 *ia64_write_lock_ptr = (__u32 *) (l); \ 180 __u32 *ia64_write_lock_ptr = (__u32 *) (l); \
@@ -202,7 +185,7 @@ static inline void _raw_write_unlock(rwlock_t *x)
202 } while (ia64_val); \ 185 } while (ia64_val); \
203}) 186})
204 187
205#define _raw_write_trylock(rw) \ 188#define __raw_write_trylock(rw) \
206({ \ 189({ \
207 __u64 ia64_val; \ 190 __u64 ia64_val; \
208 __u64 ia64_set_val = ia64_dep_mi(-1, 0, 31,1); \ 191 __u64 ia64_set_val = ia64_dep_mi(-1, 0, 31,1); \
@@ -210,7 +193,7 @@ static inline void _raw_write_unlock(rwlock_t *x)
210 (ia64_val == 0); \ 193 (ia64_val == 0); \
211}) 194})
212 195
213static inline void _raw_write_unlock(rwlock_t *x) 196static inline void __raw_write_unlock(raw_rwlock_t *x)
214{ 197{
215 barrier(); 198 barrier();
216 x->write_lock = 0; 199 x->write_lock = 0;
@@ -218,6 +201,6 @@ static inline void _raw_write_unlock(rwlock_t *x)
218 201
219#endif /* !ASM_SUPPORTED */ 202#endif /* !ASM_SUPPORTED */
220 203
221#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 204#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
222 205
223#endif /* _ASM_IA64_SPINLOCK_H */ 206#endif /* _ASM_IA64_SPINLOCK_H */
diff --git a/include/asm-ia64/spinlock_types.h b/include/asm-ia64/spinlock_types.h
new file mode 100644
index 000000000000..474e46f1ab4a
--- /dev/null
+++ b/include/asm-ia64/spinlock_types.h
@@ -0,0 +1,21 @@
1#ifndef _ASM_IA64_SPINLOCK_TYPES_H
2#define _ASM_IA64_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int read_counter : 31;
16 volatile unsigned int write_lock : 1;
17} raw_rwlock_t;
18
19#define __RAW_RW_LOCK_UNLOCKED { 0, 0 }
20
21#endif
diff --git a/include/asm-m32r/spinlock.h b/include/asm-m32r/spinlock.h
index 6608d8371c50..7de7def28da9 100644
--- a/include/asm-m32r/spinlock.h
+++ b/include/asm-m32r/spinlock.h
@@ -14,57 +14,30 @@
14#include <asm/atomic.h> 14#include <asm/atomic.h>
15#include <asm/page.h> 15#include <asm/page.h>
16 16
17extern int printk(const char * fmt, ...)
18 __attribute__ ((format (printf, 1, 2)));
19
20#define RW_LOCK_BIAS 0x01000000
21#define RW_LOCK_BIAS_STR "0x01000000"
22
23/* 17/*
24 * Your basic SMP spinlocks, allowing only a single CPU anywhere 18 * Your basic SMP spinlocks, allowing only a single CPU anywhere
25 */ 19 *
26 20 * (the type definitions are in asm/spinlock_types.h)
27typedef struct { 21 *
28 volatile int slock;
29#ifdef CONFIG_DEBUG_SPINLOCK
30 unsigned magic;
31#endif
32#ifdef CONFIG_PREEMPT
33 unsigned int break_lock;
34#endif
35} spinlock_t;
36
37#define SPINLOCK_MAGIC 0xdead4ead
38
39#ifdef CONFIG_DEBUG_SPINLOCK
40#define SPINLOCK_MAGIC_INIT , SPINLOCK_MAGIC
41#else
42#define SPINLOCK_MAGIC_INIT /* */
43#endif
44
45#define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 SPINLOCK_MAGIC_INIT }
46
47#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
48
49/*
50 * Simple spin lock operations. There are two variants, one clears IRQ's 22 * Simple spin lock operations. There are two variants, one clears IRQ's
51 * on the local processor, one does not. 23 * on the local processor, one does not.
52 * 24 *
53 * We make no fairness assumptions. They have a cost. 25 * We make no fairness assumptions. They have a cost.
54 */ 26 */
55 27
56#define spin_is_locked(x) (*(volatile int *)(&(x)->slock) <= 0) 28#define __raw_spin_is_locked(x) (*(volatile int *)(&(x)->slock) <= 0)
57#define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x)) 29#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
58#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) 30#define __raw_spin_unlock_wait(x) \
31 do { cpu_relax(); } while (__raw_spin_is_locked(x))
59 32
60/** 33/**
61 * _raw_spin_trylock - Try spin lock and return a result 34 * __raw_spin_trylock - Try spin lock and return a result
62 * @lock: Pointer to the lock variable 35 * @lock: Pointer to the lock variable
63 * 36 *
64 * _raw_spin_trylock() tries to get the lock and returns a result. 37 * __raw_spin_trylock() tries to get the lock and returns a result.
65 * On the m32r, the result value is 1 (= Success) or 0 (= Failure). 38 * On the m32r, the result value is 1 (= Success) or 0 (= Failure).
66 */ 39 */
67static inline int _raw_spin_trylock(spinlock_t *lock) 40static inline int __raw_spin_trylock(raw_spinlock_t *lock)
68{ 41{
69 int oldval; 42 int oldval;
70 unsigned long tmp1, tmp2; 43 unsigned long tmp1, tmp2;
@@ -78,7 +51,7 @@ static inline int _raw_spin_trylock(spinlock_t *lock)
78 * } 51 * }
79 */ 52 */
80 __asm__ __volatile__ ( 53 __asm__ __volatile__ (
81 "# spin_trylock \n\t" 54 "# __raw_spin_trylock \n\t"
82 "ldi %1, #0; \n\t" 55 "ldi %1, #0; \n\t"
83 "mvfc %2, psw; \n\t" 56 "mvfc %2, psw; \n\t"
84 "clrpsw #0x40 -> nop; \n\t" 57 "clrpsw #0x40 -> nop; \n\t"
@@ -97,16 +70,10 @@ static inline int _raw_spin_trylock(spinlock_t *lock)
97 return (oldval > 0); 70 return (oldval > 0);
98} 71}
99 72
100static inline void _raw_spin_lock(spinlock_t *lock) 73static inline void __raw_spin_lock(raw_spinlock_t *lock)
101{ 74{
102 unsigned long tmp0, tmp1; 75 unsigned long tmp0, tmp1;
103 76
104#ifdef CONFIG_DEBUG_SPINLOCK
105 if (unlikely(lock->magic != SPINLOCK_MAGIC)) {
106 printk("pc: %p\n", __builtin_return_address(0));
107 BUG();
108 }
109#endif
110 /* 77 /*
111 * lock->slock : =1 : unlock 78 * lock->slock : =1 : unlock
112 * : <=0 : lock 79 * : <=0 : lock
@@ -118,7 +85,7 @@ static inline void _raw_spin_lock(spinlock_t *lock)
118 * } 85 * }
119 */ 86 */
120 __asm__ __volatile__ ( 87 __asm__ __volatile__ (
121 "# spin_lock \n\t" 88 "# __raw_spin_lock \n\t"
122 ".fillinsn \n" 89 ".fillinsn \n"
123 "1: \n\t" 90 "1: \n\t"
124 "mvfc %1, psw; \n\t" 91 "mvfc %1, psw; \n\t"
@@ -145,12 +112,8 @@ static inline void _raw_spin_lock(spinlock_t *lock)
145 ); 112 );
146} 113}
147 114
148static inline void _raw_spin_unlock(spinlock_t *lock) 115static inline void __raw_spin_unlock(raw_spinlock_t *lock)
149{ 116{
150#ifdef CONFIG_DEBUG_SPINLOCK
151 BUG_ON(lock->magic != SPINLOCK_MAGIC);
152 BUG_ON(!spin_is_locked(lock));
153#endif
154 mb(); 117 mb();
155 lock->slock = 1; 118 lock->slock = 1;
156} 119}
@@ -164,59 +127,32 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
164 * can "mix" irq-safe locks - any writer needs to get a 127 * can "mix" irq-safe locks - any writer needs to get a
165 * irq-safe write-lock, but readers can get non-irqsafe 128 * irq-safe write-lock, but readers can get non-irqsafe
166 * read-locks. 129 * read-locks.
130 *
131 * On x86, we implement read-write locks as a 32-bit counter
132 * with the high bit (sign) being the "contended" bit.
133 *
134 * The inline assembly is non-obvious. Think about it.
135 *
136 * Changed to use the same technique as rw semaphores. See
137 * semaphore.h for details. -ben
167 */ 138 */
168typedef struct {
169 volatile int lock;
170#ifdef CONFIG_DEBUG_SPINLOCK
171 unsigned magic;
172#endif
173#ifdef CONFIG_PREEMPT
174 unsigned int break_lock;
175#endif
176} rwlock_t;
177
178#define RWLOCK_MAGIC 0xdeaf1eed
179
180#ifdef CONFIG_DEBUG_SPINLOCK
181#define RWLOCK_MAGIC_INIT , RWLOCK_MAGIC
182#else
183#define RWLOCK_MAGIC_INIT /* */
184#endif
185
186#define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
187
188#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
189 139
190/** 140/**
191 * read_can_lock - would read_trylock() succeed? 141 * read_can_lock - would read_trylock() succeed?
192 * @lock: the rwlock in question. 142 * @lock: the rwlock in question.
193 */ 143 */
194#define read_can_lock(x) ((int)(x)->lock > 0) 144#define __raw_read_can_lock(x) ((int)(x)->lock > 0)
195 145
196/** 146/**
197 * write_can_lock - would write_trylock() succeed? 147 * write_can_lock - would write_trylock() succeed?
198 * @lock: the rwlock in question. 148 * @lock: the rwlock in question.
199 */ 149 */
200#define write_can_lock(x) ((x)->lock == RW_LOCK_BIAS) 150#define __raw_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
201
202/*
203 * On x86, we implement read-write locks as a 32-bit counter
204 * with the high bit (sign) being the "contended" bit.
205 *
206 * The inline assembly is non-obvious. Think about it.
207 *
208 * Changed to use the same technique as rw semaphores. See
209 * semaphore.h for details. -ben
210 */
211/* the spinlock helpers are in arch/i386/kernel/semaphore.c */
212 151
213static inline void _raw_read_lock(rwlock_t *rw) 152static inline void __raw_read_lock(raw_rwlock_t *rw)
214{ 153{
215 unsigned long tmp0, tmp1; 154 unsigned long tmp0, tmp1;
216 155
217#ifdef CONFIG_DEBUG_SPINLOCK
218 BUG_ON(rw->magic != RWLOCK_MAGIC);
219#endif
220 /* 156 /*
221 * rw->lock : >0 : unlock 157 * rw->lock : >0 : unlock
222 * : <=0 : lock 158 * : <=0 : lock
@@ -264,13 +200,10 @@ static inline void _raw_read_lock(rwlock_t *rw)
264 ); 200 );
265} 201}
266 202
267static inline void _raw_write_lock(rwlock_t *rw) 203static inline void __raw_write_lock(raw_rwlock_t *rw)
268{ 204{
269 unsigned long tmp0, tmp1, tmp2; 205 unsigned long tmp0, tmp1, tmp2;
270 206
271#ifdef CONFIG_DEBUG_SPINLOCK
272 BUG_ON(rw->magic != RWLOCK_MAGIC);
273#endif
274 /* 207 /*
275 * rw->lock : =RW_LOCK_BIAS_STR : unlock 208 * rw->lock : =RW_LOCK_BIAS_STR : unlock
276 * : !=RW_LOCK_BIAS_STR : lock 209 * : !=RW_LOCK_BIAS_STR : lock
@@ -320,7 +253,7 @@ static inline void _raw_write_lock(rwlock_t *rw)
320 ); 253 );
321} 254}
322 255
323static inline void _raw_read_unlock(rwlock_t *rw) 256static inline void __raw_read_unlock(raw_rwlock_t *rw)
324{ 257{
325 unsigned long tmp0, tmp1; 258 unsigned long tmp0, tmp1;
326 259
@@ -342,7 +275,7 @@ static inline void _raw_read_unlock(rwlock_t *rw)
342 ); 275 );
343} 276}
344 277
345static inline void _raw_write_unlock(rwlock_t *rw) 278static inline void __raw_write_unlock(raw_rwlock_t *rw)
346{ 279{
347 unsigned long tmp0, tmp1, tmp2; 280 unsigned long tmp0, tmp1, tmp2;
348 281
@@ -366,9 +299,9 @@ static inline void _raw_write_unlock(rwlock_t *rw)
366 ); 299 );
367} 300}
368 301
369#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 302#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
370 303
371static inline int _raw_write_trylock(rwlock_t *lock) 304static inline int __raw_write_trylock(raw_rwlock_t *lock)
372{ 305{
373 atomic_t *count = (atomic_t *)lock; 306 atomic_t *count = (atomic_t *)lock;
374 if (atomic_sub_and_test(RW_LOCK_BIAS, count)) 307 if (atomic_sub_and_test(RW_LOCK_BIAS, count))
diff --git a/include/asm-m32r/spinlock_types.h b/include/asm-m32r/spinlock_types.h
new file mode 100644
index 000000000000..7e9941c45f40
--- /dev/null
+++ b/include/asm-m32r/spinlock_types.h
@@ -0,0 +1,23 @@
1#ifndef _ASM_M32R_SPINLOCK_TYPES_H
2#define _ASM_M32R_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile int slock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 1 }
13
14typedef struct {
15 volatile int lock;
16} raw_rwlock_t;
17
18#define RW_LOCK_BIAS 0x01000000
19#define RW_LOCK_BIAS_STR "0x01000000"
20
21#define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS }
22
23#endif
diff --git a/include/asm-mips/spinlock.h b/include/asm-mips/spinlock.h
index 114d3eb98a6a..4d0135b11156 100644
--- a/include/asm-mips/spinlock.h
+++ b/include/asm-mips/spinlock.h
@@ -16,20 +16,10 @@
16 * Your basic SMP spinlocks, allowing only a single CPU anywhere 16 * Your basic SMP spinlocks, allowing only a single CPU anywhere
17 */ 17 */
18 18
19typedef struct { 19#define __raw_spin_is_locked(x) ((x)->lock != 0)
20 volatile unsigned int lock; 20#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
21#ifdef CONFIG_PREEMPT 21#define __raw_spin_unlock_wait(x) \
22 unsigned int break_lock; 22 do { cpu_relax(); } while ((x)->lock)
23#endif
24} spinlock_t;
25
26#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
27
28#define spin_lock_init(x) do { (x)->lock = 0; } while(0)
29
30#define spin_is_locked(x) ((x)->lock != 0)
31#define spin_unlock_wait(x) do { barrier(); } while ((x)->lock)
32#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
33 23
34/* 24/*
35 * Simple spin lock operations. There are two variants, one clears IRQ's 25 * Simple spin lock operations. There are two variants, one clears IRQ's
@@ -38,13 +28,13 @@ typedef struct {
38 * We make no fairness assumptions. They have a cost. 28 * We make no fairness assumptions. They have a cost.
39 */ 29 */
40 30
41static inline void _raw_spin_lock(spinlock_t *lock) 31static inline void __raw_spin_lock(raw_spinlock_t *lock)
42{ 32{
43 unsigned int tmp; 33 unsigned int tmp;
44 34
45 if (R10000_LLSC_WAR) { 35 if (R10000_LLSC_WAR) {
46 __asm__ __volatile__( 36 __asm__ __volatile__(
47 " .set noreorder # _raw_spin_lock \n" 37 " .set noreorder # __raw_spin_lock \n"
48 "1: ll %1, %2 \n" 38 "1: ll %1, %2 \n"
49 " bnez %1, 1b \n" 39 " bnez %1, 1b \n"
50 " li %1, 1 \n" 40 " li %1, 1 \n"
@@ -58,7 +48,7 @@ static inline void _raw_spin_lock(spinlock_t *lock)
58 : "memory"); 48 : "memory");
59 } else { 49 } else {
60 __asm__ __volatile__( 50 __asm__ __volatile__(
61 " .set noreorder # _raw_spin_lock \n" 51 " .set noreorder # __raw_spin_lock \n"
62 "1: ll %1, %2 \n" 52 "1: ll %1, %2 \n"
63 " bnez %1, 1b \n" 53 " bnez %1, 1b \n"
64 " li %1, 1 \n" 54 " li %1, 1 \n"
@@ -72,10 +62,10 @@ static inline void _raw_spin_lock(spinlock_t *lock)
72 } 62 }
73} 63}
74 64
75static inline void _raw_spin_unlock(spinlock_t *lock) 65static inline void __raw_spin_unlock(raw_spinlock_t *lock)
76{ 66{
77 __asm__ __volatile__( 67 __asm__ __volatile__(
78 " .set noreorder # _raw_spin_unlock \n" 68 " .set noreorder # __raw_spin_unlock \n"
79 " sync \n" 69 " sync \n"
80 " sw $0, %0 \n" 70 " sw $0, %0 \n"
81 " .set\treorder \n" 71 " .set\treorder \n"
@@ -84,13 +74,13 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
84 : "memory"); 74 : "memory");
85} 75}
86 76
87static inline unsigned int _raw_spin_trylock(spinlock_t *lock) 77static inline unsigned int __raw_spin_trylock(raw_spinlock_t *lock)
88{ 78{
89 unsigned int temp, res; 79 unsigned int temp, res;
90 80
91 if (R10000_LLSC_WAR) { 81 if (R10000_LLSC_WAR) {
92 __asm__ __volatile__( 82 __asm__ __volatile__(
93 " .set noreorder # _raw_spin_trylock \n" 83 " .set noreorder # __raw_spin_trylock \n"
94 "1: ll %0, %3 \n" 84 "1: ll %0, %3 \n"
95 " ori %2, %0, 1 \n" 85 " ori %2, %0, 1 \n"
96 " sc %2, %1 \n" 86 " sc %2, %1 \n"
@@ -104,7 +94,7 @@ static inline unsigned int _raw_spin_trylock(spinlock_t *lock)
104 : "memory"); 94 : "memory");
105 } else { 95 } else {
106 __asm__ __volatile__( 96 __asm__ __volatile__(
107 " .set noreorder # _raw_spin_trylock \n" 97 " .set noreorder # __raw_spin_trylock \n"
108 "1: ll %0, %3 \n" 98 "1: ll %0, %3 \n"
109 " ori %2, %0, 1 \n" 99 " ori %2, %0, 1 \n"
110 " sc %2, %1 \n" 100 " sc %2, %1 \n"
@@ -129,24 +119,13 @@ static inline unsigned int _raw_spin_trylock(spinlock_t *lock)
129 * read-locks. 119 * read-locks.
130 */ 120 */
131 121
132typedef struct { 122static inline void __raw_read_lock(raw_rwlock_t *rw)
133 volatile unsigned int lock;
134#ifdef CONFIG_PREEMPT
135 unsigned int break_lock;
136#endif
137} rwlock_t;
138
139#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
140
141#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
142
143static inline void _raw_read_lock(rwlock_t *rw)
144{ 123{
145 unsigned int tmp; 124 unsigned int tmp;
146 125
147 if (R10000_LLSC_WAR) { 126 if (R10000_LLSC_WAR) {
148 __asm__ __volatile__( 127 __asm__ __volatile__(
149 " .set noreorder # _raw_read_lock \n" 128 " .set noreorder # __raw_read_lock \n"
150 "1: ll %1, %2 \n" 129 "1: ll %1, %2 \n"
151 " bltz %1, 1b \n" 130 " bltz %1, 1b \n"
152 " addu %1, 1 \n" 131 " addu %1, 1 \n"
@@ -160,7 +139,7 @@ static inline void _raw_read_lock(rwlock_t *rw)
160 : "memory"); 139 : "memory");
161 } else { 140 } else {
162 __asm__ __volatile__( 141 __asm__ __volatile__(
163 " .set noreorder # _raw_read_lock \n" 142 " .set noreorder # __raw_read_lock \n"
164 "1: ll %1, %2 \n" 143 "1: ll %1, %2 \n"
165 " bltz %1, 1b \n" 144 " bltz %1, 1b \n"
166 " addu %1, 1 \n" 145 " addu %1, 1 \n"
@@ -177,13 +156,13 @@ static inline void _raw_read_lock(rwlock_t *rw)
177/* Note the use of sub, not subu which will make the kernel die with an 156/* Note the use of sub, not subu which will make the kernel die with an
178 overflow exception if we ever try to unlock an rwlock that is already 157 overflow exception if we ever try to unlock an rwlock that is already
179 unlocked or is being held by a writer. */ 158 unlocked or is being held by a writer. */
180static inline void _raw_read_unlock(rwlock_t *rw) 159static inline void __raw_read_unlock(raw_rwlock_t *rw)
181{ 160{
182 unsigned int tmp; 161 unsigned int tmp;
183 162
184 if (R10000_LLSC_WAR) { 163 if (R10000_LLSC_WAR) {
185 __asm__ __volatile__( 164 __asm__ __volatile__(
186 "1: ll %1, %2 # _raw_read_unlock \n" 165 "1: ll %1, %2 # __raw_read_unlock \n"
187 " sub %1, 1 \n" 166 " sub %1, 1 \n"
188 " sc %1, %0 \n" 167 " sc %1, %0 \n"
189 " beqzl %1, 1b \n" 168 " beqzl %1, 1b \n"
@@ -193,7 +172,7 @@ static inline void _raw_read_unlock(rwlock_t *rw)
193 : "memory"); 172 : "memory");
194 } else { 173 } else {
195 __asm__ __volatile__( 174 __asm__ __volatile__(
196 " .set noreorder # _raw_read_unlock \n" 175 " .set noreorder # __raw_read_unlock \n"
197 "1: ll %1, %2 \n" 176 "1: ll %1, %2 \n"
198 " sub %1, 1 \n" 177 " sub %1, 1 \n"
199 " sc %1, %0 \n" 178 " sc %1, %0 \n"
@@ -206,13 +185,13 @@ static inline void _raw_read_unlock(rwlock_t *rw)
206 } 185 }
207} 186}
208 187
209static inline void _raw_write_lock(rwlock_t *rw) 188static inline void __raw_write_lock(raw_rwlock_t *rw)
210{ 189{
211 unsigned int tmp; 190 unsigned int tmp;
212 191
213 if (R10000_LLSC_WAR) { 192 if (R10000_LLSC_WAR) {
214 __asm__ __volatile__( 193 __asm__ __volatile__(
215 " .set noreorder # _raw_write_lock \n" 194 " .set noreorder # __raw_write_lock \n"
216 "1: ll %1, %2 \n" 195 "1: ll %1, %2 \n"
217 " bnez %1, 1b \n" 196 " bnez %1, 1b \n"
218 " lui %1, 0x8000 \n" 197 " lui %1, 0x8000 \n"
@@ -226,7 +205,7 @@ static inline void _raw_write_lock(rwlock_t *rw)
226 : "memory"); 205 : "memory");
227 } else { 206 } else {
228 __asm__ __volatile__( 207 __asm__ __volatile__(
229 " .set noreorder # _raw_write_lock \n" 208 " .set noreorder # __raw_write_lock \n"
230 "1: ll %1, %2 \n" 209 "1: ll %1, %2 \n"
231 " bnez %1, 1b \n" 210 " bnez %1, 1b \n"
232 " lui %1, 0x8000 \n" 211 " lui %1, 0x8000 \n"
@@ -241,26 +220,26 @@ static inline void _raw_write_lock(rwlock_t *rw)
241 } 220 }
242} 221}
243 222
244static inline void _raw_write_unlock(rwlock_t *rw) 223static inline void __raw_write_unlock(raw_rwlock_t *rw)
245{ 224{
246 __asm__ __volatile__( 225 __asm__ __volatile__(
247 " sync # _raw_write_unlock \n" 226 " sync # __raw_write_unlock \n"
248 " sw $0, %0 \n" 227 " sw $0, %0 \n"
249 : "=m" (rw->lock) 228 : "=m" (rw->lock)
250 : "m" (rw->lock) 229 : "m" (rw->lock)
251 : "memory"); 230 : "memory");
252} 231}
253 232
254#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 233#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
255 234
256static inline int _raw_write_trylock(rwlock_t *rw) 235static inline int __raw_write_trylock(raw_rwlock_t *rw)
257{ 236{
258 unsigned int tmp; 237 unsigned int tmp;
259 int ret; 238 int ret;
260 239
261 if (R10000_LLSC_WAR) { 240 if (R10000_LLSC_WAR) {
262 __asm__ __volatile__( 241 __asm__ __volatile__(
263 " .set noreorder # _raw_write_trylock \n" 242 " .set noreorder # __raw_write_trylock \n"
264 " li %2, 0 \n" 243 " li %2, 0 \n"
265 "1: ll %1, %3 \n" 244 "1: ll %1, %3 \n"
266 " bnez %1, 2f \n" 245 " bnez %1, 2f \n"
@@ -277,7 +256,7 @@ static inline int _raw_write_trylock(rwlock_t *rw)
277 : "memory"); 256 : "memory");
278 } else { 257 } else {
279 __asm__ __volatile__( 258 __asm__ __volatile__(
280 " .set noreorder # _raw_write_trylock \n" 259 " .set noreorder # __raw_write_trylock \n"
281 " li %2, 0 \n" 260 " li %2, 0 \n"
282 "1: ll %1, %3 \n" 261 "1: ll %1, %3 \n"
283 " bnez %1, 2f \n" 262 " bnez %1, 2f \n"
diff --git a/include/asm-mips/spinlock_types.h b/include/asm-mips/spinlock_types.h
new file mode 100644
index 000000000000..ce26c5048b15
--- /dev/null
+++ b/include/asm-mips/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef _ASM_SPINLOCK_TYPES_H
2#define _ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-parisc/atomic.h b/include/asm-parisc/atomic.h
index e24f7579adb0..048a2c7fd0c0 100644
--- a/include/asm-parisc/atomic.h
+++ b/include/asm-parisc/atomic.h
@@ -24,19 +24,19 @@
24# define ATOMIC_HASH_SIZE 4 24# define ATOMIC_HASH_SIZE 4
25# define ATOMIC_HASH(a) (&(__atomic_hash[ (((unsigned long) a)/L1_CACHE_BYTES) & (ATOMIC_HASH_SIZE-1) ])) 25# define ATOMIC_HASH(a) (&(__atomic_hash[ (((unsigned long) a)/L1_CACHE_BYTES) & (ATOMIC_HASH_SIZE-1) ]))
26 26
27extern spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned; 27extern raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned;
28 28
29/* Can't use _raw_spin_lock_irq because of #include problems, so 29/* Can't use raw_spin_lock_irq because of #include problems, so
30 * this is the substitute */ 30 * this is the substitute */
31#define _atomic_spin_lock_irqsave(l,f) do { \ 31#define _atomic_spin_lock_irqsave(l,f) do { \
32 spinlock_t *s = ATOMIC_HASH(l); \ 32 raw_spinlock_t *s = ATOMIC_HASH(l); \
33 local_irq_save(f); \ 33 local_irq_save(f); \
34 _raw_spin_lock(s); \ 34 __raw_spin_lock(s); \
35} while(0) 35} while(0)
36 36
37#define _atomic_spin_unlock_irqrestore(l,f) do { \ 37#define _atomic_spin_unlock_irqrestore(l,f) do { \
38 spinlock_t *s = ATOMIC_HASH(l); \ 38 raw_spinlock_t *s = ATOMIC_HASH(l); \
39 _raw_spin_unlock(s); \ 39 __raw_spin_unlock(s); \
40 local_irq_restore(f); \ 40 local_irq_restore(f); \
41} while(0) 41} while(0)
42 42
diff --git a/include/asm-parisc/bitops.h b/include/asm-parisc/bitops.h
index 928e5ef850bd..af7db694b22d 100644
--- a/include/asm-parisc/bitops.h
+++ b/include/asm-parisc/bitops.h
@@ -2,7 +2,7 @@
2#define _PARISC_BITOPS_H 2#define _PARISC_BITOPS_H
3 3
4#include <linux/compiler.h> 4#include <linux/compiler.h>
5#include <asm/system.h> 5#include <asm/spinlock.h>
6#include <asm/byteorder.h> 6#include <asm/byteorder.h>
7#include <asm/atomic.h> 7#include <asm/atomic.h>
8 8
diff --git a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h
index 06732719d927..aa592d8c0e39 100644
--- a/include/asm-parisc/cacheflush.h
+++ b/include/asm-parisc/cacheflush.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/config.h> 4#include <linux/config.h>
5#include <linux/mm.h> 5#include <linux/mm.h>
6#include <asm/cache.h> /* for flush_user_dcache_range_asm() proto */
6 7
7/* The usual comment is "Caches aren't brain-dead on the <architecture>". 8/* The usual comment is "Caches aren't brain-dead on the <architecture>".
8 * Unfortunately, that doesn't apply to PA-RISC. */ 9 * Unfortunately, that doesn't apply to PA-RISC. */
diff --git a/include/asm-parisc/processor.h b/include/asm-parisc/processor.h
index 0b61f51d8467..a9dfadd05658 100644
--- a/include/asm-parisc/processor.h
+++ b/include/asm-parisc/processor.h
@@ -11,6 +11,7 @@
11#ifndef __ASSEMBLY__ 11#ifndef __ASSEMBLY__
12#include <linux/config.h> 12#include <linux/config.h>
13#include <linux/threads.h> 13#include <linux/threads.h>
14#include <linux/spinlock_types.h>
14 15
15#include <asm/hardware.h> 16#include <asm/hardware.h>
16#include <asm/page.h> 17#include <asm/page.h>
diff --git a/include/asm-parisc/spinlock.h b/include/asm-parisc/spinlock.h
index 679ea1c651ef..43eaa6e742e0 100644
--- a/include/asm-parisc/spinlock.h
+++ b/include/asm-parisc/spinlock.h
@@ -2,30 +2,25 @@
2#define __ASM_SPINLOCK_H 2#define __ASM_SPINLOCK_H
3 3
4#include <asm/system.h> 4#include <asm/system.h>
5#include <asm/processor.h>
6#include <asm/spinlock_types.h>
5 7
6/* Note that PA-RISC has to use `1' to mean unlocked and `0' to mean locked 8/* Note that PA-RISC has to use `1' to mean unlocked and `0' to mean locked
7 * since it only has load-and-zero. Moreover, at least on some PA processors, 9 * since it only has load-and-zero. Moreover, at least on some PA processors,
8 * the semaphore address has to be 16-byte aligned. 10 * the semaphore address has to be 16-byte aligned.
9 */ 11 */
10 12
11#ifndef CONFIG_DEBUG_SPINLOCK 13static inline int __raw_spin_is_locked(raw_spinlock_t *x)
12
13#define __SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 } }
14#undef SPIN_LOCK_UNLOCKED
15#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
16
17#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
18
19static inline int spin_is_locked(spinlock_t *x)
20{ 14{
21 volatile unsigned int *a = __ldcw_align(x); 15 volatile unsigned int *a = __ldcw_align(x);
22 return *a == 0; 16 return *a == 0;
23} 17}
24 18
25#define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x)) 19#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
26#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) 20#define __raw_spin_unlock_wait(x) \
21 do { cpu_relax(); } while (__raw_spin_is_locked(x))
27 22
28static inline void _raw_spin_lock(spinlock_t *x) 23static inline void __raw_spin_lock(raw_spinlock_t *x)
29{ 24{
30 volatile unsigned int *a; 25 volatile unsigned int *a;
31 26
@@ -36,7 +31,7 @@ static inline void _raw_spin_lock(spinlock_t *x)
36 mb(); 31 mb();
37} 32}
38 33
39static inline void _raw_spin_unlock(spinlock_t *x) 34static inline void __raw_spin_unlock(raw_spinlock_t *x)
40{ 35{
41 volatile unsigned int *a; 36 volatile unsigned int *a;
42 mb(); 37 mb();
@@ -45,7 +40,7 @@ static inline void _raw_spin_unlock(spinlock_t *x)
45 mb(); 40 mb();
46} 41}
47 42
48static inline int _raw_spin_trylock(spinlock_t *x) 43static inline int __raw_spin_trylock(raw_spinlock_t *x)
49{ 44{
50 volatile unsigned int *a; 45 volatile unsigned int *a;
51 int ret; 46 int ret;
@@ -57,131 +52,38 @@ static inline int _raw_spin_trylock(spinlock_t *x)
57 52
58 return ret; 53 return ret;
59} 54}
60
61#define spin_lock_own(LOCK, LOCATION) ((void)0)
62
63#else /* !(CONFIG_DEBUG_SPINLOCK) */
64
65#define SPINLOCK_MAGIC 0x1D244B3C
66
67#define __SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 }, SPINLOCK_MAGIC, 10, __FILE__ , NULL, 0, -1, NULL, NULL }
68#undef SPIN_LOCK_UNLOCKED
69#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
70
71#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
72
73#define CHECK_LOCK(x) \
74 do { \
75 if (unlikely((x)->magic != SPINLOCK_MAGIC)) { \
76 printk(KERN_ERR "%s:%d: spin_is_locked" \
77 " on uninitialized spinlock %p.\n", \
78 __FILE__, __LINE__, (x)); \
79 } \
80 } while(0)
81
82#define spin_is_locked(x) \
83 ({ \
84 CHECK_LOCK(x); \
85 volatile unsigned int *a = __ldcw_align(x); \
86 if (unlikely((*a == 0) && (x)->babble)) { \
87 (x)->babble--; \
88 printk("KERN_WARNING \
89 %s:%d: spin_is_locked(%s/%p) already" \
90 " locked by %s:%d in %s at %p(%d)\n", \
91 __FILE__,__LINE__, (x)->module, (x), \
92 (x)->bfile, (x)->bline, (x)->task->comm,\
93 (x)->previous, (x)->oncpu); \
94 } \
95 *a == 0; \
96 })
97
98#define spin_unlock_wait(x) \
99 do { \
100 CHECK_LOCK(x); \
101 volatile unsigned int *a = __ldcw_align(x); \
102 if (unlikely((*a == 0) && (x)->babble)) { \
103 (x)->babble--; \
104 printk("KERN_WARNING \
105 %s:%d: spin_unlock_wait(%s/%p)" \
106 " owned by %s:%d in %s at %p(%d)\n", \
107 __FILE__,__LINE__, (x)->module, (x), \
108 (x)->bfile, (x)->bline, (x)->task->comm,\
109 (x)->previous, (x)->oncpu); \
110 } \
111 barrier(); \
112 } while (*((volatile unsigned char *)(__ldcw_align(x))) == 0)
113
114extern void _dbg_spin_lock(spinlock_t *lock, const char *base_file, int line_no);
115extern void _dbg_spin_unlock(spinlock_t *lock, const char *, int);
116extern int _dbg_spin_trylock(spinlock_t * lock, const char *, int);
117
118#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
119
120#define _raw_spin_unlock(lock) _dbg_spin_unlock(lock, __FILE__, __LINE__)
121#define _raw_spin_lock(lock) _dbg_spin_lock(lock, __FILE__, __LINE__)
122#define _raw_spin_trylock(lock) _dbg_spin_trylock(lock, __FILE__, __LINE__)
123
124/* just in case we need it */
125#define spin_lock_own(LOCK, LOCATION) \
126do { \
127 volatile unsigned int *a = __ldcw_align(LOCK); \
128 if (!((*a == 0) && ((LOCK)->oncpu == smp_processor_id()))) \
129 printk("KERN_WARNING \
130 %s: called on %d from %p but lock %s on %d\n", \
131 LOCATION, smp_processor_id(), \
132 __builtin_return_address(0), \
133 (*a == 0) ? "taken" : "freed", (LOCK)->on_cpu); \
134} while (0)
135
136#endif /* !(CONFIG_DEBUG_SPINLOCK) */
137 55
138/* 56/*
139 * Read-write spinlocks, allowing multiple readers 57 * Read-write spinlocks, allowing multiple readers
140 * but only one writer. 58 * but only one writer.
141 */ 59 */
142typedef struct {
143 spinlock_t lock;
144 volatile int counter;
145#ifdef CONFIG_PREEMPT
146 unsigned int break_lock;
147#endif
148} rwlock_t;
149
150#define RW_LOCK_UNLOCKED (rwlock_t) { __SPIN_LOCK_UNLOCKED, 0 }
151
152#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while (0)
153 60
154#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 61#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
155 62
156/* read_lock, read_unlock are pretty straightforward. Of course it somehow 63/* read_lock, read_unlock are pretty straightforward. Of course it somehow
157 * sucks we end up saving/restoring flags twice for read_lock_irqsave aso. */ 64 * sucks we end up saving/restoring flags twice for read_lock_irqsave aso. */
158 65
159#ifdef CONFIG_DEBUG_RWLOCK 66static __inline__ void __raw_read_lock(raw_rwlock_t *rw)
160extern void _dbg_read_lock(rwlock_t * rw, const char *bfile, int bline);
161#define _raw_read_lock(rw) _dbg_read_lock(rw, __FILE__, __LINE__)
162#else
163static __inline__ void _raw_read_lock(rwlock_t *rw)
164{ 67{
165 unsigned long flags; 68 unsigned long flags;
166 local_irq_save(flags); 69 local_irq_save(flags);
167 _raw_spin_lock(&rw->lock); 70 __raw_spin_lock(&rw->lock);
168 71
169 rw->counter++; 72 rw->counter++;
170 73
171 _raw_spin_unlock(&rw->lock); 74 __raw_spin_unlock(&rw->lock);
172 local_irq_restore(flags); 75 local_irq_restore(flags);
173} 76}
174#endif /* CONFIG_DEBUG_RWLOCK */
175 77
176static __inline__ void _raw_read_unlock(rwlock_t *rw) 78static __inline__ void __raw_read_unlock(raw_rwlock_t *rw)
177{ 79{
178 unsigned long flags; 80 unsigned long flags;
179 local_irq_save(flags); 81 local_irq_save(flags);
180 _raw_spin_lock(&rw->lock); 82 __raw_spin_lock(&rw->lock);
181 83
182 rw->counter--; 84 rw->counter--;
183 85
184 _raw_spin_unlock(&rw->lock); 86 __raw_spin_unlock(&rw->lock);
185 local_irq_restore(flags); 87 local_irq_restore(flags);
186} 88}
187 89
@@ -194,20 +96,17 @@ static __inline__ void _raw_read_unlock(rwlock_t *rw)
194 * writers) in interrupt handlers someone fucked up and we'd dead-lock 96 * writers) in interrupt handlers someone fucked up and we'd dead-lock
195 * sooner or later anyway. prumpf */ 97 * sooner or later anyway. prumpf */
196 98
197#ifdef CONFIG_DEBUG_RWLOCK 99static __inline__ void __raw_write_lock(raw_rwlock_t *rw)
198extern void _dbg_write_lock(rwlock_t * rw, const char *bfile, int bline);
199#define _raw_write_lock(rw) _dbg_write_lock(rw, __FILE__, __LINE__)
200#else
201static __inline__ void _raw_write_lock(rwlock_t *rw)
202{ 100{
203retry: 101retry:
204 _raw_spin_lock(&rw->lock); 102 __raw_spin_lock(&rw->lock);
205 103
206 if(rw->counter != 0) { 104 if(rw->counter != 0) {
207 /* this basically never happens */ 105 /* this basically never happens */
208 _raw_spin_unlock(&rw->lock); 106 __raw_spin_unlock(&rw->lock);
209 107
210 while(rw->counter != 0); 108 while (rw->counter != 0)
109 cpu_relax();
211 110
212 goto retry; 111 goto retry;
213 } 112 }
@@ -215,26 +114,21 @@ retry:
215 /* got it. now leave without unlocking */ 114 /* got it. now leave without unlocking */
216 rw->counter = -1; /* remember we are locked */ 115 rw->counter = -1; /* remember we are locked */
217} 116}
218#endif /* CONFIG_DEBUG_RWLOCK */
219 117
220/* write_unlock is absolutely trivial - we don't have to wait for anything */ 118/* write_unlock is absolutely trivial - we don't have to wait for anything */
221 119
222static __inline__ void _raw_write_unlock(rwlock_t *rw) 120static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
223{ 121{
224 rw->counter = 0; 122 rw->counter = 0;
225 _raw_spin_unlock(&rw->lock); 123 __raw_spin_unlock(&rw->lock);
226} 124}
227 125
228#ifdef CONFIG_DEBUG_RWLOCK 126static __inline__ int __raw_write_trylock(raw_rwlock_t *rw)
229extern int _dbg_write_trylock(rwlock_t * rw, const char *bfile, int bline);
230#define _raw_write_trylock(rw) _dbg_write_trylock(rw, __FILE__, __LINE__)
231#else
232static __inline__ int _raw_write_trylock(rwlock_t *rw)
233{ 127{
234 _raw_spin_lock(&rw->lock); 128 __raw_spin_lock(&rw->lock);
235 if (rw->counter != 0) { 129 if (rw->counter != 0) {
236 /* this basically never happens */ 130 /* this basically never happens */
237 _raw_spin_unlock(&rw->lock); 131 __raw_spin_unlock(&rw->lock);
238 132
239 return 0; 133 return 0;
240 } 134 }
@@ -243,14 +137,13 @@ static __inline__ int _raw_write_trylock(rwlock_t *rw)
243 rw->counter = -1; /* remember we are locked */ 137 rw->counter = -1; /* remember we are locked */
244 return 1; 138 return 1;
245} 139}
246#endif /* CONFIG_DEBUG_RWLOCK */
247 140
248static __inline__ int is_read_locked(rwlock_t *rw) 141static __inline__ int __raw_is_read_locked(raw_rwlock_t *rw)
249{ 142{
250 return rw->counter > 0; 143 return rw->counter > 0;
251} 144}
252 145
253static __inline__ int is_write_locked(rwlock_t *rw) 146static __inline__ int __raw_is_write_locked(raw_rwlock_t *rw)
254{ 147{
255 return rw->counter < 0; 148 return rw->counter < 0;
256} 149}
diff --git a/include/asm-parisc/spinlock_types.h b/include/asm-parisc/spinlock_types.h
new file mode 100644
index 000000000000..785bba822fbf
--- /dev/null
+++ b/include/asm-parisc/spinlock_types.h
@@ -0,0 +1,21 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock[4];
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 } }
13
14typedef struct {
15 raw_spinlock_t lock;
16 volatile int counter;
17} raw_rwlock_t;
18
19#define __RAW_RW_LOCK_UNLOCKED { __RAW_SPIN_LOCK_UNLOCKED, 0 }
20
21#endif
diff --git a/include/asm-parisc/system.h b/include/asm-parisc/system.h
index 81c543339036..26ff844a21c1 100644
--- a/include/asm-parisc/system.h
+++ b/include/asm-parisc/system.h
@@ -160,29 +160,7 @@ static inline void set_eiem(unsigned long val)
160}) 160})
161 161
162#ifdef CONFIG_SMP 162#ifdef CONFIG_SMP
163/* 163# define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
164 * Your basic SMP spinlocks, allowing only a single CPU anywhere
165 */
166
167typedef struct {
168 volatile unsigned int lock[4];
169#ifdef CONFIG_DEBUG_SPINLOCK
170 unsigned long magic;
171 volatile unsigned int babble;
172 const char *module;
173 char *bfile;
174 int bline;
175 int oncpu;
176 void *previous;
177 struct task_struct * task;
178#endif
179#ifdef CONFIG_PREEMPT
180 unsigned int break_lock;
181#endif
182} spinlock_t;
183
184#define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
185
186#endif 164#endif
187 165
188#define KERNEL_START (0x10100000 - 0x1000) 166#define KERNEL_START (0x10100000 - 0x1000)
diff --git a/include/asm-ppc/smp.h b/include/asm-ppc/smp.h
index 17530c232c76..829481c0a9dc 100644
--- a/include/asm-ppc/smp.h
+++ b/include/asm-ppc/smp.h
@@ -41,6 +41,10 @@ extern void smp_send_xmon_break(int cpu);
41struct pt_regs; 41struct pt_regs;
42extern void smp_message_recv(int, struct pt_regs *); 42extern void smp_message_recv(int, struct pt_regs *);
43 43
44extern int __cpu_disable(void);
45extern void __cpu_die(unsigned int cpu);
46extern void cpu_die(void) __attribute__((noreturn));
47
44#define NO_PROC_ID 0xFF /* No processor magic marker */ 48#define NO_PROC_ID 0xFF /* No processor magic marker */
45#define PROC_CHANGE_PENALTY 20 49#define PROC_CHANGE_PENALTY 20
46 50
@@ -64,6 +68,8 @@ extern struct klock_info_struct klock_info;
64 68
65#else /* !(CONFIG_SMP) */ 69#else /* !(CONFIG_SMP) */
66 70
71static inline void cpu_die(void) { }
72
67#endif /* !(CONFIG_SMP) */ 73#endif /* !(CONFIG_SMP) */
68 74
69#endif /* !(_PPC_SMP_H) */ 75#endif /* !(_PPC_SMP_H) */
diff --git a/include/asm-ppc/spinlock.h b/include/asm-ppc/spinlock.h
index 909199aae104..20edcf2a6e0c 100644
--- a/include/asm-ppc/spinlock.h
+++ b/include/asm-ppc/spinlock.h
@@ -5,41 +5,21 @@
5 5
6/* 6/*
7 * Simple spin lock operations. 7 * Simple spin lock operations.
8 *
9 * (the type definitions are in asm/raw_spinlock_types.h)
8 */ 10 */
9 11
10typedef struct { 12#define __raw_spin_is_locked(x) ((x)->lock != 0)
11 volatile unsigned long lock; 13#define __raw_spin_unlock_wait(lock) \
12#ifdef CONFIG_DEBUG_SPINLOCK 14 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
13 volatile unsigned long owner_pc; 15#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
14 volatile unsigned long owner_cpu; 16
15#endif 17static inline void __raw_spin_lock(raw_spinlock_t *lock)
16#ifdef CONFIG_PREEMPT
17 unsigned int break_lock;
18#endif
19} spinlock_t;
20
21#ifdef __KERNEL__
22#ifdef CONFIG_DEBUG_SPINLOCK
23#define SPINLOCK_DEBUG_INIT , 0, 0
24#else
25#define SPINLOCK_DEBUG_INIT /* */
26#endif
27
28#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 SPINLOCK_DEBUG_INIT }
29
30#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
31#define spin_is_locked(x) ((x)->lock != 0)
32#define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x))
33#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
34
35#ifndef CONFIG_DEBUG_SPINLOCK
36
37static inline void _raw_spin_lock(spinlock_t *lock)
38{ 18{
39 unsigned long tmp; 19 unsigned long tmp;
40 20
41 __asm__ __volatile__( 21 __asm__ __volatile__(
42 "b 1f # spin_lock\n\ 22 "b 1f # __raw_spin_lock\n\
432: lwzx %0,0,%1\n\ 232: lwzx %0,0,%1\n\
44 cmpwi 0,%0,0\n\ 24 cmpwi 0,%0,0\n\
45 bne+ 2b\n\ 25 bne+ 2b\n\
@@ -55,21 +35,13 @@ static inline void _raw_spin_lock(spinlock_t *lock)
55 : "cr0", "memory"); 35 : "cr0", "memory");
56} 36}
57 37
58static inline void _raw_spin_unlock(spinlock_t *lock) 38static inline void __raw_spin_unlock(raw_spinlock_t *lock)
59{ 39{
60 __asm__ __volatile__("eieio # spin_unlock": : :"memory"); 40 __asm__ __volatile__("eieio # __raw_spin_unlock": : :"memory");
61 lock->lock = 0; 41 lock->lock = 0;
62} 42}
63 43
64#define _raw_spin_trylock(l) (!test_and_set_bit(0,&(l)->lock)) 44#define __raw_spin_trylock(l) (!test_and_set_bit(0,&(l)->lock))
65
66#else
67
68extern void _raw_spin_lock(spinlock_t *lock);
69extern void _raw_spin_unlock(spinlock_t *lock);
70extern int _raw_spin_trylock(spinlock_t *lock);
71
72#endif
73 45
74/* 46/*
75 * Read-write spinlocks, allowing multiple readers 47 * Read-write spinlocks, allowing multiple readers
@@ -81,22 +53,11 @@ extern int _raw_spin_trylock(spinlock_t *lock);
81 * irq-safe write-lock, but readers can get non-irqsafe 53 * irq-safe write-lock, but readers can get non-irqsafe
82 * read-locks. 54 * read-locks.
83 */ 55 */
84typedef struct {
85 volatile signed int lock;
86#ifdef CONFIG_PREEMPT
87 unsigned int break_lock;
88#endif
89} rwlock_t;
90 56
91#define RW_LOCK_UNLOCKED (rwlock_t) { 0 } 57#define __raw_read_can_lock(rw) ((rw)->lock >= 0)
92#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0) 58#define __raw_write_can_lock(rw) (!(rw)->lock)
93 59
94#define read_can_lock(rw) ((rw)->lock >= 0) 60static __inline__ int __raw_read_trylock(raw_rwlock_t *rw)
95#define write_can_lock(rw) (!(rw)->lock)
96
97#ifndef CONFIG_DEBUG_SPINLOCK
98
99static __inline__ int _raw_read_trylock(rwlock_t *rw)
100{ 61{
101 signed int tmp; 62 signed int tmp;
102 63
@@ -116,7 +77,7 @@ static __inline__ int _raw_read_trylock(rwlock_t *rw)
116 return tmp > 0; 77 return tmp > 0;
117} 78}
118 79
119static __inline__ void _raw_read_lock(rwlock_t *rw) 80static __inline__ void __raw_read_lock(raw_rwlock_t *rw)
120{ 81{
121 signed int tmp; 82 signed int tmp;
122 83
@@ -137,7 +98,7 @@ static __inline__ void _raw_read_lock(rwlock_t *rw)
137 : "cr0", "memory"); 98 : "cr0", "memory");
138} 99}
139 100
140static __inline__ void _raw_read_unlock(rwlock_t *rw) 101static __inline__ void __raw_read_unlock(raw_rwlock_t *rw)
141{ 102{
142 signed int tmp; 103 signed int tmp;
143 104
@@ -153,7 +114,7 @@ static __inline__ void _raw_read_unlock(rwlock_t *rw)
153 : "cr0", "memory"); 114 : "cr0", "memory");
154} 115}
155 116
156static __inline__ int _raw_write_trylock(rwlock_t *rw) 117static __inline__ int __raw_write_trylock(raw_rwlock_t *rw)
157{ 118{
158 signed int tmp; 119 signed int tmp;
159 120
@@ -173,7 +134,7 @@ static __inline__ int _raw_write_trylock(rwlock_t *rw)
173 return tmp == 0; 134 return tmp == 0;
174} 135}
175 136
176static __inline__ void _raw_write_lock(rwlock_t *rw) 137static __inline__ void __raw_write_lock(raw_rwlock_t *rw)
177{ 138{
178 signed int tmp; 139 signed int tmp;
179 140
@@ -194,22 +155,10 @@ static __inline__ void _raw_write_lock(rwlock_t *rw)
194 : "cr0", "memory"); 155 : "cr0", "memory");
195} 156}
196 157
197static __inline__ void _raw_write_unlock(rwlock_t *rw) 158static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
198{ 159{
199 __asm__ __volatile__("eieio # write_unlock": : :"memory"); 160 __asm__ __volatile__("eieio # write_unlock": : :"memory");
200 rw->lock = 0; 161 rw->lock = 0;
201} 162}
202 163
203#else
204
205extern void _raw_read_lock(rwlock_t *rw);
206extern void _raw_read_unlock(rwlock_t *rw);
207extern void _raw_write_lock(rwlock_t *rw);
208extern void _raw_write_unlock(rwlock_t *rw);
209extern int _raw_read_trylock(rwlock_t *rw);
210extern int _raw_write_trylock(rwlock_t *rw);
211
212#endif
213
214#endif /* __ASM_SPINLOCK_H */ 164#endif /* __ASM_SPINLOCK_H */
215#endif /* __KERNEL__ */
diff --git a/include/asm-ppc/spinlock_types.h b/include/asm-ppc/spinlock_types.h
new file mode 100644
index 000000000000..7919ccc75b8a
--- /dev/null
+++ b/include/asm-ppc/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned long lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile signed int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-ppc/system.h b/include/asm-ppc/system.h
index 513a334c5810..d754ab570fe0 100644
--- a/include/asm-ppc/system.h
+++ b/include/asm-ppc/system.h
@@ -88,6 +88,7 @@ extern void *cacheable_memcpy(void *, const void *, unsigned int);
88extern int do_page_fault(struct pt_regs *, unsigned long, unsigned long); 88extern int do_page_fault(struct pt_regs *, unsigned long, unsigned long);
89extern void bad_page_fault(struct pt_regs *, unsigned long, int); 89extern void bad_page_fault(struct pt_regs *, unsigned long, int);
90extern void die(const char *, struct pt_regs *, long); 90extern void die(const char *, struct pt_regs *, long);
91extern void _exception(int, struct pt_regs *, int, unsigned long);
91#ifdef CONFIG_BOOKE_WDT 92#ifdef CONFIG_BOOKE_WDT
92extern u32 booke_wdt_enabled; 93extern u32 booke_wdt_enabled;
93extern u32 booke_wdt_period; 94extern u32 booke_wdt_period;
diff --git a/include/asm-ppc64/spinlock.h b/include/asm-ppc64/spinlock.h
index acd11564dd75..14cb895bb607 100644
--- a/include/asm-ppc64/spinlock.h
+++ b/include/asm-ppc64/spinlock.h
@@ -15,36 +15,42 @@
15 * modify it under the terms of the GNU General Public License 15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 16 * as published by the Free Software Foundation; either version
17 * 2 of the License, or (at your option) any later version. 17 * 2 of the License, or (at your option) any later version.
18 *
19 * (the type definitions are in asm/spinlock_types.h)
18 */ 20 */
19#include <linux/config.h> 21#include <linux/config.h>
20#include <asm/paca.h> 22#include <asm/paca.h>
21#include <asm/hvcall.h> 23#include <asm/hvcall.h>
22#include <asm/iSeries/HvCall.h> 24#include <asm/iSeries/HvCall.h>
23 25
24typedef struct { 26#define __raw_spin_is_locked(x) ((x)->slock != 0)
25 volatile unsigned int lock;
26#ifdef CONFIG_PREEMPT
27 unsigned int break_lock;
28#endif
29} spinlock_t;
30 27
31typedef struct { 28/*
32 volatile signed int lock; 29 * This returns the old value in the lock, so we succeeded
33#ifdef CONFIG_PREEMPT 30 * in getting the lock if the return value is 0.
34 unsigned int break_lock; 31 */
35#endif 32static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock)
36} rwlock_t; 33{
34 unsigned long tmp, tmp2;
37 35
38#ifdef __KERNEL__ 36 __asm__ __volatile__(
39#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } 37" lwz %1,%3(13) # __spin_trylock\n\
381: lwarx %0,0,%2\n\
39 cmpwi 0,%0,0\n\
40 bne- 2f\n\
41 stwcx. %1,0,%2\n\
42 bne- 1b\n\
43 isync\n\
442:" : "=&r" (tmp), "=&r" (tmp2)
45 : "r" (&lock->slock), "i" (offsetof(struct paca_struct, lock_token))
46 : "cr0", "memory");
40 47
41#define spin_is_locked(x) ((x)->lock != 0) 48 return tmp;
42#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0) 49}
43 50
44static __inline__ void _raw_spin_unlock(spinlock_t *lock) 51static int __inline__ __raw_spin_trylock(raw_spinlock_t *lock)
45{ 52{
46 __asm__ __volatile__("lwsync # spin_unlock": : :"memory"); 53 return __spin_trylock(lock) == 0;
47 lock->lock = 0;
48} 54}
49 55
50/* 56/*
@@ -64,44 +70,15 @@ static __inline__ void _raw_spin_unlock(spinlock_t *lock)
64#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES) 70#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
65/* We only yield to the hypervisor if we are in shared processor mode */ 71/* We only yield to the hypervisor if we are in shared processor mode */
66#define SHARED_PROCESSOR (get_paca()->lppaca.shared_proc) 72#define SHARED_PROCESSOR (get_paca()->lppaca.shared_proc)
67extern void __spin_yield(spinlock_t *lock); 73extern void __spin_yield(raw_spinlock_t *lock);
68extern void __rw_yield(rwlock_t *lock); 74extern void __rw_yield(raw_rwlock_t *lock);
69#else /* SPLPAR || ISERIES */ 75#else /* SPLPAR || ISERIES */
70#define __spin_yield(x) barrier() 76#define __spin_yield(x) barrier()
71#define __rw_yield(x) barrier() 77#define __rw_yield(x) barrier()
72#define SHARED_PROCESSOR 0 78#define SHARED_PROCESSOR 0
73#endif 79#endif
74extern void spin_unlock_wait(spinlock_t *lock);
75
76/*
77 * This returns the old value in the lock, so we succeeded
78 * in getting the lock if the return value is 0.
79 */
80static __inline__ unsigned long __spin_trylock(spinlock_t *lock)
81{
82 unsigned long tmp, tmp2;
83
84 __asm__ __volatile__(
85" lwz %1,%3(13) # __spin_trylock\n\
861: lwarx %0,0,%2\n\
87 cmpwi 0,%0,0\n\
88 bne- 2f\n\
89 stwcx. %1,0,%2\n\
90 bne- 1b\n\
91 isync\n\
922:" : "=&r" (tmp), "=&r" (tmp2)
93 : "r" (&lock->lock), "i" (offsetof(struct paca_struct, lock_token))
94 : "cr0", "memory");
95
96 return tmp;
97}
98
99static int __inline__ _raw_spin_trylock(spinlock_t *lock)
100{
101 return __spin_trylock(lock) == 0;
102}
103 80
104static void __inline__ _raw_spin_lock(spinlock_t *lock) 81static void __inline__ __raw_spin_lock(raw_spinlock_t *lock)
105{ 82{
106 while (1) { 83 while (1) {
107 if (likely(__spin_trylock(lock) == 0)) 84 if (likely(__spin_trylock(lock) == 0))
@@ -110,12 +87,12 @@ static void __inline__ _raw_spin_lock(spinlock_t *lock)
110 HMT_low(); 87 HMT_low();
111 if (SHARED_PROCESSOR) 88 if (SHARED_PROCESSOR)
112 __spin_yield(lock); 89 __spin_yield(lock);
113 } while (unlikely(lock->lock != 0)); 90 } while (unlikely(lock->slock != 0));
114 HMT_medium(); 91 HMT_medium();
115 } 92 }
116} 93}
117 94
118static void __inline__ _raw_spin_lock_flags(spinlock_t *lock, unsigned long flags) 95static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
119{ 96{
120 unsigned long flags_dis; 97 unsigned long flags_dis;
121 98
@@ -128,12 +105,20 @@ static void __inline__ _raw_spin_lock_flags(spinlock_t *lock, unsigned long flag
128 HMT_low(); 105 HMT_low();
129 if (SHARED_PROCESSOR) 106 if (SHARED_PROCESSOR)
130 __spin_yield(lock); 107 __spin_yield(lock);
131 } while (unlikely(lock->lock != 0)); 108 } while (unlikely(lock->slock != 0));
132 HMT_medium(); 109 HMT_medium();
133 local_irq_restore(flags_dis); 110 local_irq_restore(flags_dis);
134 } 111 }
135} 112}
136 113
114static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock)
115{
116 __asm__ __volatile__("lwsync # __raw_spin_unlock": : :"memory");
117 lock->slock = 0;
118}
119
120extern void __raw_spin_unlock_wait(raw_spinlock_t *lock);
121
137/* 122/*
138 * Read-write spinlocks, allowing multiple readers 123 * Read-write spinlocks, allowing multiple readers
139 * but only one writer. 124 * but only one writer.
@@ -144,24 +129,15 @@ static void __inline__ _raw_spin_lock_flags(spinlock_t *lock, unsigned long flag
144 * irq-safe write-lock, but readers can get non-irqsafe 129 * irq-safe write-lock, but readers can get non-irqsafe
145 * read-locks. 130 * read-locks.
146 */ 131 */
147#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
148 132
149#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0) 133#define __raw_read_can_lock(rw) ((rw)->lock >= 0)
150 134#define __raw_write_can_lock(rw) (!(rw)->lock)
151#define read_can_lock(rw) ((rw)->lock >= 0)
152#define write_can_lock(rw) (!(rw)->lock)
153
154static __inline__ void _raw_write_unlock(rwlock_t *rw)
155{
156 __asm__ __volatile__("lwsync # write_unlock": : :"memory");
157 rw->lock = 0;
158}
159 135
160/* 136/*
161 * This returns the old value in the lock + 1, 137 * This returns the old value in the lock + 1,
162 * so we got a read lock if the return value is > 0. 138 * so we got a read lock if the return value is > 0.
163 */ 139 */
164static long __inline__ __read_trylock(rwlock_t *rw) 140static long __inline__ __read_trylock(raw_rwlock_t *rw)
165{ 141{
166 long tmp; 142 long tmp;
167 143
@@ -180,45 +156,11 @@ static long __inline__ __read_trylock(rwlock_t *rw)
180 return tmp; 156 return tmp;
181} 157}
182 158
183static int __inline__ _raw_read_trylock(rwlock_t *rw)
184{
185 return __read_trylock(rw) > 0;
186}
187
188static void __inline__ _raw_read_lock(rwlock_t *rw)
189{
190 while (1) {
191 if (likely(__read_trylock(rw) > 0))
192 break;
193 do {
194 HMT_low();
195 if (SHARED_PROCESSOR)
196 __rw_yield(rw);
197 } while (unlikely(rw->lock < 0));
198 HMT_medium();
199 }
200}
201
202static void __inline__ _raw_read_unlock(rwlock_t *rw)
203{
204 long tmp;
205
206 __asm__ __volatile__(
207 "eieio # read_unlock\n\
2081: lwarx %0,0,%1\n\
209 addic %0,%0,-1\n\
210 stwcx. %0,0,%1\n\
211 bne- 1b"
212 : "=&r"(tmp)
213 : "r"(&rw->lock)
214 : "cr0", "memory");
215}
216
217/* 159/*
218 * This returns the old value in the lock, 160 * This returns the old value in the lock,
219 * so we got the write lock if the return value is 0. 161 * so we got the write lock if the return value is 0.
220 */ 162 */
221static __inline__ long __write_trylock(rwlock_t *rw) 163static __inline__ long __write_trylock(raw_rwlock_t *rw)
222{ 164{
223 long tmp, tmp2; 165 long tmp, tmp2;
224 166
@@ -237,12 +179,21 @@ static __inline__ long __write_trylock(rwlock_t *rw)
237 return tmp; 179 return tmp;
238} 180}
239 181
240static int __inline__ _raw_write_trylock(rwlock_t *rw) 182static void __inline__ __raw_read_lock(raw_rwlock_t *rw)
241{ 183{
242 return __write_trylock(rw) == 0; 184 while (1) {
185 if (likely(__read_trylock(rw) > 0))
186 break;
187 do {
188 HMT_low();
189 if (SHARED_PROCESSOR)
190 __rw_yield(rw);
191 } while (unlikely(rw->lock < 0));
192 HMT_medium();
193 }
243} 194}
244 195
245static void __inline__ _raw_write_lock(rwlock_t *rw) 196static void __inline__ __raw_write_lock(raw_rwlock_t *rw)
246{ 197{
247 while (1) { 198 while (1) {
248 if (likely(__write_trylock(rw) == 0)) 199 if (likely(__write_trylock(rw) == 0))
@@ -256,5 +207,35 @@ static void __inline__ _raw_write_lock(rwlock_t *rw)
256 } 207 }
257} 208}
258 209
259#endif /* __KERNEL__ */ 210static int __inline__ __raw_read_trylock(raw_rwlock_t *rw)
211{
212 return __read_trylock(rw) > 0;
213}
214
215static int __inline__ __raw_write_trylock(raw_rwlock_t *rw)
216{
217 return __write_trylock(rw) == 0;
218}
219
220static void __inline__ __raw_read_unlock(raw_rwlock_t *rw)
221{
222 long tmp;
223
224 __asm__ __volatile__(
225 "eieio # read_unlock\n\
2261: lwarx %0,0,%1\n\
227 addic %0,%0,-1\n\
228 stwcx. %0,0,%1\n\
229 bne- 1b"
230 : "=&r"(tmp)
231 : "r"(&rw->lock)
232 : "cr0", "memory");
233}
234
235static __inline__ void __raw_write_unlock(raw_rwlock_t *rw)
236{
237 __asm__ __volatile__("lwsync # write_unlock": : :"memory");
238 rw->lock = 0;
239}
240
260#endif /* __ASM_SPINLOCK_H */ 241#endif /* __ASM_SPINLOCK_H */
diff --git a/include/asm-ppc64/spinlock_types.h b/include/asm-ppc64/spinlock_types.h
new file mode 100644
index 000000000000..a37c8eabb9f2
--- /dev/null
+++ b/include/asm-ppc64/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int slock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile signed int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-s390/spinlock.h b/include/asm-s390/spinlock.h
index 321b23bba1ec..273dbecf8ace 100644
--- a/include/asm-s390/spinlock.h
+++ b/include/asm-s390/spinlock.h
@@ -27,25 +27,19 @@ _raw_compare_and_swap(volatile unsigned int *lock,
27 * on the local processor, one does not. 27 * on the local processor, one does not.
28 * 28 *
29 * We make no fairness assumptions. They have a cost. 29 * We make no fairness assumptions. They have a cost.
30 *
31 * (the type definitions are in asm/spinlock_types.h)
30 */ 32 */
31 33
32typedef struct { 34#define __raw_spin_is_locked(x) ((x)->lock != 0)
33 volatile unsigned int lock; 35#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
34#ifdef CONFIG_PREEMPT 36#define __raw_spin_unlock_wait(lock) \
35 unsigned int break_lock; 37 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
36#endif
37} __attribute__ ((aligned (4))) spinlock_t;
38
39#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
40#define spin_lock_init(lp) do { (lp)->lock = 0; } while(0)
41#define spin_unlock_wait(lp) do { barrier(); } while(((volatile spinlock_t *)(lp))->lock)
42#define spin_is_locked(x) ((x)->lock != 0)
43#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
44 38
45extern void _raw_spin_lock_wait(spinlock_t *lp, unsigned int pc); 39extern void _raw_spin_lock_wait(raw_spinlock_t *lp, unsigned int pc);
46extern int _raw_spin_trylock_retry(spinlock_t *lp, unsigned int pc); 40extern int _raw_spin_trylock_retry(raw_spinlock_t *lp, unsigned int pc);
47 41
48static inline void _raw_spin_lock(spinlock_t *lp) 42static inline void __raw_spin_lock(raw_spinlock_t *lp)
49{ 43{
50 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0); 44 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0);
51 45
@@ -53,7 +47,7 @@ static inline void _raw_spin_lock(spinlock_t *lp)
53 _raw_spin_lock_wait(lp, pc); 47 _raw_spin_lock_wait(lp, pc);
54} 48}
55 49
56static inline int _raw_spin_trylock(spinlock_t *lp) 50static inline int __raw_spin_trylock(raw_spinlock_t *lp)
57{ 51{
58 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0); 52 unsigned long pc = 1 | (unsigned long) __builtin_return_address(0);
59 53
@@ -62,7 +56,7 @@ static inline int _raw_spin_trylock(spinlock_t *lp)
62 return _raw_spin_trylock_retry(lp, pc); 56 return _raw_spin_trylock_retry(lp, pc);
63} 57}
64 58
65static inline void _raw_spin_unlock(spinlock_t *lp) 59static inline void __raw_spin_unlock(raw_spinlock_t *lp)
66{ 60{
67 _raw_compare_and_swap(&lp->lock, lp->lock, 0); 61 _raw_compare_and_swap(&lp->lock, lp->lock, 0);
68} 62}
@@ -77,36 +71,25 @@ static inline void _raw_spin_unlock(spinlock_t *lp)
77 * irq-safe write-lock, but readers can get non-irqsafe 71 * irq-safe write-lock, but readers can get non-irqsafe
78 * read-locks. 72 * read-locks.
79 */ 73 */
80typedef struct {
81 volatile unsigned int lock;
82 volatile unsigned long owner_pc;
83#ifdef CONFIG_PREEMPT
84 unsigned int break_lock;
85#endif
86} rwlock_t;
87
88#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
89
90#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
91 74
92/** 75/**
93 * read_can_lock - would read_trylock() succeed? 76 * read_can_lock - would read_trylock() succeed?
94 * @lock: the rwlock in question. 77 * @lock: the rwlock in question.
95 */ 78 */
96#define read_can_lock(x) ((int)(x)->lock >= 0) 79#define __raw_read_can_lock(x) ((int)(x)->lock >= 0)
97 80
98/** 81/**
99 * write_can_lock - would write_trylock() succeed? 82 * write_can_lock - would write_trylock() succeed?
100 * @lock: the rwlock in question. 83 * @lock: the rwlock in question.
101 */ 84 */
102#define write_can_lock(x) ((x)->lock == 0) 85#define __raw_write_can_lock(x) ((x)->lock == 0)
103 86
104extern void _raw_read_lock_wait(rwlock_t *lp); 87extern void _raw_read_lock_wait(raw_rwlock_t *lp);
105extern int _raw_read_trylock_retry(rwlock_t *lp); 88extern int _raw_read_trylock_retry(raw_rwlock_t *lp);
106extern void _raw_write_lock_wait(rwlock_t *lp); 89extern void _raw_write_lock_wait(raw_rwlock_t *lp);
107extern int _raw_write_trylock_retry(rwlock_t *lp); 90extern int _raw_write_trylock_retry(raw_rwlock_t *lp);
108 91
109static inline void _raw_read_lock(rwlock_t *rw) 92static inline void __raw_read_lock(raw_rwlock_t *rw)
110{ 93{
111 unsigned int old; 94 unsigned int old;
112 old = rw->lock & 0x7fffffffU; 95 old = rw->lock & 0x7fffffffU;
@@ -114,7 +97,7 @@ static inline void _raw_read_lock(rwlock_t *rw)
114 _raw_read_lock_wait(rw); 97 _raw_read_lock_wait(rw);
115} 98}
116 99
117static inline void _raw_read_unlock(rwlock_t *rw) 100static inline void __raw_read_unlock(raw_rwlock_t *rw)
118{ 101{
119 unsigned int old, cmp; 102 unsigned int old, cmp;
120 103
@@ -125,18 +108,18 @@ static inline void _raw_read_unlock(rwlock_t *rw)
125 } while (cmp != old); 108 } while (cmp != old);
126} 109}
127 110
128static inline void _raw_write_lock(rwlock_t *rw) 111static inline void __raw_write_lock(raw_rwlock_t *rw)
129{ 112{
130 if (unlikely(_raw_compare_and_swap(&rw->lock, 0, 0x80000000) != 0)) 113 if (unlikely(_raw_compare_and_swap(&rw->lock, 0, 0x80000000) != 0))
131 _raw_write_lock_wait(rw); 114 _raw_write_lock_wait(rw);
132} 115}
133 116
134static inline void _raw_write_unlock(rwlock_t *rw) 117static inline void __raw_write_unlock(raw_rwlock_t *rw)
135{ 118{
136 _raw_compare_and_swap(&rw->lock, 0x80000000, 0); 119 _raw_compare_and_swap(&rw->lock, 0x80000000, 0);
137} 120}
138 121
139static inline int _raw_read_trylock(rwlock_t *rw) 122static inline int __raw_read_trylock(raw_rwlock_t *rw)
140{ 123{
141 unsigned int old; 124 unsigned int old;
142 old = rw->lock & 0x7fffffffU; 125 old = rw->lock & 0x7fffffffU;
@@ -145,7 +128,7 @@ static inline int _raw_read_trylock(rwlock_t *rw)
145 return _raw_read_trylock_retry(rw); 128 return _raw_read_trylock_retry(rw);
146} 129}
147 130
148static inline int _raw_write_trylock(rwlock_t *rw) 131static inline int __raw_write_trylock(raw_rwlock_t *rw)
149{ 132{
150 if (likely(_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)) 133 if (likely(_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0))
151 return 1; 134 return 1;
diff --git a/include/asm-s390/spinlock_types.h b/include/asm-s390/spinlock_types.h
new file mode 100644
index 000000000000..f79a2216204f
--- /dev/null
+++ b/include/asm-s390/spinlock_types.h
@@ -0,0 +1,21 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int lock;
10} __attribute__ ((aligned (4))) raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16 volatile unsigned int owner_pc;
17} raw_rwlock_t;
18
19#define __RAW_RW_LOCK_UNLOCKED { 0, 0 }
20
21#endif
diff --git a/include/asm-sh/spinlock.h b/include/asm-sh/spinlock.h
index e770b55649eb..846322d4c35d 100644
--- a/include/asm-sh/spinlock.h
+++ b/include/asm-sh/spinlock.h
@@ -15,20 +15,11 @@
15/* 15/*
16 * Your basic SMP spinlocks, allowing only a single CPU anywhere 16 * Your basic SMP spinlocks, allowing only a single CPU anywhere
17 */ 17 */
18typedef struct {
19 volatile unsigned long lock;
20#ifdef CONFIG_PREEMPT
21 unsigned int break_lock;
22#endif
23} spinlock_t;
24 18
25#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 } 19#define __raw_spin_is_locked(x) ((x)->lock != 0)
26 20#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
27#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0) 21#define __raw_spin_unlock_wait(x) \
28 22 do { cpu_relax(); } while (__raw_spin_is_locked(x))
29#define spin_is_locked(x) ((x)->lock != 0)
30#define spin_unlock_wait(x) do { barrier(); } while (spin_is_locked(x))
31#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
32 23
33/* 24/*
34 * Simple spin lock operations. There are two variants, one clears IRQ's 25 * Simple spin lock operations. There are two variants, one clears IRQ's
@@ -36,7 +27,7 @@ typedef struct {
36 * 27 *
37 * We make no fairness assumptions. They have a cost. 28 * We make no fairness assumptions. They have a cost.
38 */ 29 */
39static inline void _raw_spin_lock(spinlock_t *lock) 30static inline void __raw_spin_lock(raw_spinlock_t *lock)
40{ 31{
41 __asm__ __volatile__ ( 32 __asm__ __volatile__ (
42 "1:\n\t" 33 "1:\n\t"
@@ -49,14 +40,14 @@ static inline void _raw_spin_lock(spinlock_t *lock)
49 ); 40 );
50} 41}
51 42
52static inline void _raw_spin_unlock(spinlock_t *lock) 43static inline void __raw_spin_unlock(raw_spinlock_t *lock)
53{ 44{
54 assert_spin_locked(lock); 45 assert_spin_locked(lock);
55 46
56 lock->lock = 0; 47 lock->lock = 0;
57} 48}
58 49
59#define _raw_spin_trylock(x) (!test_and_set_bit(0, &(x)->lock)) 50#define __raw_spin_trylock(x) (!test_and_set_bit(0, &(x)->lock))
60 51
61/* 52/*
62 * Read-write spinlocks, allowing multiple readers but only one writer. 53 * Read-write spinlocks, allowing multiple readers but only one writer.
@@ -66,51 +57,40 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
66 * needs to get a irq-safe write-lock, but readers can get non-irqsafe 57 * needs to get a irq-safe write-lock, but readers can get non-irqsafe
67 * read-locks. 58 * read-locks.
68 */ 59 */
69typedef struct { 60
70 spinlock_t lock; 61static inline void __raw_read_lock(raw_rwlock_t *rw)
71 atomic_t counter;
72#ifdef CONFIG_PREEMPT
73 unsigned int break_lock;
74#endif
75} rwlock_t;
76
77#define RW_LOCK_BIAS 0x01000000
78#define RW_LOCK_UNLOCKED (rwlock_t) { { 0 }, { RW_LOCK_BIAS } }
79#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while (0)
80
81static inline void _raw_read_lock(rwlock_t *rw)
82{ 62{
83 _raw_spin_lock(&rw->lock); 63 __raw_spin_lock(&rw->lock);
84 64
85 atomic_inc(&rw->counter); 65 atomic_inc(&rw->counter);
86 66
87 _raw_spin_unlock(&rw->lock); 67 __raw_spin_unlock(&rw->lock);
88} 68}
89 69
90static inline void _raw_read_unlock(rwlock_t *rw) 70static inline void __raw_read_unlock(raw_rwlock_t *rw)
91{ 71{
92 _raw_spin_lock(&rw->lock); 72 __raw_spin_lock(&rw->lock);
93 73
94 atomic_dec(&rw->counter); 74 atomic_dec(&rw->counter);
95 75
96 _raw_spin_unlock(&rw->lock); 76 __raw_spin_unlock(&rw->lock);
97} 77}
98 78
99static inline void _raw_write_lock(rwlock_t *rw) 79static inline void __raw_write_lock(raw_rwlock_t *rw)
100{ 80{
101 _raw_spin_lock(&rw->lock); 81 __raw_spin_lock(&rw->lock);
102 atomic_set(&rw->counter, -1); 82 atomic_set(&rw->counter, -1);
103} 83}
104 84
105static inline void _raw_write_unlock(rwlock_t *rw) 85static inline void __raw_write_unlock(raw_rwlock_t *rw)
106{ 86{
107 atomic_set(&rw->counter, 0); 87 atomic_set(&rw->counter, 0);
108 _raw_spin_unlock(&rw->lock); 88 __raw_spin_unlock(&rw->lock);
109} 89}
110 90
111#define _raw_read_trylock(lock) generic_raw_read_trylock(lock) 91#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
112 92
113static inline int _raw_write_trylock(rwlock_t *rw) 93static inline int __raw_write_trylock(raw_rwlock_t *rw)
114{ 94{
115 if (atomic_sub_and_test(RW_LOCK_BIAS, &rw->counter)) 95 if (atomic_sub_and_test(RW_LOCK_BIAS, &rw->counter))
116 return 1; 96 return 1;
@@ -121,4 +101,3 @@ static inline int _raw_write_trylock(rwlock_t *rw)
121} 101}
122 102
123#endif /* __ASM_SH_SPINLOCK_H */ 103#endif /* __ASM_SH_SPINLOCK_H */
124
diff --git a/include/asm-sh/spinlock_types.h b/include/asm-sh/spinlock_types.h
new file mode 100644
index 000000000000..8c41b6c3aac8
--- /dev/null
+++ b/include/asm-sh/spinlock_types.h
@@ -0,0 +1,22 @@
1#ifndef __ASM_SH_SPINLOCK_TYPES_H
2#define __ASM_SH_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned long lock;
10} raw_spinlock_t;
11
12#define __SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 raw_spinlock_t lock;
16 atomic_t counter;
17} raw_rwlock_t;
18
19#define RW_LOCK_BIAS 0x01000000
20#define __RAW_RW_LOCK_UNLOCKED { { 0 }, { RW_LOCK_BIAS } }
21
22#endif
diff --git a/include/asm-sparc/spinlock.h b/include/asm-sparc/spinlock.h
index 0cbd87ad4912..111727a2bb4e 100644
--- a/include/asm-sparc/spinlock.h
+++ b/include/asm-sparc/spinlock.h
@@ -12,96 +12,12 @@
12 12
13#include <asm/psr.h> 13#include <asm/psr.h>
14 14
15#ifdef CONFIG_DEBUG_SPINLOCK 15#define __raw_spin_is_locked(lock) (*((volatile unsigned char *)(lock)) != 0)
16struct _spinlock_debug {
17 unsigned char lock;
18 unsigned long owner_pc;
19#ifdef CONFIG_PREEMPT
20 unsigned int break_lock;
21#endif
22};
23typedef struct _spinlock_debug spinlock_t;
24
25#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0, 0 }
26#define spin_lock_init(lp) do { *(lp)= SPIN_LOCK_UNLOCKED; } while(0)
27#define spin_is_locked(lp) (*((volatile unsigned char *)(&((lp)->lock))) != 0)
28#define spin_unlock_wait(lp) do { barrier(); } while(*(volatile unsigned char *)(&(lp)->lock))
29
30extern void _do_spin_lock(spinlock_t *lock, char *str);
31extern int _spin_trylock(spinlock_t *lock);
32extern void _do_spin_unlock(spinlock_t *lock);
33
34#define _raw_spin_trylock(lp) _spin_trylock(lp)
35#define _raw_spin_lock(lock) _do_spin_lock(lock, "spin_lock")
36#define _raw_spin_unlock(lock) _do_spin_unlock(lock)
37
38struct _rwlock_debug {
39 volatile unsigned int lock;
40 unsigned long owner_pc;
41 unsigned long reader_pc[NR_CPUS];
42#ifdef CONFIG_PREEMPT
43 unsigned int break_lock;
44#endif
45};
46typedef struct _rwlock_debug rwlock_t;
47
48#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, {0} }
49
50#define rwlock_init(lp) do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
51
52extern void _do_read_lock(rwlock_t *rw, char *str);
53extern void _do_read_unlock(rwlock_t *rw, char *str);
54extern void _do_write_lock(rwlock_t *rw, char *str);
55extern void _do_write_unlock(rwlock_t *rw);
56
57#define _raw_read_lock(lock) \
58do { unsigned long flags; \
59 local_irq_save(flags); \
60 _do_read_lock(lock, "read_lock"); \
61 local_irq_restore(flags); \
62} while(0)
63
64#define _raw_read_unlock(lock) \
65do { unsigned long flags; \
66 local_irq_save(flags); \
67 _do_read_unlock(lock, "read_unlock"); \
68 local_irq_restore(flags); \
69} while(0)
70
71#define _raw_write_lock(lock) \
72do { unsigned long flags; \
73 local_irq_save(flags); \
74 _do_write_lock(lock, "write_lock"); \
75 local_irq_restore(flags); \
76} while(0)
77
78#define _raw_write_unlock(lock) \
79do { unsigned long flags; \
80 local_irq_save(flags); \
81 _do_write_unlock(lock); \
82 local_irq_restore(flags); \
83} while(0)
84
85#else /* !CONFIG_DEBUG_SPINLOCK */
86
87typedef struct {
88 unsigned char lock;
89#ifdef CONFIG_PREEMPT
90 unsigned int break_lock;
91#endif
92} spinlock_t;
93
94#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
95
96#define spin_lock_init(lock) (*((unsigned char *)(lock)) = 0)
97#define spin_is_locked(lock) (*((volatile unsigned char *)(lock)) != 0)
98 16
99#define spin_unlock_wait(lock) \ 17#define __raw_spin_unlock_wait(lock) \
100do { \ 18 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
101 barrier(); \
102} while(*((volatile unsigned char *)lock))
103 19
104extern __inline__ void _raw_spin_lock(spinlock_t *lock) 20extern __inline__ void __raw_spin_lock(raw_spinlock_t *lock)
105{ 21{
106 __asm__ __volatile__( 22 __asm__ __volatile__(
107 "\n1:\n\t" 23 "\n1:\n\t"
@@ -121,7 +37,7 @@ extern __inline__ void _raw_spin_lock(spinlock_t *lock)
121 : "g2", "memory", "cc"); 37 : "g2", "memory", "cc");
122} 38}
123 39
124extern __inline__ int _raw_spin_trylock(spinlock_t *lock) 40extern __inline__ int __raw_spin_trylock(raw_spinlock_t *lock)
125{ 41{
126 unsigned int result; 42 unsigned int result;
127 __asm__ __volatile__("ldstub [%1], %0" 43 __asm__ __volatile__("ldstub [%1], %0"
@@ -131,7 +47,7 @@ extern __inline__ int _raw_spin_trylock(spinlock_t *lock)
131 return (result == 0); 47 return (result == 0);
132} 48}
133 49
134extern __inline__ void _raw_spin_unlock(spinlock_t *lock) 50extern __inline__ void __raw_spin_unlock(raw_spinlock_t *lock)
135{ 51{
136 __asm__ __volatile__("stb %%g0, [%0]" : : "r" (lock) : "memory"); 52 __asm__ __volatile__("stb %%g0, [%0]" : : "r" (lock) : "memory");
137} 53}
@@ -147,23 +63,11 @@ extern __inline__ void _raw_spin_unlock(spinlock_t *lock)
147 * 63 *
148 * XXX This might create some problems with my dual spinlock 64 * XXX This might create some problems with my dual spinlock
149 * XXX scheme, deadlocks etc. -DaveM 65 * XXX scheme, deadlocks etc. -DaveM
150 */ 66 *
151typedef struct { 67 * Sort of like atomic_t's on Sparc, but even more clever.
152 volatile unsigned int lock;
153#ifdef CONFIG_PREEMPT
154 unsigned int break_lock;
155#endif
156} rwlock_t;
157
158#define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
159
160#define rwlock_init(lp) do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
161
162
163/* Sort of like atomic_t's on Sparc, but even more clever.
164 * 68 *
165 * ------------------------------------ 69 * ------------------------------------
166 * | 24-bit counter | wlock | rwlock_t 70 * | 24-bit counter | wlock | raw_rwlock_t
167 * ------------------------------------ 71 * ------------------------------------
168 * 31 8 7 0 72 * 31 8 7 0
169 * 73 *
@@ -174,9 +78,9 @@ typedef struct {
174 * 78 *
175 * Unfortunately this scheme limits us to ~16,000,000 cpus. 79 * Unfortunately this scheme limits us to ~16,000,000 cpus.
176 */ 80 */
177extern __inline__ void _read_lock(rwlock_t *rw) 81extern __inline__ void __read_lock(raw_rwlock_t *rw)
178{ 82{
179 register rwlock_t *lp asm("g1"); 83 register raw_rwlock_t *lp asm("g1");
180 lp = rw; 84 lp = rw;
181 __asm__ __volatile__( 85 __asm__ __volatile__(
182 "mov %%o7, %%g4\n\t" 86 "mov %%o7, %%g4\n\t"
@@ -187,16 +91,16 @@ extern __inline__ void _read_lock(rwlock_t *rw)
187 : "g2", "g4", "memory", "cc"); 91 : "g2", "g4", "memory", "cc");
188} 92}
189 93
190#define _raw_read_lock(lock) \ 94#define __raw_read_lock(lock) \
191do { unsigned long flags; \ 95do { unsigned long flags; \
192 local_irq_save(flags); \ 96 local_irq_save(flags); \
193 _read_lock(lock); \ 97 __raw_read_lock(lock); \
194 local_irq_restore(flags); \ 98 local_irq_restore(flags); \
195} while(0) 99} while(0)
196 100
197extern __inline__ void _read_unlock(rwlock_t *rw) 101extern __inline__ void __read_unlock(raw_rwlock_t *rw)
198{ 102{
199 register rwlock_t *lp asm("g1"); 103 register raw_rwlock_t *lp asm("g1");
200 lp = rw; 104 lp = rw;
201 __asm__ __volatile__( 105 __asm__ __volatile__(
202 "mov %%o7, %%g4\n\t" 106 "mov %%o7, %%g4\n\t"
@@ -207,16 +111,16 @@ extern __inline__ void _read_unlock(rwlock_t *rw)
207 : "g2", "g4", "memory", "cc"); 111 : "g2", "g4", "memory", "cc");
208} 112}
209 113
210#define _raw_read_unlock(lock) \ 114#define __raw_read_unlock(lock) \
211do { unsigned long flags; \ 115do { unsigned long flags; \
212 local_irq_save(flags); \ 116 local_irq_save(flags); \
213 _read_unlock(lock); \ 117 __raw_read_unlock(lock); \
214 local_irq_restore(flags); \ 118 local_irq_restore(flags); \
215} while(0) 119} while(0)
216 120
217extern __inline__ void _raw_write_lock(rwlock_t *rw) 121extern __inline__ void __raw_write_lock(raw_rwlock_t *rw)
218{ 122{
219 register rwlock_t *lp asm("g1"); 123 register raw_rwlock_t *lp asm("g1");
220 lp = rw; 124 lp = rw;
221 __asm__ __volatile__( 125 __asm__ __volatile__(
222 "mov %%o7, %%g4\n\t" 126 "mov %%o7, %%g4\n\t"
@@ -227,11 +131,9 @@ extern __inline__ void _raw_write_lock(rwlock_t *rw)
227 : "g2", "g4", "memory", "cc"); 131 : "g2", "g4", "memory", "cc");
228} 132}
229 133
230#define _raw_write_unlock(rw) do { (rw)->lock = 0; } while(0) 134#define __raw_write_unlock(rw) do { (rw)->lock = 0; } while(0)
231
232#endif /* CONFIG_DEBUG_SPINLOCK */
233 135
234#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock) 136#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
235 137
236#endif /* !(__ASSEMBLY__) */ 138#endif /* !(__ASSEMBLY__) */
237 139
diff --git a/include/asm-sparc/spinlock_types.h b/include/asm-sparc/spinlock_types.h
new file mode 100644
index 000000000000..0a0fb116c4ec
--- /dev/null
+++ b/include/asm-sparc/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __SPARC_SPINLOCK_TYPES_H
2#define __SPARC_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 unsigned char lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h
index a02c4370eb42..ec85d12d73b9 100644
--- a/include/asm-sparc64/spinlock.h
+++ b/include/asm-sparc64/spinlock.h
@@ -29,24 +29,13 @@
29 * must be pre-V9 branches. 29 * must be pre-V9 branches.
30 */ 30 */
31 31
32#ifndef CONFIG_DEBUG_SPINLOCK 32#define __raw_spin_is_locked(lp) ((lp)->lock != 0)
33 33
34typedef struct { 34#define __raw_spin_unlock_wait(lp) \
35 volatile unsigned char lock; 35 do { rmb(); \
36#ifdef CONFIG_PREEMPT 36 } while((lp)->lock)
37 unsigned int break_lock;
38#endif
39} spinlock_t;
40#define SPIN_LOCK_UNLOCKED (spinlock_t) {0,}
41 37
42#define spin_lock_init(lp) do { *(lp)= SPIN_LOCK_UNLOCKED; } while(0) 38static inline void __raw_spin_lock(raw_spinlock_t *lock)
43#define spin_is_locked(lp) ((lp)->lock != 0)
44
45#define spin_unlock_wait(lp) \
46do { rmb(); \
47} while((lp)->lock)
48
49static inline void _raw_spin_lock(spinlock_t *lock)
50{ 39{
51 unsigned long tmp; 40 unsigned long tmp;
52 41
@@ -67,7 +56,7 @@ static inline void _raw_spin_lock(spinlock_t *lock)
67 : "memory"); 56 : "memory");
68} 57}
69 58
70static inline int _raw_spin_trylock(spinlock_t *lock) 59static inline int __raw_spin_trylock(raw_spinlock_t *lock)
71{ 60{
72 unsigned long result; 61 unsigned long result;
73 62
@@ -81,7 +70,7 @@ static inline int _raw_spin_trylock(spinlock_t *lock)
81 return (result == 0UL); 70 return (result == 0UL);
82} 71}
83 72
84static inline void _raw_spin_unlock(spinlock_t *lock) 73static inline void __raw_spin_unlock(raw_spinlock_t *lock)
85{ 74{
86 __asm__ __volatile__( 75 __asm__ __volatile__(
87" membar #StoreStore | #LoadStore\n" 76" membar #StoreStore | #LoadStore\n"
@@ -91,7 +80,7 @@ static inline void _raw_spin_unlock(spinlock_t *lock)
91 : "memory"); 80 : "memory");
92} 81}
93 82
94static inline void _raw_spin_lock_flags(spinlock_t *lock, unsigned long flags) 83static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
95{ 84{
96 unsigned long tmp1, tmp2; 85 unsigned long tmp1, tmp2;
97 86
@@ -115,51 +104,9 @@ static inline void _raw_spin_lock_flags(spinlock_t *lock, unsigned long flags)
115 : "memory"); 104 : "memory");
116} 105}
117 106
118#else /* !(CONFIG_DEBUG_SPINLOCK) */
119
120typedef struct {
121 volatile unsigned char lock;
122 unsigned int owner_pc, owner_cpu;
123#ifdef CONFIG_PREEMPT
124 unsigned int break_lock;
125#endif
126} spinlock_t;
127#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0, 0, 0xff }
128#define spin_lock_init(lp) do { *(lp)= SPIN_LOCK_UNLOCKED; } while(0)
129#define spin_is_locked(__lock) ((__lock)->lock != 0)
130#define spin_unlock_wait(__lock) \
131do { \
132 rmb(); \
133} while((__lock)->lock)
134
135extern void _do_spin_lock(spinlock_t *lock, char *str, unsigned long caller);
136extern void _do_spin_unlock(spinlock_t *lock);
137extern int _do_spin_trylock(spinlock_t *lock, unsigned long caller);
138
139#define _raw_spin_trylock(lp) \
140 _do_spin_trylock(lp, (unsigned long) __builtin_return_address(0))
141#define _raw_spin_lock(lock) \
142 _do_spin_lock(lock, "spin_lock", \
143 (unsigned long) __builtin_return_address(0))
144#define _raw_spin_unlock(lock) _do_spin_unlock(lock)
145#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
146
147#endif /* CONFIG_DEBUG_SPINLOCK */
148
149/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */ 107/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */
150 108
151#ifndef CONFIG_DEBUG_SPINLOCK 109static void inline __read_lock(raw_rwlock_t *lock)
152
153typedef struct {
154 volatile unsigned int lock;
155#ifdef CONFIG_PREEMPT
156 unsigned int break_lock;
157#endif
158} rwlock_t;
159#define RW_LOCK_UNLOCKED (rwlock_t) {0,}
160#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
161
162static void inline __read_lock(rwlock_t *lock)
163{ 110{
164 unsigned long tmp1, tmp2; 111 unsigned long tmp1, tmp2;
165 112
@@ -184,7 +131,7 @@ static void inline __read_lock(rwlock_t *lock)
184 : "memory"); 131 : "memory");
185} 132}
186 133
187static void inline __read_unlock(rwlock_t *lock) 134static void inline __read_unlock(raw_rwlock_t *lock)
188{ 135{
189 unsigned long tmp1, tmp2; 136 unsigned long tmp1, tmp2;
190 137
@@ -201,7 +148,7 @@ static void inline __read_unlock(rwlock_t *lock)
201 : "memory"); 148 : "memory");
202} 149}
203 150
204static void inline __write_lock(rwlock_t *lock) 151static void inline __write_lock(raw_rwlock_t *lock)
205{ 152{
206 unsigned long mask, tmp1, tmp2; 153 unsigned long mask, tmp1, tmp2;
207 154
@@ -228,7 +175,7 @@ static void inline __write_lock(rwlock_t *lock)
228 : "memory"); 175 : "memory");
229} 176}
230 177
231static void inline __write_unlock(rwlock_t *lock) 178static void inline __write_unlock(raw_rwlock_t *lock)
232{ 179{
233 __asm__ __volatile__( 180 __asm__ __volatile__(
234" membar #LoadStore | #StoreStore\n" 181" membar #LoadStore | #StoreStore\n"
@@ -238,7 +185,7 @@ static void inline __write_unlock(rwlock_t *lock)
238 : "memory"); 185 : "memory");
239} 186}
240 187
241static int inline __write_trylock(rwlock_t *lock) 188static int inline __write_trylock(raw_rwlock_t *lock)
242{ 189{
243 unsigned long mask, tmp1, tmp2, result; 190 unsigned long mask, tmp1, tmp2, result;
244 191
@@ -263,78 +210,15 @@ static int inline __write_trylock(rwlock_t *lock)
263 return result; 210 return result;
264} 211}
265 212
266#define _raw_read_lock(p) __read_lock(p) 213#define __raw_read_lock(p) __read_lock(p)
267#define _raw_read_unlock(p) __read_unlock(p) 214#define __raw_read_unlock(p) __read_unlock(p)
268#define _raw_write_lock(p) __write_lock(p) 215#define __raw_write_lock(p) __write_lock(p)
269#define _raw_write_unlock(p) __write_unlock(p) 216#define __raw_write_unlock(p) __write_unlock(p)
270#define _raw_write_trylock(p) __write_trylock(p) 217#define __raw_write_trylock(p) __write_trylock(p)
271 218
272#else /* !(CONFIG_DEBUG_SPINLOCK) */ 219#define __raw_read_trylock(lock) generic__raw_read_trylock(lock)
273 220#define __raw_read_can_lock(rw) (!((rw)->lock & 0x80000000UL))
274typedef struct { 221#define __raw_write_can_lock(rw) (!(rw)->lock)
275 volatile unsigned long lock;
276 unsigned int writer_pc, writer_cpu;
277 unsigned int reader_pc[NR_CPUS];
278#ifdef CONFIG_PREEMPT
279 unsigned int break_lock;
280#endif
281} rwlock_t;
282#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, 0xff, { } }
283#define rwlock_init(lp) do { *(lp) = RW_LOCK_UNLOCKED; } while(0)
284
285extern void _do_read_lock(rwlock_t *rw, char *str, unsigned long caller);
286extern void _do_read_unlock(rwlock_t *rw, char *str, unsigned long caller);
287extern void _do_write_lock(rwlock_t *rw, char *str, unsigned long caller);
288extern void _do_write_unlock(rwlock_t *rw, unsigned long caller);
289extern int _do_write_trylock(rwlock_t *rw, char *str, unsigned long caller);
290
291#define _raw_read_lock(lock) \
292do { unsigned long flags; \
293 local_irq_save(flags); \
294 _do_read_lock(lock, "read_lock", \
295 (unsigned long) __builtin_return_address(0)); \
296 local_irq_restore(flags); \
297} while(0)
298
299#define _raw_read_unlock(lock) \
300do { unsigned long flags; \
301 local_irq_save(flags); \
302 _do_read_unlock(lock, "read_unlock", \
303 (unsigned long) __builtin_return_address(0)); \
304 local_irq_restore(flags); \
305} while(0)
306
307#define _raw_write_lock(lock) \
308do { unsigned long flags; \
309 local_irq_save(flags); \
310 _do_write_lock(lock, "write_lock", \
311 (unsigned long) __builtin_return_address(0)); \
312 local_irq_restore(flags); \
313} while(0)
314
315#define _raw_write_unlock(lock) \
316do { unsigned long flags; \
317 local_irq_save(flags); \
318 _do_write_unlock(lock, \
319 (unsigned long) __builtin_return_address(0)); \
320 local_irq_restore(flags); \
321} while(0)
322
323#define _raw_write_trylock(lock) \
324({ unsigned long flags; \
325 int val; \
326 local_irq_save(flags); \
327 val = _do_write_trylock(lock, "write_trylock", \
328 (unsigned long) __builtin_return_address(0)); \
329 local_irq_restore(flags); \
330 val; \
331})
332
333#endif /* CONFIG_DEBUG_SPINLOCK */
334
335#define _raw_read_trylock(lock) generic_raw_read_trylock(lock)
336#define read_can_lock(rw) (!((rw)->lock & 0x80000000UL))
337#define write_can_lock(rw) (!(rw)->lock)
338 222
339#endif /* !(__ASSEMBLY__) */ 223#endif /* !(__ASSEMBLY__) */
340 224
diff --git a/include/asm-sparc64/spinlock_types.h b/include/asm-sparc64/spinlock_types.h
new file mode 100644
index 000000000000..e128112a0d7c
--- /dev/null
+++ b/include/asm-sparc64/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __SPARC64_SPINLOCK_TYPES_H
2#define __SPARC64_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned char lock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { 0 }
19
20#endif
diff --git a/include/asm-um/page.h b/include/asm-um/page.h
index bd850a249183..2c192abe9aeb 100644
--- a/include/asm-um/page.h
+++ b/include/asm-um/page.h
@@ -96,8 +96,7 @@ extern unsigned long uml_physmem;
96 96
97#define __va_space (8*1024*1024) 97#define __va_space (8*1024*1024)
98 98
99extern unsigned long to_phys(void *virt); 99#include "mem.h"
100extern void *to_virt(unsigned long phys);
101 100
102/* Cast to unsigned long before casting to void * to avoid a warning from 101/* Cast to unsigned long before casting to void * to avoid a warning from
103 * mmap_kmem about cutting a long long down to a void *. Not sure that 102 * mmap_kmem about cutting a long long down to a void *. Not sure that
diff --git a/include/asm-um/pgtable.h b/include/asm-um/pgtable.h
index b48e0966ecd7..ed06170e0edd 100644
--- a/include/asm-um/pgtable.h
+++ b/include/asm-um/pgtable.h
@@ -326,14 +326,22 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)
326} 326}
327#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) 327#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
328 328
329extern phys_t page_to_phys(struct page *page);
330
331/* 329/*
332 * Conversion functions: convert a page and protection to a page entry, 330 * Conversion functions: convert a page and protection to a page entry,
333 * and a page entry and page directory to the page they refer to. 331 * and a page entry and page directory to the page they refer to.
334 */ 332 */
335 333
336extern pte_t mk_pte(struct page *page, pgprot_t pgprot); 334#define phys_to_page(phys) pfn_to_page(phys_to_pfn(phys))
335#define __virt_to_page(virt) phys_to_page(__pa(virt))
336#define page_to_phys(page) pfn_to_phys(page_to_pfn(page))
337
338#define mk_pte(page, pgprot) \
339 ({ pte_t pte; \
340 \
341 pte_set_val(pte, page_to_phys(page), (pgprot)); \
342 if (pte_present(pte)) \
343 pte_mknewprot(pte_mknewpage(pte)); \
344 pte;})
337 345
338static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) 346static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
339{ 347{
@@ -410,8 +418,6 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
410#endif 418#endif
411#endif 419#endif
412 420
413extern struct page *phys_to_page(const unsigned long phys);
414extern struct page *__virt_to_page(const unsigned long virt);
415#define virt_to_page(addr) __virt_to_page((const unsigned long) addr) 421#define virt_to_page(addr) __virt_to_page((const unsigned long) addr)
416 422
417/* 423/*
diff --git a/include/asm-um/spinlock_types.h b/include/asm-um/spinlock_types.h
new file mode 100644
index 000000000000..e5a94294bf82
--- /dev/null
+++ b/include/asm-um/spinlock_types.h
@@ -0,0 +1,6 @@
1#ifndef __UM_SPINLOCK_TYPES_H
2#define __UM_SPINLOCK_TYPES_H
3
4#include "asm/arch/spinlock_types.h"
5
6#endif
diff --git a/include/asm-x86_64/proto.h b/include/asm-x86_64/proto.h
index 6c813eb521f3..f7574196424e 100644
--- a/include/asm-x86_64/proto.h
+++ b/include/asm-x86_64/proto.h
@@ -8,7 +8,6 @@
8struct cpuinfo_x86; 8struct cpuinfo_x86;
9struct pt_regs; 9struct pt_regs;
10 10
11extern void get_cpu_vendor(struct cpuinfo_x86*);
12extern void start_kernel(void); 11extern void start_kernel(void);
13extern void pda_init(int); 12extern void pda_init(int);
14 13
diff --git a/include/asm-x86_64/spinlock.h b/include/asm-x86_64/spinlock.h
index 5aeb57a3baad..69636831ad2f 100644
--- a/include/asm-x86_64/spinlock.h
+++ b/include/asm-x86_64/spinlock.h
@@ -6,47 +6,21 @@
6#include <asm/page.h> 6#include <asm/page.h>
7#include <linux/config.h> 7#include <linux/config.h>
8 8
9extern int printk(const char * fmt, ...)
10 __attribute__ ((format (printf, 1, 2)));
11
12/* 9/*
13 * Your basic SMP spinlocks, allowing only a single CPU anywhere 10 * Your basic SMP spinlocks, allowing only a single CPU anywhere
14 */ 11 *
15
16typedef struct {
17 volatile unsigned int lock;
18#ifdef CONFIG_DEBUG_SPINLOCK
19 unsigned magic;
20#endif
21#ifdef CONFIG_PREEMPT
22 unsigned int break_lock;
23#endif
24} spinlock_t;
25
26#define SPINLOCK_MAGIC 0xdead4ead
27
28#ifdef CONFIG_DEBUG_SPINLOCK
29#define SPINLOCK_MAGIC_INIT , SPINLOCK_MAGIC
30#else
31#define SPINLOCK_MAGIC_INIT /* */
32#endif
33
34#define SPIN_LOCK_UNLOCKED (spinlock_t) { 1 SPINLOCK_MAGIC_INIT }
35
36#define spin_lock_init(x) do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
37
38/*
39 * Simple spin lock operations. There are two variants, one clears IRQ's 12 * Simple spin lock operations. There are two variants, one clears IRQ's
40 * on the local processor, one does not. 13 * on the local processor, one does not.
41 * 14 *
42 * We make no fairness assumptions. They have a cost. 15 * We make no fairness assumptions. They have a cost.
16 *
17 * (the type definitions are in asm/spinlock_types.h)
43 */ 18 */
44 19
45#define spin_is_locked(x) (*(volatile signed char *)(&(x)->lock) <= 0) 20#define __raw_spin_is_locked(x) \
46#define spin_unlock_wait(x) do { barrier(); } while(spin_is_locked(x)) 21 (*(volatile signed char *)(&(x)->slock) <= 0)
47#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
48 22
49#define spin_lock_string \ 23#define __raw_spin_lock_string \
50 "\n1:\t" \ 24 "\n1:\t" \
51 "lock ; decb %0\n\t" \ 25 "lock ; decb %0\n\t" \
52 "js 2f\n" \ 26 "js 2f\n" \
@@ -58,74 +32,40 @@ typedef struct {
58 "jmp 1b\n" \ 32 "jmp 1b\n" \
59 LOCK_SECTION_END 33 LOCK_SECTION_END
60 34
61/* 35#define __raw_spin_unlock_string \
62 * This works. Despite all the confusion.
63 * (except on PPro SMP or if we are using OOSTORE)
64 * (PPro errata 66, 92)
65 */
66
67#if !defined(CONFIG_X86_OOSTORE) && !defined(CONFIG_X86_PPRO_FENCE)
68
69#define spin_unlock_string \
70 "movb $1,%0" \ 36 "movb $1,%0" \
71 :"=m" (lock->lock) : : "memory" 37 :"=m" (lock->slock) : : "memory"
72
73
74static inline void _raw_spin_unlock(spinlock_t *lock)
75{
76#ifdef CONFIG_DEBUG_SPINLOCK
77 BUG_ON(lock->magic != SPINLOCK_MAGIC);
78 assert_spin_locked(lock);
79#endif
80 __asm__ __volatile__(
81 spin_unlock_string
82 );
83}
84
85#else
86
87#define spin_unlock_string \
88 "xchgb %b0, %1" \
89 :"=q" (oldval), "=m" (lock->lock) \
90 :"0" (oldval) : "memory"
91 38
92static inline void _raw_spin_unlock(spinlock_t *lock) 39static inline void __raw_spin_lock(raw_spinlock_t *lock)
93{ 40{
94 char oldval = 1;
95#ifdef CONFIG_DEBUG_SPINLOCK
96 BUG_ON(lock->magic != SPINLOCK_MAGIC);
97 assert_spin_locked(lock);
98#endif
99 __asm__ __volatile__( 41 __asm__ __volatile__(
100 spin_unlock_string 42 __raw_spin_lock_string
101 ); 43 :"=m" (lock->slock) : : "memory");
102} 44}
103 45
104#endif 46#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
105 47
106static inline int _raw_spin_trylock(spinlock_t *lock) 48static inline int __raw_spin_trylock(raw_spinlock_t *lock)
107{ 49{
108 char oldval; 50 char oldval;
51
109 __asm__ __volatile__( 52 __asm__ __volatile__(
110 "xchgb %b0,%1" 53 "xchgb %b0,%1"
111 :"=q" (oldval), "=m" (lock->lock) 54 :"=q" (oldval), "=m" (lock->slock)
112 :"0" (0) : "memory"); 55 :"0" (0) : "memory");
56
113 return oldval > 0; 57 return oldval > 0;
114} 58}
115 59
116static inline void _raw_spin_lock(spinlock_t *lock) 60static inline void __raw_spin_unlock(raw_spinlock_t *lock)
117{ 61{
118#ifdef CONFIG_DEBUG_SPINLOCK
119 if (lock->magic != SPINLOCK_MAGIC) {
120 printk("eip: %p\n", __builtin_return_address(0));
121 BUG();
122 }
123#endif
124 __asm__ __volatile__( 62 __asm__ __volatile__(
125 spin_lock_string 63 __raw_spin_unlock_string
126 :"=m" (lock->lock) : : "memory"); 64 );
127} 65}
128 66
67#define __raw_spin_unlock_wait(lock) \
68 do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0)
129 69
130/* 70/*
131 * Read-write spinlocks, allowing multiple readers 71 * Read-write spinlocks, allowing multiple readers
@@ -136,33 +76,7 @@ static inline void _raw_spin_lock(spinlock_t *lock)
136 * can "mix" irq-safe locks - any writer needs to get a 76 * can "mix" irq-safe locks - any writer needs to get a
137 * irq-safe write-lock, but readers can get non-irqsafe 77 * irq-safe write-lock, but readers can get non-irqsafe
138 * read-locks. 78 * read-locks.
139 */ 79 *
140typedef struct {
141 volatile unsigned int lock;
142#ifdef CONFIG_DEBUG_SPINLOCK
143 unsigned magic;
144#endif
145#ifdef CONFIG_PREEMPT
146 unsigned int break_lock;
147#endif
148} rwlock_t;
149
150#define RWLOCK_MAGIC 0xdeaf1eed
151
152#ifdef CONFIG_DEBUG_SPINLOCK
153#define RWLOCK_MAGIC_INIT , RWLOCK_MAGIC
154#else
155#define RWLOCK_MAGIC_INIT /* */
156#endif
157
158#define RW_LOCK_UNLOCKED (rwlock_t) { RW_LOCK_BIAS RWLOCK_MAGIC_INIT }
159
160#define rwlock_init(x) do { *(x) = RW_LOCK_UNLOCKED; } while(0)
161
162#define read_can_lock(x) ((int)(x)->lock > 0)
163#define write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
164
165/*
166 * On x86, we implement read-write locks as a 32-bit counter 80 * On x86, we implement read-write locks as a 32-bit counter
167 * with the high bit (sign) being the "contended" bit. 81 * with the high bit (sign) being the "contended" bit.
168 * 82 *
@@ -170,29 +84,24 @@ typedef struct {
170 * 84 *
171 * Changed to use the same technique as rw semaphores. See 85 * Changed to use the same technique as rw semaphores. See
172 * semaphore.h for details. -ben 86 * semaphore.h for details. -ben
87 *
88 * the helpers are in arch/i386/kernel/semaphore.c
173 */ 89 */
174/* the spinlock helpers are in arch/i386/kernel/semaphore.c */
175 90
176static inline void _raw_read_lock(rwlock_t *rw) 91#define __raw_read_can_lock(x) ((int)(x)->lock > 0)
92#define __raw_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS)
93
94static inline void __raw_read_lock(raw_rwlock_t *rw)
177{ 95{
178#ifdef CONFIG_DEBUG_SPINLOCK
179 BUG_ON(rw->magic != RWLOCK_MAGIC);
180#endif
181 __build_read_lock(rw, "__read_lock_failed"); 96 __build_read_lock(rw, "__read_lock_failed");
182} 97}
183 98
184static inline void _raw_write_lock(rwlock_t *rw) 99static inline void __raw_write_lock(raw_rwlock_t *rw)
185{ 100{
186#ifdef CONFIG_DEBUG_SPINLOCK
187 BUG_ON(rw->magic != RWLOCK_MAGIC);
188#endif
189 __build_write_lock(rw, "__write_lock_failed"); 101 __build_write_lock(rw, "__write_lock_failed");
190} 102}
191 103
192#define _raw_read_unlock(rw) asm volatile("lock ; incl %0" :"=m" ((rw)->lock) : : "memory") 104static inline int __raw_read_trylock(raw_rwlock_t *lock)
193#define _raw_write_unlock(rw) asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0":"=m" ((rw)->lock) : : "memory")
194
195static inline int _raw_read_trylock(rwlock_t *lock)
196{ 105{
197 atomic_t *count = (atomic_t *)lock; 106 atomic_t *count = (atomic_t *)lock;
198 atomic_dec(count); 107 atomic_dec(count);
@@ -202,7 +111,7 @@ static inline int _raw_read_trylock(rwlock_t *lock)
202 return 0; 111 return 0;
203} 112}
204 113
205static inline int _raw_write_trylock(rwlock_t *lock) 114static inline int __raw_write_trylock(raw_rwlock_t *lock)
206{ 115{
207 atomic_t *count = (atomic_t *)lock; 116 atomic_t *count = (atomic_t *)lock;
208 if (atomic_sub_and_test(RW_LOCK_BIAS, count)) 117 if (atomic_sub_and_test(RW_LOCK_BIAS, count))
@@ -211,4 +120,15 @@ static inline int _raw_write_trylock(rwlock_t *lock)
211 return 0; 120 return 0;
212} 121}
213 122
123static inline void __raw_read_unlock(raw_rwlock_t *rw)
124{
125 asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory");
126}
127
128static inline void __raw_write_unlock(raw_rwlock_t *rw)
129{
130 asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ",%0"
131 : "=m" (rw->lock) : : "memory");
132}
133
214#endif /* __ASM_SPINLOCK_H */ 134#endif /* __ASM_SPINLOCK_H */
diff --git a/include/asm-x86_64/spinlock_types.h b/include/asm-x86_64/spinlock_types.h
new file mode 100644
index 000000000000..59efe849f351
--- /dev/null
+++ b/include/asm-x86_64/spinlock_types.h
@@ -0,0 +1,20 @@
1#ifndef __ASM_SPINLOCK_TYPES_H
2#define __ASM_SPINLOCK_TYPES_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8typedef struct {
9 volatile unsigned int slock;
10} raw_spinlock_t;
11
12#define __RAW_SPIN_LOCK_UNLOCKED { 1 }
13
14typedef struct {
15 volatile unsigned int lock;
16} raw_rwlock_t;
17
18#define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS }
19
20#endif
diff --git a/include/linux/bio.h b/include/linux/bio.h
index cdaf03a14a51..6e1c79c8b6bf 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -314,9 +314,8 @@ void zero_fill_bio(struct bio *bio);
314 * bvec_kmap_irq and bvec_kunmap_irq!! 314 * bvec_kmap_irq and bvec_kunmap_irq!!
315 * 315 *
316 * This function MUST be inlined - it plays with the CPU interrupt flags. 316 * This function MUST be inlined - it plays with the CPU interrupt flags.
317 * Hence the `extern inline'.
318 */ 317 */
319extern inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags) 318static inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
320{ 319{
321 unsigned long addr; 320 unsigned long addr;
322 321
@@ -332,7 +331,7 @@ extern inline char *bvec_kmap_irq(struct bio_vec *bvec, unsigned long *flags)
332 return (char *) addr + bvec->bv_offset; 331 return (char *) addr + bvec->bv_offset;
333} 332}
334 333
335extern inline void bvec_kunmap_irq(char *buffer, unsigned long *flags) 334static inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
336{ 335{
337 unsigned long ptr = (unsigned long) buffer & PAGE_MASK; 336 unsigned long ptr = (unsigned long) buffer & PAGE_MASK;
338 337
@@ -345,7 +344,7 @@ extern inline void bvec_kunmap_irq(char *buffer, unsigned long *flags)
345#define bvec_kunmap_irq(buf, flags) do { *(flags) = 0; } while (0) 344#define bvec_kunmap_irq(buf, flags) do { *(flags) = 0; } while (0)
346#endif 345#endif
347 346
348extern inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx, 347static inline char *__bio_kmap_irq(struct bio *bio, unsigned short idx,
349 unsigned long *flags) 348 unsigned long *flags)
350{ 349{
351 return bvec_kmap_irq(bio_iovec_idx(bio, idx), flags); 350 return bvec_kmap_irq(bio_iovec_idx(bio, idx), flags);
diff --git a/include/linux/bit_spinlock.h b/include/linux/bit_spinlock.h
new file mode 100644
index 000000000000..6b20af0bbb79
--- /dev/null
+++ b/include/linux/bit_spinlock.h
@@ -0,0 +1,77 @@
1#ifndef __LINUX_BIT_SPINLOCK_H
2#define __LINUX_BIT_SPINLOCK_H
3
4/*
5 * bit-based spin_lock()
6 *
7 * Don't use this unless you really need to: spin_lock() and spin_unlock()
8 * are significantly faster.
9 */
10static inline void bit_spin_lock(int bitnum, unsigned long *addr)
11{
12 /*
13 * Assuming the lock is uncontended, this never enters
14 * the body of the outer loop. If it is contended, then
15 * within the inner loop a non-atomic test is used to
16 * busywait with less bus contention for a good time to
17 * attempt to acquire the lock bit.
18 */
19 preempt_disable();
20#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
21 while (test_and_set_bit(bitnum, addr)) {
22 while (test_bit(bitnum, addr)) {
23 preempt_enable();
24 cpu_relax();
25 preempt_disable();
26 }
27 }
28#endif
29 __acquire(bitlock);
30}
31
32/*
33 * Return true if it was acquired
34 */
35static inline int bit_spin_trylock(int bitnum, unsigned long *addr)
36{
37 preempt_disable();
38#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
39 if (test_and_set_bit(bitnum, addr)) {
40 preempt_enable();
41 return 0;
42 }
43#endif
44 __acquire(bitlock);
45 return 1;
46}
47
48/*
49 * bit-based spin_unlock()
50 */
51static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
52{
53#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
54 BUG_ON(!test_bit(bitnum, addr));
55 smp_mb__before_clear_bit();
56 clear_bit(bitnum, addr);
57#endif
58 preempt_enable();
59 __release(bitlock);
60}
61
62/*
63 * Return true if the lock is held.
64 */
65static inline int bit_spin_is_locked(int bitnum, unsigned long *addr)
66{
67#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
68 return test_bit(bitnum, addr);
69#elif defined CONFIG_PREEMPT
70 return preempt_count();
71#else
72 return 1;
73#endif
74}
75
76#endif /* __LINUX_BIT_SPINLOCK_H */
77
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index aefa26fbae8a..efdc9b5bc05c 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -728,7 +728,7 @@ static inline unsigned int blksize_bits(unsigned int size)
728 return bits; 728 return bits;
729} 729}
730 730
731extern inline unsigned int block_size(struct block_device *bdev) 731static inline unsigned int block_size(struct block_device *bdev)
732{ 732{
733 return bdev->bd_block_size; 733 return bdev->bd_block_size;
734} 734}
diff --git a/include/linux/chio.h b/include/linux/chio.h
index 63035ae67e63..a404c111c937 100644
--- a/include/linux/chio.h
+++ b/include/linux/chio.h
@@ -96,7 +96,7 @@ struct changer_position {
96 */ 96 */
97struct changer_element_status { 97struct changer_element_status {
98 int ces_type; 98 int ces_type;
99 unsigned char *ces_data; 99 unsigned char __user *ces_data;
100}; 100};
101#define CESTATUS_FULL 0x01 /* full */ 101#define CESTATUS_FULL 0x01 /* full */
102#define CESTATUS_IMPEXP 0x02 /* media was imported (inserted by sysop) */ 102#define CESTATUS_IMPEXP 0x02 /* media was imported (inserted by sysop) */
diff --git a/include/linux/dmapool.h b/include/linux/dmapool.h
index e60bfdac348d..4932ee5c77f0 100644
--- a/include/linux/dmapool.h
+++ b/include/linux/dmapool.h
@@ -19,7 +19,8 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev,
19 19
20void dma_pool_destroy(struct dma_pool *pool); 20void dma_pool_destroy(struct dma_pool *pool);
21 21
22void *dma_pool_alloc(struct dma_pool *pool, int mem_flags, dma_addr_t *handle); 22void *dma_pool_alloc(struct dma_pool *pool, unsigned int __nocast mem_flags,
23 dma_addr_t *handle);
23 24
24void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr); 25void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
25 26
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 7f61227827d7..e0b77c5af9a0 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1509,8 +1509,6 @@ extern void do_generic_mapping_read(struct address_space *mapping,
1509 loff_t *, read_descriptor_t *, read_actor_t); 1509 loff_t *, read_descriptor_t *, read_actor_t);
1510extern void 1510extern void
1511file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); 1511file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
1512extern ssize_t generic_file_direct_IO(int rw, struct kiocb *iocb,
1513 const struct iovec *iov, loff_t offset, unsigned long nr_segs);
1514extern ssize_t generic_file_readv(struct file *filp, const struct iovec *iov, 1512extern ssize_t generic_file_readv(struct file *filp, const struct iovec *iov,
1515 unsigned long nr_segs, loff_t *ppos); 1513 unsigned long nr_segs, loff_t *ppos);
1516ssize_t generic_file_writev(struct file *filp, const struct iovec *iov, 1514ssize_t generic_file_writev(struct file *filp, const struct iovec *iov,
diff --git a/include/linux/in6.h b/include/linux/in6.h
index bd32b79d6295..304aaedea305 100644
--- a/include/linux/in6.h
+++ b/include/linux/in6.h
@@ -198,27 +198,43 @@ struct in6_flowlabel_req
198 * MCAST_MSFILTER 48 198 * MCAST_MSFILTER 48
199 */ 199 */
200 200
201/* RFC3542 advanced socket options (50-67) */ 201/*
202#define IPV6_RECVPKTINFO 50 202 * Advanced API (RFC3542) (1)
203#define IPV6_PKTINFO 51 203 *
204#if 0 204 * Note: IPV6_RECVRTHDRDSTOPTS does not exist. see net/ipv6/datagram.c.
205#define IPV6_RECVPATHMTU 52 205 */
206#define IPV6_PATHMTU 53 206
207#define IPV6_DONTFRAG 54 207#define IPV6_RECVPKTINFO 49
208#define IPV6_USE_MIN_MTU 55 208#define IPV6_PKTINFO 50
209#endif 209#define IPV6_RECVHOPLIMIT 51
210#define IPV6_RECVHOPOPTS 56 210#define IPV6_HOPLIMIT 52
211#define IPV6_HOPOPTS 57 211#define IPV6_RECVHOPOPTS 53
212#if 0 212#define IPV6_HOPOPTS 54
213#define IPV6_RECVRTHDRDSTOPTS 58 /* Unused, see net/ipv6/datagram.c */ 213#define IPV6_RTHDRDSTOPTS 55
214#define IPV6_RECVRTHDR 56
215#define IPV6_RTHDR 57
216#define IPV6_RECVDSTOPTS 58
217#define IPV6_DSTOPTS 59
218#if 0 /* not yet */
219#define IPV6_RECVPATHMTU 60
220#define IPV6_PATHMTU 61
221#define IPV6_DONTFRAG 62
222#define IPV6_USE_MIN_MTU 63
214#endif 223#endif
215#define IPV6_RTHDRDSTOPTS 59 224
216#define IPV6_RECVRTHDR 60 225/*
217#define IPV6_RTHDR 61 226 * Netfilter
218#define IPV6_RECVDSTOPTS 62 227 *
219#define IPV6_DSTOPTS 63 228 * Following socket options are used in ip6_tables;
220#define IPV6_RECVHOPLIMIT 64 229 * see include/linux/netfilter_ipv6/ip6_tables.h.
221#define IPV6_HOPLIMIT 65 230 *
231 * IP6T_SO_SET_REPLACE / IP6T_SO_GET_INFO 64
232 * IP6T_SO_SET_ADD_COUNTERS / IP6T_SO_GET_ENTRIES 65
233 */
234
235/*
236 * Advanced API (RFC3542) (2)
237 */
222#define IPV6_RECVTCLASS 66 238#define IPV6_RECVTCLASS 66
223#define IPV6_TCLASS 67 239#define IPV6_TCLASS 67
224 240
diff --git a/include/linux/input.h b/include/linux/input.h
index 4767e5429534..e8c296ff6257 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -289,6 +289,8 @@ struct input_absinfo {
289#define KEY_SCROLLDOWN 178 289#define KEY_SCROLLDOWN 178
290#define KEY_KPLEFTPAREN 179 290#define KEY_KPLEFTPAREN 179
291#define KEY_KPRIGHTPAREN 180 291#define KEY_KPRIGHTPAREN 180
292#define KEY_NEW 181
293#define KEY_REDO 182
292 294
293#define KEY_F13 183 295#define KEY_F13 183
294#define KEY_F14 184 296#define KEY_F14 184
@@ -335,6 +337,12 @@ struct input_absinfo {
335#define KEY_KBDILLUMDOWN 229 337#define KEY_KBDILLUMDOWN 229
336#define KEY_KBDILLUMUP 230 338#define KEY_KBDILLUMUP 230
337 339
340#define KEY_SEND 231
341#define KEY_REPLY 232
342#define KEY_FORWARDMAIL 233
343#define KEY_SAVE 234
344#define KEY_DOCUMENTS 235
345
338#define KEY_UNKNOWN 240 346#define KEY_UNKNOWN 240
339 347
340#define BTN_MISC 0x100 348#define BTN_MISC 0x100
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index 6c5f7b39a4b0..bb6f88e14061 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -68,7 +68,7 @@ struct ipv6_opt_hdr {
68 68
69struct rt0_hdr { 69struct rt0_hdr {
70 struct ipv6_rt_hdr rt_hdr; 70 struct ipv6_rt_hdr rt_hdr;
71 __u32 bitmap; /* strict/loose bit map */ 71 __u32 reserved;
72 struct in6_addr addr[0]; 72 struct in6_addr addr[0];
73 73
74#define rt0_type rt_hdr.type 74#define rt0_type rt_hdr.type
diff --git a/include/linux/jbd.h b/include/linux/jbd.h
index 84321a4cac93..de097269bd7f 100644
--- a/include/linux/jbd.h
+++ b/include/linux/jbd.h
@@ -28,6 +28,7 @@
28#include <linux/buffer_head.h> 28#include <linux/buffer_head.h>
29#include <linux/journal-head.h> 29#include <linux/journal-head.h>
30#include <linux/stddef.h> 30#include <linux/stddef.h>
31#include <linux/bit_spinlock.h>
31#include <asm/semaphore.h> 32#include <asm/semaphore.h>
32#endif 33#endif
33 34
diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h
index d7a2555a886c..6acfdbba734b 100644
--- a/include/linux/jiffies.h
+++ b/include/linux/jiffies.h
@@ -254,23 +254,23 @@ static inline u64 get_jiffies_64(void)
254 */ 254 */
255static inline unsigned int jiffies_to_msecs(const unsigned long j) 255static inline unsigned int jiffies_to_msecs(const unsigned long j)
256{ 256{
257#if HZ <= 1000 && !(1000 % HZ) 257#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
258 return (1000 / HZ) * j; 258 return (MSEC_PER_SEC / HZ) * j;
259#elif HZ > 1000 && !(HZ % 1000) 259#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
260 return (j + (HZ / 1000) - 1)/(HZ / 1000); 260 return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
261#else 261#else
262 return (j * 1000) / HZ; 262 return (j * MSEC_PER_SEC) / HZ;
263#endif 263#endif
264} 264}
265 265
266static inline unsigned int jiffies_to_usecs(const unsigned long j) 266static inline unsigned int jiffies_to_usecs(const unsigned long j)
267{ 267{
268#if HZ <= 1000000 && !(1000000 % HZ) 268#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
269 return (1000000 / HZ) * j; 269 return (USEC_PER_SEC / HZ) * j;
270#elif HZ > 1000000 && !(HZ % 1000000) 270#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
271 return (j + (HZ / 1000000) - 1)/(HZ / 1000000); 271 return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
272#else 272#else
273 return (j * 1000000) / HZ; 273 return (j * USEC_PER_SEC) / HZ;
274#endif 274#endif
275} 275}
276 276
@@ -278,12 +278,12 @@ static inline unsigned long msecs_to_jiffies(const unsigned int m)
278{ 278{
279 if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET)) 279 if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
280 return MAX_JIFFY_OFFSET; 280 return MAX_JIFFY_OFFSET;
281#if HZ <= 1000 && !(1000 % HZ) 281#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
282 return (m + (1000 / HZ) - 1) / (1000 / HZ); 282 return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
283#elif HZ > 1000 && !(HZ % 1000) 283#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
284 return m * (HZ / 1000); 284 return m * (HZ / MSEC_PER_SEC);
285#else 285#else
286 return (m * HZ + 999) / 1000; 286 return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
287#endif 287#endif
288} 288}
289 289
@@ -291,12 +291,12 @@ static inline unsigned long usecs_to_jiffies(const unsigned int u)
291{ 291{
292 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET)) 292 if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
293 return MAX_JIFFY_OFFSET; 293 return MAX_JIFFY_OFFSET;
294#if HZ <= 1000000 && !(1000000 % HZ) 294#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
295 return (u + (1000000 / HZ) - 1) / (1000000 / HZ); 295 return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
296#elif HZ > 1000000 && !(HZ % 1000000) 296#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
297 return u * (HZ / 1000000); 297 return u * (HZ / USEC_PER_SEC);
298#else 298#else
299 return (u * HZ + 999999) / 1000000; 299 return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC;
300#endif 300#endif
301} 301}
302 302
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
index 8081a281fa5e..9c51917b1cce 100644
--- a/include/linux/radix-tree.h
+++ b/include/linux/radix-tree.h
@@ -24,7 +24,7 @@
24 24
25struct radix_tree_root { 25struct radix_tree_root {
26 unsigned int height; 26 unsigned int height;
27 int gfp_mask; 27 unsigned int gfp_mask;
28 struct radix_tree_node *rnode; 28 struct radix_tree_node *rnode;
29}; 29};
30 30
@@ -50,7 +50,7 @@ void *radix_tree_delete(struct radix_tree_root *, unsigned long);
50unsigned int 50unsigned int
51radix_tree_gang_lookup(struct radix_tree_root *root, void **results, 51radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
52 unsigned long first_index, unsigned int max_items); 52 unsigned long first_index, unsigned int max_items);
53int radix_tree_preload(int gfp_mask); 53int radix_tree_preload(unsigned int __nocast gfp_mask);
54void radix_tree_init(void); 54void radix_tree_init(void);
55void *radix_tree_tag_set(struct radix_tree_root *root, 55void *radix_tree_tag_set(struct radix_tree_root *root,
56 unsigned long index, int tag); 56 unsigned long index, int tag);
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h
index 17e458e17e2b..af00b10294cd 100644
--- a/include/linux/reiserfs_fs.h
+++ b/include/linux/reiserfs_fs.h
@@ -2097,7 +2097,7 @@ void reiserfs_free_block(struct reiserfs_transaction_handle *th, struct inode *,
2097 b_blocknr_t, int for_unformatted); 2097 b_blocknr_t, int for_unformatted);
2098int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *, b_blocknr_t *, int, 2098int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *, b_blocknr_t *, int,
2099 int); 2099 int);
2100extern inline int reiserfs_new_form_blocknrs(struct tree_balance *tb, 2100static inline int reiserfs_new_form_blocknrs(struct tree_balance *tb,
2101 b_blocknr_t * new_blocknrs, 2101 b_blocknr_t * new_blocknrs,
2102 int amount_needed) 2102 int amount_needed)
2103{ 2103{
@@ -2113,7 +2113,7 @@ extern inline int reiserfs_new_form_blocknrs(struct tree_balance *tb,
2113 0); 2113 0);
2114} 2114}
2115 2115
2116extern inline int reiserfs_new_unf_blocknrs(struct reiserfs_transaction_handle 2116static inline int reiserfs_new_unf_blocknrs(struct reiserfs_transaction_handle
2117 *th, struct inode *inode, 2117 *th, struct inode *inode,
2118 b_blocknr_t * new_blocknrs, 2118 b_blocknr_t * new_blocknrs,
2119 struct path *path, long block) 2119 struct path *path, long block)
@@ -2130,7 +2130,7 @@ extern inline int reiserfs_new_unf_blocknrs(struct reiserfs_transaction_handle
2130} 2130}
2131 2131
2132#ifdef REISERFS_PREALLOCATE 2132#ifdef REISERFS_PREALLOCATE
2133extern inline int reiserfs_new_unf_blocknrs2(struct reiserfs_transaction_handle 2133static inline int reiserfs_new_unf_blocknrs2(struct reiserfs_transaction_handle
2134 *th, struct inode *inode, 2134 *th, struct inode *inode,
2135 b_blocknr_t * new_blocknrs, 2135 b_blocknr_t * new_blocknrs,
2136 struct path *path, long block) 2136 struct path *path, long block)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index c551e6a1447e..4b83cb230006 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -114,6 +114,7 @@ extern unsigned long nr_iowait(void);
114#define TASK_TRACED 8 114#define TASK_TRACED 8
115#define EXIT_ZOMBIE 16 115#define EXIT_ZOMBIE 16
116#define EXIT_DEAD 32 116#define EXIT_DEAD 32
117#define TASK_NONINTERACTIVE 64
117 118
118#define __set_task_state(tsk, state_value) \ 119#define __set_task_state(tsk, state_value) \
119 do { (tsk)->state = (state_value); } while (0) 120 do { (tsk)->state = (state_value); } while (0)
@@ -202,6 +203,8 @@ extern int in_sched_functions(unsigned long addr);
202 203
203#define MAX_SCHEDULE_TIMEOUT LONG_MAX 204#define MAX_SCHEDULE_TIMEOUT LONG_MAX
204extern signed long FASTCALL(schedule_timeout(signed long timeout)); 205extern signed long FASTCALL(schedule_timeout(signed long timeout));
206extern signed long schedule_timeout_interruptible(signed long timeout);
207extern signed long schedule_timeout_uninterruptible(signed long timeout);
205asmlinkage void schedule(void); 208asmlinkage void schedule(void);
206 209
207struct namespace; 210struct namespace;
@@ -782,6 +785,7 @@ struct task_struct {
782 short il_next; 785 short il_next;
783#endif 786#endif
784#ifdef CONFIG_CPUSETS 787#ifdef CONFIG_CPUSETS
788 short cpuset_sem_nest_depth;
785 struct cpuset *cpuset; 789 struct cpuset *cpuset;
786 nodemask_t mems_allowed; 790 nodemask_t mems_allowed;
787 int cpuset_mems_generation; 791 int cpuset_mems_generation;
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 42a6bea58af3..1f356f3bbc64 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -118,7 +118,8 @@ extern void kfree(const void *);
118extern unsigned int ksize(const void *); 118extern unsigned int ksize(const void *);
119 119
120#ifdef CONFIG_NUMA 120#ifdef CONFIG_NUMA
121extern void *kmem_cache_alloc_node(kmem_cache_t *, int flags, int node); 121extern void *kmem_cache_alloc_node(kmem_cache_t *,
122 unsigned int __nocast flags, int node);
122extern void *kmalloc_node(size_t size, unsigned int __nocast flags, int node); 123extern void *kmalloc_node(size_t size, unsigned int __nocast flags, int node);
123#else 124#else
124static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, int flags, int node) 125static inline void *kmem_cache_alloc_node(kmem_cache_t *cachep, int flags, int node)
diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h
index d6ba068719b6..cdc99a27840d 100644
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
@@ -2,7 +2,48 @@
2#define __LINUX_SPINLOCK_H 2#define __LINUX_SPINLOCK_H
3 3
4/* 4/*
5 * include/linux/spinlock.h - generic locking declarations 5 * include/linux/spinlock.h - generic spinlock/rwlock declarations
6 *
7 * here's the role of the various spinlock/rwlock related include files:
8 *
9 * on SMP builds:
10 *
11 * asm/spinlock_types.h: contains the raw_spinlock_t/raw_rwlock_t and the
12 * initializers
13 *
14 * linux/spinlock_types.h:
15 * defines the generic type and initializers
16 *
17 * asm/spinlock.h: contains the __raw_spin_*()/etc. lowlevel
18 * implementations, mostly inline assembly code
19 *
20 * (also included on UP-debug builds:)
21 *
22 * linux/spinlock_api_smp.h:
23 * contains the prototypes for the _spin_*() APIs.
24 *
25 * linux/spinlock.h: builds the final spin_*() APIs.
26 *
27 * on UP builds:
28 *
29 * linux/spinlock_type_up.h:
30 * contains the generic, simplified UP spinlock type.
31 * (which is an empty structure on non-debug builds)
32 *
33 * linux/spinlock_types.h:
34 * defines the generic type and initializers
35 *
36 * linux/spinlock_up.h:
37 * contains the __raw_spin_*()/etc. version of UP
38 * builds. (which are NOPs on non-debug, non-preempt
39 * builds)
40 *
41 * (included on UP-non-debug builds:)
42 *
43 * linux/spinlock_api_up.h:
44 * builds the _spin_*() APIs.
45 *
46 * linux/spinlock.h: builds the final spin_*() APIs.
6 */ 47 */
7 48
8#include <linux/config.h> 49#include <linux/config.h>
@@ -13,7 +54,6 @@
13#include <linux/kernel.h> 54#include <linux/kernel.h>
14#include <linux/stringify.h> 55#include <linux/stringify.h>
15 56
16#include <asm/processor.h> /* for cpu relax */
17#include <asm/system.h> 57#include <asm/system.h>
18 58
19/* 59/*
@@ -35,423 +75,84 @@
35#define __lockfunc fastcall __attribute__((section(".spinlock.text"))) 75#define __lockfunc fastcall __attribute__((section(".spinlock.text")))
36 76
37/* 77/*
38 * If CONFIG_SMP is set, pull in the _raw_* definitions 78 * Pull the raw_spinlock_t and raw_rwlock_t definitions:
39 */ 79 */
40#ifdef CONFIG_SMP 80#include <linux/spinlock_types.h>
41
42#define assert_spin_locked(x) BUG_ON(!spin_is_locked(x))
43#include <asm/spinlock.h>
44
45int __lockfunc _spin_trylock(spinlock_t *lock);
46int __lockfunc _read_trylock(rwlock_t *lock);
47int __lockfunc _write_trylock(rwlock_t *lock);
48
49void __lockfunc _spin_lock(spinlock_t *lock) __acquires(spinlock_t);
50void __lockfunc _read_lock(rwlock_t *lock) __acquires(rwlock_t);
51void __lockfunc _write_lock(rwlock_t *lock) __acquires(rwlock_t);
52
53void __lockfunc _spin_unlock(spinlock_t *lock) __releases(spinlock_t);
54void __lockfunc _read_unlock(rwlock_t *lock) __releases(rwlock_t);
55void __lockfunc _write_unlock(rwlock_t *lock) __releases(rwlock_t);
56
57unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock) __acquires(spinlock_t);
58unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock) __acquires(rwlock_t);
59unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock) __acquires(rwlock_t);
60
61void __lockfunc _spin_lock_irq(spinlock_t *lock) __acquires(spinlock_t);
62void __lockfunc _spin_lock_bh(spinlock_t *lock) __acquires(spinlock_t);
63void __lockfunc _read_lock_irq(rwlock_t *lock) __acquires(rwlock_t);
64void __lockfunc _read_lock_bh(rwlock_t *lock) __acquires(rwlock_t);
65void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(rwlock_t);
66void __lockfunc _write_lock_bh(rwlock_t *lock) __acquires(rwlock_t);
67
68void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) __releases(spinlock_t);
69void __lockfunc _spin_unlock_irq(spinlock_t *lock) __releases(spinlock_t);
70void __lockfunc _spin_unlock_bh(spinlock_t *lock) __releases(spinlock_t);
71void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) __releases(rwlock_t);
72void __lockfunc _read_unlock_irq(rwlock_t *lock) __releases(rwlock_t);
73void __lockfunc _read_unlock_bh(rwlock_t *lock) __releases(rwlock_t);
74void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) __releases(rwlock_t);
75void __lockfunc _write_unlock_irq(rwlock_t *lock) __releases(rwlock_t);
76void __lockfunc _write_unlock_bh(rwlock_t *lock) __releases(rwlock_t);
77
78int __lockfunc _spin_trylock_bh(spinlock_t *lock);
79int __lockfunc generic_raw_read_trylock(rwlock_t *lock);
80int in_lock_functions(unsigned long addr);
81
82#else
83 81
84#define in_lock_functions(ADDR) 0 82extern int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock);
85 83
86#if !defined(CONFIG_PREEMPT) && !defined(CONFIG_DEBUG_SPINLOCK)
87# define _atomic_dec_and_lock(atomic,lock) atomic_dec_and_test(atomic)
88# define ATOMIC_DEC_AND_LOCK
89#endif
90
91#ifdef CONFIG_DEBUG_SPINLOCK
92
93#define SPINLOCK_MAGIC 0x1D244B3C
94typedef struct {
95 unsigned long magic;
96 volatile unsigned long lock;
97 volatile unsigned int babble;
98 const char *module;
99 char *owner;
100 int oline;
101} spinlock_t;
102#define SPIN_LOCK_UNLOCKED (spinlock_t) { SPINLOCK_MAGIC, 0, 10, __FILE__ , NULL, 0}
103
104#define spin_lock_init(x) \
105 do { \
106 (x)->magic = SPINLOCK_MAGIC; \
107 (x)->lock = 0; \
108 (x)->babble = 5; \
109 (x)->module = __FILE__; \
110 (x)->owner = NULL; \
111 (x)->oline = 0; \
112 } while (0)
113
114#define CHECK_LOCK(x) \
115 do { \
116 if ((x)->magic != SPINLOCK_MAGIC) { \
117 printk(KERN_ERR "%s:%d: spin_is_locked on uninitialized spinlock %p.\n", \
118 __FILE__, __LINE__, (x)); \
119 } \
120 } while(0)
121
122#define _raw_spin_lock(x) \
123 do { \
124 CHECK_LOCK(x); \
125 if ((x)->lock&&(x)->babble) { \
126 (x)->babble--; \
127 printk("%s:%d: spin_lock(%s:%p) already locked by %s/%d\n", \
128 __FILE__,__LINE__, (x)->module, \
129 (x), (x)->owner, (x)->oline); \
130 } \
131 (x)->lock = 1; \
132 (x)->owner = __FILE__; \
133 (x)->oline = __LINE__; \
134 } while (0)
135
136/* without debugging, spin_is_locked on UP always says
137 * FALSE. --> printk if already locked. */
138#define spin_is_locked(x) \
139 ({ \
140 CHECK_LOCK(x); \
141 if ((x)->lock&&(x)->babble) { \
142 (x)->babble--; \
143 printk("%s:%d: spin_is_locked(%s:%p) already locked by %s/%d\n", \
144 __FILE__,__LINE__, (x)->module, \
145 (x), (x)->owner, (x)->oline); \
146 } \
147 0; \
148 })
149
150/* with debugging, assert_spin_locked() on UP does check
151 * the lock value properly */
152#define assert_spin_locked(x) \
153 ({ \
154 CHECK_LOCK(x); \
155 BUG_ON(!(x)->lock); \
156 })
157
158/* without debugging, spin_trylock on UP always says
159 * TRUE. --> printk if already locked. */
160#define _raw_spin_trylock(x) \
161 ({ \
162 CHECK_LOCK(x); \
163 if ((x)->lock&&(x)->babble) { \
164 (x)->babble--; \
165 printk("%s:%d: spin_trylock(%s:%p) already locked by %s/%d\n", \
166 __FILE__,__LINE__, (x)->module, \
167 (x), (x)->owner, (x)->oline); \
168 } \
169 (x)->lock = 1; \
170 (x)->owner = __FILE__; \
171 (x)->oline = __LINE__; \
172 1; \
173 })
174
175#define spin_unlock_wait(x) \
176 do { \
177 CHECK_LOCK(x); \
178 if ((x)->lock&&(x)->babble) { \
179 (x)->babble--; \
180 printk("%s:%d: spin_unlock_wait(%s:%p) owned by %s/%d\n", \
181 __FILE__,__LINE__, (x)->module, (x), \
182 (x)->owner, (x)->oline); \
183 }\
184 } while (0)
185
186#define _raw_spin_unlock(x) \
187 do { \
188 CHECK_LOCK(x); \
189 if (!(x)->lock&&(x)->babble) { \
190 (x)->babble--; \
191 printk("%s:%d: spin_unlock(%s:%p) not locked\n", \
192 __FILE__,__LINE__, (x)->module, (x));\
193 } \
194 (x)->lock = 0; \
195 } while (0)
196#else
197/* 84/*
198 * gcc versions before ~2.95 have a nasty bug with empty initializers. 85 * Pull the __raw*() functions/declarations (UP-nondebug doesnt need them):
199 */ 86 */
200#if (__GNUC__ > 2) 87#if defined(CONFIG_SMP)
201 typedef struct { } spinlock_t; 88# include <asm/spinlock.h>
202 #define SPIN_LOCK_UNLOCKED (spinlock_t) { }
203#else 89#else
204 typedef struct { int gcc_is_buggy; } spinlock_t; 90# include <linux/spinlock_up.h>
205 #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
206#endif 91#endif
207 92
93#define spin_lock_init(lock) do { *(lock) = SPIN_LOCK_UNLOCKED; } while (0)
94#define rwlock_init(lock) do { *(lock) = RW_LOCK_UNLOCKED; } while (0)
95
96#define spin_is_locked(lock) __raw_spin_is_locked(&(lock)->raw_lock)
97
98/**
99 * spin_unlock_wait - wait until the spinlock gets unlocked
100 * @lock: the spinlock in question.
101 */
102#define spin_unlock_wait(lock) __raw_spin_unlock_wait(&(lock)->raw_lock)
103
208/* 104/*
209 * If CONFIG_SMP is unset, declare the _raw_* definitions as nops 105 * Pull the _spin_*()/_read_*()/_write_*() functions/declarations:
210 */ 106 */
211#define spin_lock_init(lock) do { (void)(lock); } while(0) 107#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
212#define _raw_spin_lock(lock) do { (void)(lock); } while(0) 108# include <linux/spinlock_api_smp.h>
213#define spin_is_locked(lock) ((void)(lock), 0)
214#define assert_spin_locked(lock) do { (void)(lock); } while(0)
215#define _raw_spin_trylock(lock) (((void)(lock), 1))
216#define spin_unlock_wait(lock) (void)(lock)
217#define _raw_spin_unlock(lock) do { (void)(lock); } while(0)
218#endif /* CONFIG_DEBUG_SPINLOCK */
219
220/* RW spinlocks: No debug version */
221
222#if (__GNUC__ > 2)
223 typedef struct { } rwlock_t;
224 #define RW_LOCK_UNLOCKED (rwlock_t) { }
225#else 109#else
226 typedef struct { int gcc_is_buggy; } rwlock_t; 110# include <linux/spinlock_api_up.h>
227 #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
228#endif 111#endif
229 112
230#define rwlock_init(lock) do { (void)(lock); } while(0) 113#ifdef CONFIG_DEBUG_SPINLOCK
231#define _raw_read_lock(lock) do { (void)(lock); } while(0) 114 extern void _raw_spin_lock(spinlock_t *lock);
232#define _raw_read_unlock(lock) do { (void)(lock); } while(0) 115#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
233#define _raw_write_lock(lock) do { (void)(lock); } while(0) 116 extern int _raw_spin_trylock(spinlock_t *lock);
234#define _raw_write_unlock(lock) do { (void)(lock); } while(0) 117 extern void _raw_spin_unlock(spinlock_t *lock);
235#define read_can_lock(lock) (((void)(lock), 1)) 118
236#define write_can_lock(lock) (((void)(lock), 1)) 119 extern void _raw_read_lock(rwlock_t *lock);
237#define _raw_read_trylock(lock) ({ (void)(lock); (1); }) 120 extern int _raw_read_trylock(rwlock_t *lock);
238#define _raw_write_trylock(lock) ({ (void)(lock); (1); }) 121 extern void _raw_read_unlock(rwlock_t *lock);
239 122 extern void _raw_write_lock(rwlock_t *lock);
240#define _spin_trylock(lock) ({preempt_disable(); _raw_spin_trylock(lock) ? \ 123 extern int _raw_write_trylock(rwlock_t *lock);
241 1 : ({preempt_enable(); 0;});}) 124 extern void _raw_write_unlock(rwlock_t *lock);
242 125#else
243#define _read_trylock(lock) ({preempt_disable();_raw_read_trylock(lock) ? \ 126# define _raw_spin_unlock(lock) __raw_spin_unlock(&(lock)->raw_lock)
244 1 : ({preempt_enable(); 0;});}) 127# define _raw_spin_trylock(lock) __raw_spin_trylock(&(lock)->raw_lock)
245 128# define _raw_spin_lock(lock) __raw_spin_lock(&(lock)->raw_lock)
246#define _write_trylock(lock) ({preempt_disable(); _raw_write_trylock(lock) ? \ 129# define _raw_spin_lock_flags(lock, flags) \
247 1 : ({preempt_enable(); 0;});}) 130 __raw_spin_lock_flags(&(lock)->raw_lock, *(flags))
248 131# define _raw_read_lock(rwlock) __raw_read_lock(&(rwlock)->raw_lock)
249#define _spin_trylock_bh(lock) ({preempt_disable(); local_bh_disable(); \ 132# define _raw_write_lock(rwlock) __raw_write_lock(&(rwlock)->raw_lock)
250 _raw_spin_trylock(lock) ? \ 133# define _raw_read_unlock(rwlock) __raw_read_unlock(&(rwlock)->raw_lock)
251 1 : ({preempt_enable_no_resched(); local_bh_enable(); 0;});}) 134# define _raw_write_unlock(rwlock) __raw_write_unlock(&(rwlock)->raw_lock)
252 135# define _raw_read_trylock(rwlock) __raw_read_trylock(&(rwlock)->raw_lock)
253#define _spin_lock(lock) \ 136# define _raw_write_trylock(rwlock) __raw_write_trylock(&(rwlock)->raw_lock)
254do { \ 137#endif
255 preempt_disable(); \
256 _raw_spin_lock(lock); \
257 __acquire(lock); \
258} while(0)
259
260#define _write_lock(lock) \
261do { \
262 preempt_disable(); \
263 _raw_write_lock(lock); \
264 __acquire(lock); \
265} while(0)
266
267#define _read_lock(lock) \
268do { \
269 preempt_disable(); \
270 _raw_read_lock(lock); \
271 __acquire(lock); \
272} while(0)
273
274#define _spin_unlock(lock) \
275do { \
276 _raw_spin_unlock(lock); \
277 preempt_enable(); \
278 __release(lock); \
279} while (0)
280
281#define _write_unlock(lock) \
282do { \
283 _raw_write_unlock(lock); \
284 preempt_enable(); \
285 __release(lock); \
286} while(0)
287
288#define _read_unlock(lock) \
289do { \
290 _raw_read_unlock(lock); \
291 preempt_enable(); \
292 __release(lock); \
293} while(0)
294
295#define _spin_lock_irqsave(lock, flags) \
296do { \
297 local_irq_save(flags); \
298 preempt_disable(); \
299 _raw_spin_lock(lock); \
300 __acquire(lock); \
301} while (0)
302
303#define _spin_lock_irq(lock) \
304do { \
305 local_irq_disable(); \
306 preempt_disable(); \
307 _raw_spin_lock(lock); \
308 __acquire(lock); \
309} while (0)
310
311#define _spin_lock_bh(lock) \
312do { \
313 local_bh_disable(); \
314 preempt_disable(); \
315 _raw_spin_lock(lock); \
316 __acquire(lock); \
317} while (0)
318
319#define _read_lock_irqsave(lock, flags) \
320do { \
321 local_irq_save(flags); \
322 preempt_disable(); \
323 _raw_read_lock(lock); \
324 __acquire(lock); \
325} while (0)
326
327#define _read_lock_irq(lock) \
328do { \
329 local_irq_disable(); \
330 preempt_disable(); \
331 _raw_read_lock(lock); \
332 __acquire(lock); \
333} while (0)
334
335#define _read_lock_bh(lock) \
336do { \
337 local_bh_disable(); \
338 preempt_disable(); \
339 _raw_read_lock(lock); \
340 __acquire(lock); \
341} while (0)
342
343#define _write_lock_irqsave(lock, flags) \
344do { \
345 local_irq_save(flags); \
346 preempt_disable(); \
347 _raw_write_lock(lock); \
348 __acquire(lock); \
349} while (0)
350 138
351#define _write_lock_irq(lock) \ 139#define read_can_lock(rwlock) __raw_read_can_lock(&(rwlock)->raw_lock)
352do { \ 140#define write_can_lock(rwlock) __raw_write_can_lock(&(rwlock)->raw_lock)
353 local_irq_disable(); \
354 preempt_disable(); \
355 _raw_write_lock(lock); \
356 __acquire(lock); \
357} while (0)
358
359#define _write_lock_bh(lock) \
360do { \
361 local_bh_disable(); \
362 preempt_disable(); \
363 _raw_write_lock(lock); \
364 __acquire(lock); \
365} while (0)
366
367#define _spin_unlock_irqrestore(lock, flags) \
368do { \
369 _raw_spin_unlock(lock); \
370 local_irq_restore(flags); \
371 preempt_enable(); \
372 __release(lock); \
373} while (0)
374
375#define _spin_unlock_irq(lock) \
376do { \
377 _raw_spin_unlock(lock); \
378 local_irq_enable(); \
379 preempt_enable(); \
380 __release(lock); \
381} while (0)
382
383#define _spin_unlock_bh(lock) \
384do { \
385 _raw_spin_unlock(lock); \
386 preempt_enable_no_resched(); \
387 local_bh_enable(); \
388 __release(lock); \
389} while (0)
390
391#define _write_unlock_bh(lock) \
392do { \
393 _raw_write_unlock(lock); \
394 preempt_enable_no_resched(); \
395 local_bh_enable(); \
396 __release(lock); \
397} while (0)
398
399#define _read_unlock_irqrestore(lock, flags) \
400do { \
401 _raw_read_unlock(lock); \
402 local_irq_restore(flags); \
403 preempt_enable(); \
404 __release(lock); \
405} while (0)
406
407#define _write_unlock_irqrestore(lock, flags) \
408do { \
409 _raw_write_unlock(lock); \
410 local_irq_restore(flags); \
411 preempt_enable(); \
412 __release(lock); \
413} while (0)
414
415#define _read_unlock_irq(lock) \
416do { \
417 _raw_read_unlock(lock); \
418 local_irq_enable(); \
419 preempt_enable(); \
420 __release(lock); \
421} while (0)
422
423#define _read_unlock_bh(lock) \
424do { \
425 _raw_read_unlock(lock); \
426 preempt_enable_no_resched(); \
427 local_bh_enable(); \
428 __release(lock); \
429} while (0)
430
431#define _write_unlock_irq(lock) \
432do { \
433 _raw_write_unlock(lock); \
434 local_irq_enable(); \
435 preempt_enable(); \
436 __release(lock); \
437} while (0)
438
439#endif /* !SMP */
440 141
441/* 142/*
442 * Define the various spin_lock and rw_lock methods. Note we define these 143 * Define the various spin_lock and rw_lock methods. Note we define these
443 * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various 144 * regardless of whether CONFIG_SMP or CONFIG_PREEMPT are set. The various
444 * methods are defined as nops in the case they are not required. 145 * methods are defined as nops in the case they are not required.
445 */ 146 */
446#define spin_trylock(lock) __cond_lock(_spin_trylock(lock)) 147#define spin_trylock(lock) __cond_lock(_spin_trylock(lock))
447#define read_trylock(lock) __cond_lock(_read_trylock(lock)) 148#define read_trylock(lock) __cond_lock(_read_trylock(lock))
448#define write_trylock(lock) __cond_lock(_write_trylock(lock)) 149#define write_trylock(lock) __cond_lock(_write_trylock(lock))
449 150
450#define spin_lock(lock) _spin_lock(lock) 151#define spin_lock(lock) _spin_lock(lock)
451#define write_lock(lock) _write_lock(lock) 152#define write_lock(lock) _write_lock(lock)
452#define read_lock(lock) _read_lock(lock) 153#define read_lock(lock) _read_lock(lock)
453 154
454#ifdef CONFIG_SMP 155#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
455#define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock) 156#define spin_lock_irqsave(lock, flags) flags = _spin_lock_irqsave(lock)
456#define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock) 157#define read_lock_irqsave(lock, flags) flags = _read_lock_irqsave(lock)
457#define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock) 158#define write_lock_irqsave(lock, flags) flags = _write_lock_irqsave(lock)
@@ -470,137 +171,59 @@ do { \
470#define write_lock_irq(lock) _write_lock_irq(lock) 171#define write_lock_irq(lock) _write_lock_irq(lock)
471#define write_lock_bh(lock) _write_lock_bh(lock) 172#define write_lock_bh(lock) _write_lock_bh(lock)
472 173
473#define spin_unlock(lock) _spin_unlock(lock) 174#define spin_unlock(lock) _spin_unlock(lock)
474#define write_unlock(lock) _write_unlock(lock) 175#define write_unlock(lock) _write_unlock(lock)
475#define read_unlock(lock) _read_unlock(lock) 176#define read_unlock(lock) _read_unlock(lock)
476 177
477#define spin_unlock_irqrestore(lock, flags) _spin_unlock_irqrestore(lock, flags) 178#define spin_unlock_irqrestore(lock, flags) \
179 _spin_unlock_irqrestore(lock, flags)
478#define spin_unlock_irq(lock) _spin_unlock_irq(lock) 180#define spin_unlock_irq(lock) _spin_unlock_irq(lock)
479#define spin_unlock_bh(lock) _spin_unlock_bh(lock) 181#define spin_unlock_bh(lock) _spin_unlock_bh(lock)
480 182
481#define read_unlock_irqrestore(lock, flags) _read_unlock_irqrestore(lock, flags) 183#define read_unlock_irqrestore(lock, flags) \
482#define read_unlock_irq(lock) _read_unlock_irq(lock) 184 _read_unlock_irqrestore(lock, flags)
483#define read_unlock_bh(lock) _read_unlock_bh(lock) 185#define read_unlock_irq(lock) _read_unlock_irq(lock)
186#define read_unlock_bh(lock) _read_unlock_bh(lock)
484 187
485#define write_unlock_irqrestore(lock, flags) _write_unlock_irqrestore(lock, flags) 188#define write_unlock_irqrestore(lock, flags) \
486#define write_unlock_irq(lock) _write_unlock_irq(lock) 189 _write_unlock_irqrestore(lock, flags)
487#define write_unlock_bh(lock) _write_unlock_bh(lock) 190#define write_unlock_irq(lock) _write_unlock_irq(lock)
191#define write_unlock_bh(lock) _write_unlock_bh(lock)
488 192
489#define spin_trylock_bh(lock) __cond_lock(_spin_trylock_bh(lock)) 193#define spin_trylock_bh(lock) __cond_lock(_spin_trylock_bh(lock))
490 194
491#define spin_trylock_irq(lock) \ 195#define spin_trylock_irq(lock) \
492({ \ 196({ \
493 local_irq_disable(); \ 197 local_irq_disable(); \
494 _spin_trylock(lock) ? \ 198 _spin_trylock(lock) ? \
495 1 : ({local_irq_enable(); 0; }); \ 199 1 : ({ local_irq_enable(); 0; }); \
496}) 200})
497 201
498#define spin_trylock_irqsave(lock, flags) \ 202#define spin_trylock_irqsave(lock, flags) \
499({ \ 203({ \
500 local_irq_save(flags); \ 204 local_irq_save(flags); \
501 _spin_trylock(lock) ? \ 205 _spin_trylock(lock) ? \
502 1 : ({local_irq_restore(flags); 0;}); \ 206 1 : ({ local_irq_restore(flags); 0; }); \
503}) 207})
504 208
505#ifdef CONFIG_LOCKMETER
506extern void _metered_spin_lock (spinlock_t *lock);
507extern void _metered_spin_unlock (spinlock_t *lock);
508extern int _metered_spin_trylock(spinlock_t *lock);
509extern void _metered_read_lock (rwlock_t *lock);
510extern void _metered_read_unlock (rwlock_t *lock);
511extern void _metered_write_lock (rwlock_t *lock);
512extern void _metered_write_unlock (rwlock_t *lock);
513extern int _metered_read_trylock (rwlock_t *lock);
514extern int _metered_write_trylock(rwlock_t *lock);
515#endif
516
517/* "lock on reference count zero" */
518#ifndef ATOMIC_DEC_AND_LOCK
519#include <asm/atomic.h>
520extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
521#endif
522
523#define atomic_dec_and_lock(atomic,lock) __cond_lock(_atomic_dec_and_lock(atomic,lock))
524
525/*
526 * bit-based spin_lock()
527 *
528 * Don't use this unless you really need to: spin_lock() and spin_unlock()
529 * are significantly faster.
530 */
531static inline void bit_spin_lock(int bitnum, unsigned long *addr)
532{
533 /*
534 * Assuming the lock is uncontended, this never enters
535 * the body of the outer loop. If it is contended, then
536 * within the inner loop a non-atomic test is used to
537 * busywait with less bus contention for a good time to
538 * attempt to acquire the lock bit.
539 */
540 preempt_disable();
541#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
542 while (test_and_set_bit(bitnum, addr)) {
543 while (test_bit(bitnum, addr)) {
544 preempt_enable();
545 cpu_relax();
546 preempt_disable();
547 }
548 }
549#endif
550 __acquire(bitlock);
551}
552
553/* 209/*
554 * Return true if it was acquired 210 * Pull the atomic_t declaration:
211 * (asm-mips/atomic.h needs above definitions)
555 */ 212 */
556static inline int bit_spin_trylock(int bitnum, unsigned long *addr) 213#include <asm/atomic.h>
557{ 214/**
558 preempt_disable(); 215 * atomic_dec_and_lock - lock on reaching reference count zero
559#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) 216 * @atomic: the atomic counter
560 if (test_and_set_bit(bitnum, addr)) { 217 * @lock: the spinlock in question
561 preempt_enable();
562 return 0;
563 }
564#endif
565 __acquire(bitlock);
566 return 1;
567}
568
569/*
570 * bit-based spin_unlock()
571 */
572static inline void bit_spin_unlock(int bitnum, unsigned long *addr)
573{
574#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
575 BUG_ON(!test_bit(bitnum, addr));
576 smp_mb__before_clear_bit();
577 clear_bit(bitnum, addr);
578#endif
579 preempt_enable();
580 __release(bitlock);
581}
582
583/*
584 * Return true if the lock is held.
585 */ 218 */
586static inline int bit_spin_is_locked(int bitnum, unsigned long *addr) 219extern int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock);
587{ 220#define atomic_dec_and_lock(atomic, lock) \
588#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) 221 __cond_lock(_atomic_dec_and_lock(atomic, lock))
589 return test_bit(bitnum, addr);
590#elif defined CONFIG_PREEMPT
591 return preempt_count();
592#else
593 return 1;
594#endif
595}
596
597#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED
598#define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED
599 222
600/** 223/**
601 * spin_can_lock - would spin_trylock() succeed? 224 * spin_can_lock - would spin_trylock() succeed?
602 * @lock: the spinlock in question. 225 * @lock: the spinlock in question.
603 */ 226 */
604#define spin_can_lock(lock) (!spin_is_locked(lock)) 227#define spin_can_lock(lock) (!spin_is_locked(lock))
605 228
606#endif /* __LINUX_SPINLOCK_H */ 229#endif /* __LINUX_SPINLOCK_H */
diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h
new file mode 100644
index 000000000000..78e6989ffb54
--- /dev/null
+++ b/include/linux/spinlock_api_smp.h
@@ -0,0 +1,57 @@
1#ifndef __LINUX_SPINLOCK_API_SMP_H
2#define __LINUX_SPINLOCK_API_SMP_H
3
4#ifndef __LINUX_SPINLOCK_H
5# error "please don't include this file directly"
6#endif
7
8/*
9 * include/linux/spinlock_api_smp.h
10 *
11 * spinlock API declarations on SMP (and debug)
12 * (implemented in kernel/spinlock.c)
13 *
14 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
15 * Released under the General Public License (GPL).
16 */
17
18int in_lock_functions(unsigned long addr);
19
20#define assert_spin_locked(x) BUG_ON(!spin_is_locked(x))
21
22void __lockfunc _spin_lock(spinlock_t *lock) __acquires(spinlock_t);
23void __lockfunc _read_lock(rwlock_t *lock) __acquires(rwlock_t);
24void __lockfunc _write_lock(rwlock_t *lock) __acquires(rwlock_t);
25void __lockfunc _spin_lock_bh(spinlock_t *lock) __acquires(spinlock_t);
26void __lockfunc _read_lock_bh(rwlock_t *lock) __acquires(rwlock_t);
27void __lockfunc _write_lock_bh(rwlock_t *lock) __acquires(rwlock_t);
28void __lockfunc _spin_lock_irq(spinlock_t *lock) __acquires(spinlock_t);
29void __lockfunc _read_lock_irq(rwlock_t *lock) __acquires(rwlock_t);
30void __lockfunc _write_lock_irq(rwlock_t *lock) __acquires(rwlock_t);
31unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
32 __acquires(spinlock_t);
33unsigned long __lockfunc _read_lock_irqsave(rwlock_t *lock)
34 __acquires(rwlock_t);
35unsigned long __lockfunc _write_lock_irqsave(rwlock_t *lock)
36 __acquires(rwlock_t);
37int __lockfunc _spin_trylock(spinlock_t *lock);
38int __lockfunc _read_trylock(rwlock_t *lock);
39int __lockfunc _write_trylock(rwlock_t *lock);
40int __lockfunc _spin_trylock_bh(spinlock_t *lock);
41void __lockfunc _spin_unlock(spinlock_t *lock) __releases(spinlock_t);
42void __lockfunc _read_unlock(rwlock_t *lock) __releases(rwlock_t);
43void __lockfunc _write_unlock(rwlock_t *lock) __releases(rwlock_t);
44void __lockfunc _spin_unlock_bh(spinlock_t *lock) __releases(spinlock_t);
45void __lockfunc _read_unlock_bh(rwlock_t *lock) __releases(rwlock_t);
46void __lockfunc _write_unlock_bh(rwlock_t *lock) __releases(rwlock_t);
47void __lockfunc _spin_unlock_irq(spinlock_t *lock) __releases(spinlock_t);
48void __lockfunc _read_unlock_irq(rwlock_t *lock) __releases(rwlock_t);
49void __lockfunc _write_unlock_irq(rwlock_t *lock) __releases(rwlock_t);
50void __lockfunc _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
51 __releases(spinlock_t);
52void __lockfunc _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
53 __releases(rwlock_t);
54void __lockfunc _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags)
55 __releases(rwlock_t);
56
57#endif /* __LINUX_SPINLOCK_API_SMP_H */
diff --git a/include/linux/spinlock_api_up.h b/include/linux/spinlock_api_up.h
new file mode 100644
index 000000000000..cd81cee566f4
--- /dev/null
+++ b/include/linux/spinlock_api_up.h
@@ -0,0 +1,80 @@
1#ifndef __LINUX_SPINLOCK_API_UP_H
2#define __LINUX_SPINLOCK_API_UP_H
3
4#ifndef __LINUX_SPINLOCK_H
5# error "please don't include this file directly"
6#endif
7
8/*
9 * include/linux/spinlock_api_up.h
10 *
11 * spinlock API implementation on UP-nondebug (inlined implementation)
12 *
13 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
14 * Released under the General Public License (GPL).
15 */
16
17#define in_lock_functions(ADDR) 0
18
19#define assert_spin_locked(lock) do { (void)(lock); } while (0)
20
21/*
22 * In the UP-nondebug case there's no real locking going on, so the
23 * only thing we have to do is to keep the preempt counts and irq
24 * flags straight, to supress compiler warnings of unused lock
25 * variables, and to add the proper checker annotations:
26 */
27#define __LOCK(lock) \
28 do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
29
30#define __LOCK_BH(lock) \
31 do { local_bh_disable(); __LOCK(lock); } while (0)
32
33#define __LOCK_IRQ(lock) \
34 do { local_irq_disable(); __LOCK(lock); } while (0)
35
36#define __LOCK_IRQSAVE(lock, flags) \
37 do { local_irq_save(flags); __LOCK(lock); } while (0)
38
39#define __UNLOCK(lock) \
40 do { preempt_enable(); __release(lock); (void)(lock); } while (0)
41
42#define __UNLOCK_BH(lock) \
43 do { preempt_enable_no_resched(); local_bh_enable(); __release(lock); (void)(lock); } while (0)
44
45#define __UNLOCK_IRQ(lock) \
46 do { local_irq_enable(); __UNLOCK(lock); } while (0)
47
48#define __UNLOCK_IRQRESTORE(lock, flags) \
49 do { local_irq_restore(flags); __UNLOCK(lock); } while (0)
50
51#define _spin_lock(lock) __LOCK(lock)
52#define _read_lock(lock) __LOCK(lock)
53#define _write_lock(lock) __LOCK(lock)
54#define _spin_lock_bh(lock) __LOCK_BH(lock)
55#define _read_lock_bh(lock) __LOCK_BH(lock)
56#define _write_lock_bh(lock) __LOCK_BH(lock)
57#define _spin_lock_irq(lock) __LOCK_IRQ(lock)
58#define _read_lock_irq(lock) __LOCK_IRQ(lock)
59#define _write_lock_irq(lock) __LOCK_IRQ(lock)
60#define _spin_lock_irqsave(lock, flags) __LOCK_IRQSAVE(lock, flags)
61#define _read_lock_irqsave(lock, flags) __LOCK_IRQSAVE(lock, flags)
62#define _write_lock_irqsave(lock, flags) __LOCK_IRQSAVE(lock, flags)
63#define _spin_trylock(lock) ({ __LOCK(lock); 1; })
64#define _read_trylock(lock) ({ __LOCK(lock); 1; })
65#define _write_trylock(lock) ({ __LOCK(lock); 1; })
66#define _spin_trylock_bh(lock) ({ __LOCK_BH(lock); 1; })
67#define _spin_unlock(lock) __UNLOCK(lock)
68#define _read_unlock(lock) __UNLOCK(lock)
69#define _write_unlock(lock) __UNLOCK(lock)
70#define _spin_unlock_bh(lock) __UNLOCK_BH(lock)
71#define _write_unlock_bh(lock) __UNLOCK_BH(lock)
72#define _read_unlock_bh(lock) __UNLOCK_BH(lock)
73#define _spin_unlock_irq(lock) __UNLOCK_IRQ(lock)
74#define _read_unlock_irq(lock) __UNLOCK_IRQ(lock)
75#define _write_unlock_irq(lock) __UNLOCK_IRQ(lock)
76#define _spin_unlock_irqrestore(lock, flags) __UNLOCK_IRQRESTORE(lock, flags)
77#define _read_unlock_irqrestore(lock, flags) __UNLOCK_IRQRESTORE(lock, flags)
78#define _write_unlock_irqrestore(lock, flags) __UNLOCK_IRQRESTORE(lock, flags)
79
80#endif /* __LINUX_SPINLOCK_API_UP_H */
diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h
new file mode 100644
index 000000000000..9cb51e070390
--- /dev/null
+++ b/include/linux/spinlock_types.h
@@ -0,0 +1,67 @@
1#ifndef __LINUX_SPINLOCK_TYPES_H
2#define __LINUX_SPINLOCK_TYPES_H
3
4/*
5 * include/linux/spinlock_types.h - generic spinlock type definitions
6 * and initializers
7 *
8 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
9 * Released under the General Public License (GPL).
10 */
11
12#if defined(CONFIG_SMP)
13# include <asm/spinlock_types.h>
14#else
15# include <linux/spinlock_types_up.h>
16#endif
17
18typedef struct {
19 raw_spinlock_t raw_lock;
20#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
21 unsigned int break_lock;
22#endif
23#ifdef CONFIG_DEBUG_SPINLOCK
24 unsigned int magic, owner_cpu;
25 void *owner;
26#endif
27} spinlock_t;
28
29#define SPINLOCK_MAGIC 0xdead4ead
30
31typedef struct {
32 raw_rwlock_t raw_lock;
33#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP)
34 unsigned int break_lock;
35#endif
36#ifdef CONFIG_DEBUG_SPINLOCK
37 unsigned int magic, owner_cpu;
38 void *owner;
39#endif
40} rwlock_t;
41
42#define RWLOCK_MAGIC 0xdeaf1eed
43
44#define SPINLOCK_OWNER_INIT ((void *)-1L)
45
46#ifdef CONFIG_DEBUG_SPINLOCK
47# define SPIN_LOCK_UNLOCKED \
48 (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED, \
49 .magic = SPINLOCK_MAGIC, \
50 .owner = SPINLOCK_OWNER_INIT, \
51 .owner_cpu = -1 }
52#define RW_LOCK_UNLOCKED \
53 (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED, \
54 .magic = RWLOCK_MAGIC, \
55 .owner = SPINLOCK_OWNER_INIT, \
56 .owner_cpu = -1 }
57#else
58# define SPIN_LOCK_UNLOCKED \
59 (spinlock_t) { .raw_lock = __RAW_SPIN_LOCK_UNLOCKED }
60#define RW_LOCK_UNLOCKED \
61 (rwlock_t) { .raw_lock = __RAW_RW_LOCK_UNLOCKED }
62#endif
63
64#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED
65#define DEFINE_RWLOCK(x) rwlock_t x = RW_LOCK_UNLOCKED
66
67#endif /* __LINUX_SPINLOCK_TYPES_H */
diff --git a/include/linux/spinlock_types_up.h b/include/linux/spinlock_types_up.h
new file mode 100644
index 000000000000..def2d173a8db
--- /dev/null
+++ b/include/linux/spinlock_types_up.h
@@ -0,0 +1,51 @@
1#ifndef __LINUX_SPINLOCK_TYPES_UP_H
2#define __LINUX_SPINLOCK_TYPES_UP_H
3
4#ifndef __LINUX_SPINLOCK_TYPES_H
5# error "please don't include this file directly"
6#endif
7
8/*
9 * include/linux/spinlock_types_up.h - spinlock type definitions for UP
10 *
11 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
12 * Released under the General Public License (GPL).
13 */
14
15#ifdef CONFIG_DEBUG_SPINLOCK
16
17typedef struct {
18 volatile unsigned int slock;
19} raw_spinlock_t;
20
21#define __RAW_SPIN_LOCK_UNLOCKED { 1 }
22
23#else
24
25/*
26 * All gcc 2.95 versions and early versions of 2.96 have a nasty bug
27 * with empty initializers.
28 */
29#if (__GNUC__ > 2)
30typedef struct { } raw_spinlock_t;
31
32#define __RAW_SPIN_LOCK_UNLOCKED { }
33#else
34typedef struct { int gcc_is_buggy; } raw_spinlock_t;
35#define __RAW_SPIN_LOCK_UNLOCKED (raw_spinlock_t) { 0 }
36#endif
37
38#endif
39
40#if (__GNUC__ > 2)
41typedef struct {
42 /* no debug version on UP */
43} raw_rwlock_t;
44
45#define __RAW_RW_LOCK_UNLOCKED { }
46#else
47typedef struct { int gcc_is_buggy; } raw_rwlock_t;
48#define __RAW_RW_LOCK_UNLOCKED (raw_rwlock_t) { 0 }
49#endif
50
51#endif /* __LINUX_SPINLOCK_TYPES_UP_H */
diff --git a/include/linux/spinlock_up.h b/include/linux/spinlock_up.h
new file mode 100644
index 000000000000..31accf2f0b13
--- /dev/null
+++ b/include/linux/spinlock_up.h
@@ -0,0 +1,74 @@
1#ifndef __LINUX_SPINLOCK_UP_H
2#define __LINUX_SPINLOCK_UP_H
3
4#ifndef __LINUX_SPINLOCK_H
5# error "please don't include this file directly"
6#endif
7
8/*
9 * include/linux/spinlock_up.h - UP-debug version of spinlocks.
10 *
11 * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
12 * Released under the General Public License (GPL).
13 *
14 * In the debug case, 1 means unlocked, 0 means locked. (the values
15 * are inverted, to catch initialization bugs)
16 *
17 * No atomicity anywhere, we are on UP.
18 */
19
20#ifdef CONFIG_DEBUG_SPINLOCK
21
22#define __raw_spin_is_locked(x) ((x)->slock == 0)
23
24static inline void __raw_spin_lock(raw_spinlock_t *lock)
25{
26 lock->slock = 0;
27}
28
29static inline void
30__raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags)
31{
32 local_irq_save(flags);
33 lock->slock = 0;
34}
35
36static inline int __raw_spin_trylock(raw_spinlock_t *lock)
37{
38 char oldval = lock->slock;
39
40 lock->slock = 0;
41
42 return oldval > 0;
43}
44
45static inline void __raw_spin_unlock(raw_spinlock_t *lock)
46{
47 lock->slock = 1;
48}
49
50/*
51 * Read-write spinlocks. No debug version.
52 */
53#define __raw_read_lock(lock) do { (void)(lock); } while (0)
54#define __raw_write_lock(lock) do { (void)(lock); } while (0)
55#define __raw_read_trylock(lock) ({ (void)(lock); 1; })
56#define __raw_write_trylock(lock) ({ (void)(lock); 1; })
57#define __raw_read_unlock(lock) do { (void)(lock); } while (0)
58#define __raw_write_unlock(lock) do { (void)(lock); } while (0)
59
60#else /* DEBUG_SPINLOCK */
61#define __raw_spin_is_locked(lock) ((void)(lock), 0)
62/* for sched.c and kernel_lock.c: */
63# define __raw_spin_lock(lock) do { (void)(lock); } while (0)
64# define __raw_spin_unlock(lock) do { (void)(lock); } while (0)
65# define __raw_spin_trylock(lock) ({ (void)(lock); 1; })
66#endif /* DEBUG_SPINLOCK */
67
68#define __raw_read_can_lock(lock) (((void)(lock), 1))
69#define __raw_write_can_lock(lock) (((void)(lock), 1))
70
71#define __raw_spin_unlock_wait(lock) \
72 do { cpu_relax(); } while (__raw_spin_is_locked(lock))
73
74#endif /* __LINUX_SPINLOCK_UP_H */
diff --git a/include/linux/time.h b/include/linux/time.h
index c10d4c21c183..8e83f4e778bb 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -28,17 +28,10 @@ struct timezone {
28#ifdef __KERNEL__ 28#ifdef __KERNEL__
29 29
30/* Parameters used to convert the timespec values */ 30/* Parameters used to convert the timespec values */
31#ifndef USEC_PER_SEC 31#define MSEC_PER_SEC (1000L)
32#define USEC_PER_SEC (1000000L) 32#define USEC_PER_SEC (1000000L)
33#endif
34
35#ifndef NSEC_PER_SEC
36#define NSEC_PER_SEC (1000000000L) 33#define NSEC_PER_SEC (1000000000L)
37#endif
38
39#ifndef NSEC_PER_USEC
40#define NSEC_PER_USEC (1000L) 34#define NSEC_PER_USEC (1000L)
41#endif
42 35
43static __inline__ int timespec_equal(struct timespec *a, struct timespec *b) 36static __inline__ int timespec_equal(struct timespec *a, struct timespec *b)
44{ 37{
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
index 542dbaee6512..343d883d69c5 100644
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -109,8 +109,6 @@ int pdflush_operation(void (*fn)(unsigned long), unsigned long arg0);
109int do_writepages(struct address_space *mapping, struct writeback_control *wbc); 109int do_writepages(struct address_space *mapping, struct writeback_control *wbc);
110int sync_page_range(struct inode *inode, struct address_space *mapping, 110int sync_page_range(struct inode *inode, struct address_space *mapping,
111 loff_t pos, size_t count); 111 loff_t pos, size_t count);
112int sync_page_range_nolock(struct inode *inode, struct address_space
113 *mapping, loff_t pos, size_t count);
114 112
115/* pdflush.c */ 113/* pdflush.c */
116extern int nr_pdflush_threads; /* Global so it can be exported to sysctl 114extern int nr_pdflush_threads; /* Global so it can be exported to sysctl
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index 0acf245f441d..3a926011507b 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -69,7 +69,7 @@ struct mqueue_inode_info {
69 69
70 struct sigevent notify; 70 struct sigevent notify;
71 pid_t notify_owner; 71 pid_t notify_owner;
72 struct user_struct *user; /* user who created, for accouting */ 72 struct user_struct *user; /* user who created, for accounting */
73 struct sock *notify_sock; 73 struct sock *notify_sock;
74 struct sk_buff *notify_cookie; 74 struct sk_buff *notify_cookie;
75 75
diff --git a/kernel/Makefile b/kernel/Makefile
index 8d57a2f1226b..ff4dc02ce170 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -12,6 +12,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
12obj-$(CONFIG_FUTEX) += futex.o 12obj-$(CONFIG_FUTEX) += futex.o
13obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o 13obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o
14obj-$(CONFIG_SMP) += cpu.o spinlock.o 14obj-$(CONFIG_SMP) += cpu.o spinlock.o
15obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o
15obj-$(CONFIG_UID16) += uid16.o 16obj-$(CONFIG_UID16) += uid16.o
16obj-$(CONFIG_MODULES) += module.o 17obj-$(CONFIG_MODULES) += module.o
17obj-$(CONFIG_KALLSYMS) += kallsyms.o 18obj-$(CONFIG_KALLSYMS) += kallsyms.o
diff --git a/kernel/acct.c b/kernel/acct.c
index f70e6027cca9..b756f527497e 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -165,7 +165,7 @@ out:
165} 165}
166 166
167/* 167/*
168 * Close the old accouting file (if currently open) and then replace 168 * Close the old accounting file (if currently open) and then replace
169 * it with file (if non-NULL). 169 * it with file (if non-NULL).
170 * 170 *
171 * NOTE: acct_globals.lock MUST be held on entry and exit. 171 * NOTE: acct_globals.lock MUST be held on entry and exit.
@@ -199,11 +199,16 @@ static void acct_file_reopen(struct file *file)
199 } 199 }
200} 200}
201 201
202/* 202/**
203 * sys_acct() is the only system call needed to implement process 203 * sys_acct - enable/disable process accounting
204 * accounting. It takes the name of the file where accounting records 204 * @name: file name for accounting records or NULL to shutdown accounting
205 * should be written. If the filename is NULL, accounting will be 205 *
206 * shutdown. 206 * Returns 0 for success or negative errno values for failure.
207 *
208 * sys_acct() is the only system call needed to implement process
209 * accounting. It takes the name of the file where accounting records
210 * should be written. If the filename is NULL, accounting will be
211 * shutdown.
207 */ 212 */
208asmlinkage long sys_acct(const char __user *name) 213asmlinkage long sys_acct(const char __user *name)
209{ 214{
@@ -250,9 +255,12 @@ asmlinkage long sys_acct(const char __user *name)
250 return (0); 255 return (0);
251} 256}
252 257
253/* 258/**
254 * If the accouting is turned on for a file in the filesystem pointed 259 * acct_auto_close - turn off a filesystem's accounting if it is on
255 * to by sb, turn accouting off. 260 * @sb: super block for the filesystem
261 *
262 * If the accounting is turned on for a file in the filesystem pointed
263 * to by sb, turn accounting off.
256 */ 264 */
257void acct_auto_close(struct super_block *sb) 265void acct_auto_close(struct super_block *sb)
258{ 266{
@@ -503,8 +511,11 @@ static void do_acct_process(long exitcode, struct file *file)
503 set_fs(fs); 511 set_fs(fs);
504} 512}
505 513
506/* 514/**
507 * acct_process - now just a wrapper around do_acct_process 515 * acct_process - now just a wrapper around do_acct_process
516 * @exitcode: task exit code
517 *
518 * handles process accounting for an exiting task
508 */ 519 */
509void acct_process(long exitcode) 520void acct_process(long exitcode)
510{ 521{
@@ -530,9 +541,9 @@ void acct_process(long exitcode)
530} 541}
531 542
532 543
533/* 544/**
534 * acct_update_integrals 545 * acct_update_integrals - update mm integral fields in task_struct
535 * - update mm integral fields in task_struct 546 * @tsk: task_struct for accounting
536 */ 547 */
537void acct_update_integrals(struct task_struct *tsk) 548void acct_update_integrals(struct task_struct *tsk)
538{ 549{
@@ -547,9 +558,9 @@ void acct_update_integrals(struct task_struct *tsk)
547 } 558 }
548} 559}
549 560
550/* 561/**
551 * acct_clear_integrals 562 * acct_clear_integrals - clear the mm integral fields in task_struct
552 * - clear the mm integral fields in task_struct 563 * @tsk: task_struct whose accounting fields are cleared
553 */ 564 */
554void acct_clear_integrals(struct task_struct *tsk) 565void acct_clear_integrals(struct task_struct *tsk)
555{ 566{
diff --git a/kernel/compat.c b/kernel/compat.c
index ddfcaaa86623..102296e21ea8 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -48,8 +48,7 @@ static long compat_nanosleep_restart(struct restart_block *restart)
48 if (!time_after(expire, now)) 48 if (!time_after(expire, now))
49 return 0; 49 return 0;
50 50
51 current->state = TASK_INTERRUPTIBLE; 51 expire = schedule_timeout_interruptible(expire - now);
52 expire = schedule_timeout(expire - now);
53 if (expire == 0) 52 if (expire == 0)
54 return 0; 53 return 0;
55 54
@@ -82,8 +81,7 @@ asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
82 return -EINVAL; 81 return -EINVAL;
83 82
84 expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec); 83 expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
85 current->state = TASK_INTERRUPTIBLE; 84 expire = schedule_timeout_interruptible(expire);
86 expire = schedule_timeout(expire);
87 if (expire == 0) 85 if (expire == 0)
88 return 0; 86 return 0;
89 87
@@ -795,8 +793,7 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
795 recalc_sigpending(); 793 recalc_sigpending();
796 spin_unlock_irq(&current->sighand->siglock); 794 spin_unlock_irq(&current->sighand->siglock);
797 795
798 current->state = TASK_INTERRUPTIBLE; 796 timeout = schedule_timeout_interruptible(timeout);
799 timeout = schedule_timeout(timeout);
800 797
801 spin_lock_irq(&current->sighand->siglock); 798 spin_lock_irq(&current->sighand->siglock);
802 sig = dequeue_signal(current, &s, &info); 799 sig = dequeue_signal(current, &s, &info);
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 712d02029971..407b5f0a8c8e 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -182,6 +182,37 @@ static struct super_block *cpuset_sb = NULL;
182static DECLARE_MUTEX(cpuset_sem); 182static DECLARE_MUTEX(cpuset_sem);
183 183
184/* 184/*
185 * The global cpuset semaphore cpuset_sem can be needed by the
186 * memory allocator to update a tasks mems_allowed (see the calls
187 * to cpuset_update_current_mems_allowed()) or to walk up the
188 * cpuset hierarchy to find a mem_exclusive cpuset see the calls
189 * to cpuset_excl_nodes_overlap()).
190 *
191 * But if the memory allocation is being done by cpuset.c code, it
192 * usually already holds cpuset_sem. Double tripping on a kernel
193 * semaphore deadlocks the current task, and any other task that
194 * subsequently tries to obtain the lock.
195 *
196 * Run all up's and down's on cpuset_sem through the following
197 * wrappers, which will detect this nested locking, and avoid
198 * deadlocking.
199 */
200
201static inline void cpuset_down(struct semaphore *psem)
202{
203 if (current->cpuset_sem_nest_depth == 0)
204 down(psem);
205 current->cpuset_sem_nest_depth++;
206}
207
208static inline void cpuset_up(struct semaphore *psem)
209{
210 current->cpuset_sem_nest_depth--;
211 if (current->cpuset_sem_nest_depth == 0)
212 up(psem);
213}
214
215/*
185 * A couple of forward declarations required, due to cyclic reference loop: 216 * A couple of forward declarations required, due to cyclic reference loop:
186 * cpuset_mkdir -> cpuset_create -> cpuset_populate_dir -> cpuset_add_file 217 * cpuset_mkdir -> cpuset_create -> cpuset_populate_dir -> cpuset_add_file
187 * -> cpuset_create_file -> cpuset_dir_inode_operations -> cpuset_mkdir. 218 * -> cpuset_create_file -> cpuset_dir_inode_operations -> cpuset_mkdir.
@@ -522,19 +553,10 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask)
522 * Refresh current tasks mems_allowed and mems_generation from 553 * Refresh current tasks mems_allowed and mems_generation from
523 * current tasks cpuset. Call with cpuset_sem held. 554 * current tasks cpuset. Call with cpuset_sem held.
524 * 555 *
525 * Be sure to call refresh_mems() on any cpuset operation which 556 * This routine is needed to update the per-task mems_allowed
526 * (1) holds cpuset_sem, and (2) might possibly alloc memory. 557 * data, within the tasks context, when it is trying to allocate
527 * Call after obtaining cpuset_sem lock, before any possible 558 * memory (in various mm/mempolicy.c routines) and notices
528 * allocation. Otherwise one risks trying to allocate memory 559 * that some other task has been modifying its cpuset.
529 * while the task cpuset_mems_generation is not the same as
530 * the mems_generation in its cpuset, which would deadlock on
531 * cpuset_sem in cpuset_update_current_mems_allowed().
532 *
533 * Since we hold cpuset_sem, once refresh_mems() is called, the
534 * test (current->cpuset_mems_generation != cs->mems_generation)
535 * in cpuset_update_current_mems_allowed() will remain false,
536 * until we drop cpuset_sem. Anyone else who would change our
537 * cpusets mems_generation needs to lock cpuset_sem first.
538 */ 560 */
539 561
540static void refresh_mems(void) 562static void refresh_mems(void)
@@ -840,7 +862,7 @@ static ssize_t cpuset_common_file_write(struct file *file, const char __user *us
840 } 862 }
841 buffer[nbytes] = 0; /* nul-terminate */ 863 buffer[nbytes] = 0; /* nul-terminate */
842 864
843 down(&cpuset_sem); 865 cpuset_down(&cpuset_sem);
844 866
845 if (is_removed(cs)) { 867 if (is_removed(cs)) {
846 retval = -ENODEV; 868 retval = -ENODEV;
@@ -874,7 +896,7 @@ static ssize_t cpuset_common_file_write(struct file *file, const char __user *us
874 if (retval == 0) 896 if (retval == 0)
875 retval = nbytes; 897 retval = nbytes;
876out2: 898out2:
877 up(&cpuset_sem); 899 cpuset_up(&cpuset_sem);
878 cpuset_release_agent(pathbuf); 900 cpuset_release_agent(pathbuf);
879out1: 901out1:
880 kfree(buffer); 902 kfree(buffer);
@@ -914,9 +936,9 @@ static int cpuset_sprintf_cpulist(char *page, struct cpuset *cs)
914{ 936{
915 cpumask_t mask; 937 cpumask_t mask;
916 938
917 down(&cpuset_sem); 939 cpuset_down(&cpuset_sem);
918 mask = cs->cpus_allowed; 940 mask = cs->cpus_allowed;
919 up(&cpuset_sem); 941 cpuset_up(&cpuset_sem);
920 942
921 return cpulist_scnprintf(page, PAGE_SIZE, mask); 943 return cpulist_scnprintf(page, PAGE_SIZE, mask);
922} 944}
@@ -925,9 +947,9 @@ static int cpuset_sprintf_memlist(char *page, struct cpuset *cs)
925{ 947{
926 nodemask_t mask; 948 nodemask_t mask;
927 949
928 down(&cpuset_sem); 950 cpuset_down(&cpuset_sem);
929 mask = cs->mems_allowed; 951 mask = cs->mems_allowed;
930 up(&cpuset_sem); 952 cpuset_up(&cpuset_sem);
931 953
932 return nodelist_scnprintf(page, PAGE_SIZE, mask); 954 return nodelist_scnprintf(page, PAGE_SIZE, mask);
933} 955}
@@ -1334,8 +1356,7 @@ static long cpuset_create(struct cpuset *parent, const char *name, int mode)
1334 if (!cs) 1356 if (!cs)
1335 return -ENOMEM; 1357 return -ENOMEM;
1336 1358
1337 down(&cpuset_sem); 1359 cpuset_down(&cpuset_sem);
1338 refresh_mems();
1339 cs->flags = 0; 1360 cs->flags = 0;
1340 if (notify_on_release(parent)) 1361 if (notify_on_release(parent))
1341 set_bit(CS_NOTIFY_ON_RELEASE, &cs->flags); 1362 set_bit(CS_NOTIFY_ON_RELEASE, &cs->flags);
@@ -1360,14 +1381,14 @@ static long cpuset_create(struct cpuset *parent, const char *name, int mode)
1360 * will down() this new directory's i_sem and if we race with 1381 * will down() this new directory's i_sem and if we race with
1361 * another mkdir, we might deadlock. 1382 * another mkdir, we might deadlock.
1362 */ 1383 */
1363 up(&cpuset_sem); 1384 cpuset_up(&cpuset_sem);
1364 1385
1365 err = cpuset_populate_dir(cs->dentry); 1386 err = cpuset_populate_dir(cs->dentry);
1366 /* If err < 0, we have a half-filled directory - oh well ;) */ 1387 /* If err < 0, we have a half-filled directory - oh well ;) */
1367 return 0; 1388 return 0;
1368err: 1389err:
1369 list_del(&cs->sibling); 1390 list_del(&cs->sibling);
1370 up(&cpuset_sem); 1391 cpuset_up(&cpuset_sem);
1371 kfree(cs); 1392 kfree(cs);
1372 return err; 1393 return err;
1373} 1394}
@@ -1389,14 +1410,13 @@ static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry)
1389 1410
1390 /* the vfs holds both inode->i_sem already */ 1411 /* the vfs holds both inode->i_sem already */
1391 1412
1392 down(&cpuset_sem); 1413 cpuset_down(&cpuset_sem);
1393 refresh_mems();
1394 if (atomic_read(&cs->count) > 0) { 1414 if (atomic_read(&cs->count) > 0) {
1395 up(&cpuset_sem); 1415 cpuset_up(&cpuset_sem);
1396 return -EBUSY; 1416 return -EBUSY;
1397 } 1417 }
1398 if (!list_empty(&cs->children)) { 1418 if (!list_empty(&cs->children)) {
1399 up(&cpuset_sem); 1419 cpuset_up(&cpuset_sem);
1400 return -EBUSY; 1420 return -EBUSY;
1401 } 1421 }
1402 parent = cs->parent; 1422 parent = cs->parent;
@@ -1412,7 +1432,7 @@ static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry)
1412 spin_unlock(&d->d_lock); 1432 spin_unlock(&d->d_lock);
1413 cpuset_d_remove_dir(d); 1433 cpuset_d_remove_dir(d);
1414 dput(d); 1434 dput(d);
1415 up(&cpuset_sem); 1435 cpuset_up(&cpuset_sem);
1416 cpuset_release_agent(pathbuf); 1436 cpuset_release_agent(pathbuf);
1417 return 0; 1437 return 0;
1418} 1438}
@@ -1515,10 +1535,10 @@ void cpuset_exit(struct task_struct *tsk)
1515 if (notify_on_release(cs)) { 1535 if (notify_on_release(cs)) {
1516 char *pathbuf = NULL; 1536 char *pathbuf = NULL;
1517 1537
1518 down(&cpuset_sem); 1538 cpuset_down(&cpuset_sem);
1519 if (atomic_dec_and_test(&cs->count)) 1539 if (atomic_dec_and_test(&cs->count))
1520 check_for_release(cs, &pathbuf); 1540 check_for_release(cs, &pathbuf);
1521 up(&cpuset_sem); 1541 cpuset_up(&cpuset_sem);
1522 cpuset_release_agent(pathbuf); 1542 cpuset_release_agent(pathbuf);
1523 } else { 1543 } else {
1524 atomic_dec(&cs->count); 1544 atomic_dec(&cs->count);
@@ -1539,11 +1559,11 @@ cpumask_t cpuset_cpus_allowed(const struct task_struct *tsk)
1539{ 1559{
1540 cpumask_t mask; 1560 cpumask_t mask;
1541 1561
1542 down(&cpuset_sem); 1562 cpuset_down(&cpuset_sem);
1543 task_lock((struct task_struct *)tsk); 1563 task_lock((struct task_struct *)tsk);
1544 guarantee_online_cpus(tsk->cpuset, &mask); 1564 guarantee_online_cpus(tsk->cpuset, &mask);
1545 task_unlock((struct task_struct *)tsk); 1565 task_unlock((struct task_struct *)tsk);
1546 up(&cpuset_sem); 1566 cpuset_up(&cpuset_sem);
1547 1567
1548 return mask; 1568 return mask;
1549} 1569}
@@ -1568,9 +1588,9 @@ void cpuset_update_current_mems_allowed(void)
1568 if (!cs) 1588 if (!cs)
1569 return; /* task is exiting */ 1589 return; /* task is exiting */
1570 if (current->cpuset_mems_generation != cs->mems_generation) { 1590 if (current->cpuset_mems_generation != cs->mems_generation) {
1571 down(&cpuset_sem); 1591 cpuset_down(&cpuset_sem);
1572 refresh_mems(); 1592 refresh_mems();
1573 up(&cpuset_sem); 1593 cpuset_up(&cpuset_sem);
1574 } 1594 }
1575} 1595}
1576 1596
@@ -1669,14 +1689,14 @@ int cpuset_zone_allowed(struct zone *z, unsigned int __nocast gfp_mask)
1669 return 0; 1689 return 0;
1670 1690
1671 /* Not hardwall and node outside mems_allowed: scan up cpusets */ 1691 /* Not hardwall and node outside mems_allowed: scan up cpusets */
1672 down(&cpuset_sem); 1692 cpuset_down(&cpuset_sem);
1673 cs = current->cpuset; 1693 cs = current->cpuset;
1674 if (!cs) 1694 if (!cs)
1675 goto done; /* current task exiting */ 1695 goto done; /* current task exiting */
1676 cs = nearest_exclusive_ancestor(cs); 1696 cs = nearest_exclusive_ancestor(cs);
1677 allowed = node_isset(node, cs->mems_allowed); 1697 allowed = node_isset(node, cs->mems_allowed);
1678done: 1698done:
1679 up(&cpuset_sem); 1699 cpuset_up(&cpuset_sem);
1680 return allowed; 1700 return allowed;
1681} 1701}
1682 1702
@@ -1697,7 +1717,7 @@ int cpuset_excl_nodes_overlap(const struct task_struct *p)
1697 const struct cpuset *cs1, *cs2; /* my and p's cpuset ancestors */ 1717 const struct cpuset *cs1, *cs2; /* my and p's cpuset ancestors */
1698 int overlap = 0; /* do cpusets overlap? */ 1718 int overlap = 0; /* do cpusets overlap? */
1699 1719
1700 down(&cpuset_sem); 1720 cpuset_down(&cpuset_sem);
1701 cs1 = current->cpuset; 1721 cs1 = current->cpuset;
1702 if (!cs1) 1722 if (!cs1)
1703 goto done; /* current task exiting */ 1723 goto done; /* current task exiting */
@@ -1708,7 +1728,7 @@ int cpuset_excl_nodes_overlap(const struct task_struct *p)
1708 cs2 = nearest_exclusive_ancestor(cs2); 1728 cs2 = nearest_exclusive_ancestor(cs2);
1709 overlap = nodes_intersects(cs1->mems_allowed, cs2->mems_allowed); 1729 overlap = nodes_intersects(cs1->mems_allowed, cs2->mems_allowed);
1710done: 1730done:
1711 up(&cpuset_sem); 1731 cpuset_up(&cpuset_sem);
1712 1732
1713 return overlap; 1733 return overlap;
1714} 1734}
@@ -1731,7 +1751,7 @@ static int proc_cpuset_show(struct seq_file *m, void *v)
1731 return -ENOMEM; 1751 return -ENOMEM;
1732 1752
1733 tsk = m->private; 1753 tsk = m->private;
1734 down(&cpuset_sem); 1754 cpuset_down(&cpuset_sem);
1735 task_lock(tsk); 1755 task_lock(tsk);
1736 cs = tsk->cpuset; 1756 cs = tsk->cpuset;
1737 task_unlock(tsk); 1757 task_unlock(tsk);
@@ -1746,7 +1766,7 @@ static int proc_cpuset_show(struct seq_file *m, void *v)
1746 seq_puts(m, buf); 1766 seq_puts(m, buf);
1747 seq_putc(m, '\n'); 1767 seq_putc(m, '\n');
1748out: 1768out:
1749 up(&cpuset_sem); 1769 cpuset_up(&cpuset_sem);
1750 kfree(buf); 1770 kfree(buf);
1751 return retval; 1771 return retval;
1752} 1772}
diff --git a/kernel/sched.c b/kernel/sched.c
index 2632b812cf24..dbd4490afec1 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -875,7 +875,7 @@ static int migrate_task(task_t *p, int dest_cpu, migration_req_t *req)
875 * smp_call_function() if an IPI is sent by the same process we are 875 * smp_call_function() if an IPI is sent by the same process we are
876 * waiting to become inactive. 876 * waiting to become inactive.
877 */ 877 */
878void wait_task_inactive(task_t * p) 878void wait_task_inactive(task_t *p)
879{ 879{
880 unsigned long flags; 880 unsigned long flags;
881 runqueue_t *rq; 881 runqueue_t *rq;
@@ -966,8 +966,11 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu)
966 int local_group; 966 int local_group;
967 int i; 967 int i;
968 968
969 /* Skip over this group if it has no CPUs allowed */
970 if (!cpus_intersects(group->cpumask, p->cpus_allowed))
971 goto nextgroup;
972
969 local_group = cpu_isset(this_cpu, group->cpumask); 973 local_group = cpu_isset(this_cpu, group->cpumask);
970 /* XXX: put a cpus allowed check */
971 974
972 /* Tally up the load of all CPUs in the group */ 975 /* Tally up the load of all CPUs in the group */
973 avg_load = 0; 976 avg_load = 0;
@@ -992,6 +995,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu)
992 min_load = avg_load; 995 min_load = avg_load;
993 idlest = group; 996 idlest = group;
994 } 997 }
998nextgroup:
995 group = group->next; 999 group = group->next;
996 } while (group != sd->groups); 1000 } while (group != sd->groups);
997 1001
@@ -1003,13 +1007,18 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu)
1003/* 1007/*
1004 * find_idlest_queue - find the idlest runqueue among the cpus in group. 1008 * find_idlest_queue - find the idlest runqueue among the cpus in group.
1005 */ 1009 */
1006static int find_idlest_cpu(struct sched_group *group, int this_cpu) 1010static int
1011find_idlest_cpu(struct sched_group *group, struct task_struct *p, int this_cpu)
1007{ 1012{
1013 cpumask_t tmp;
1008 unsigned long load, min_load = ULONG_MAX; 1014 unsigned long load, min_load = ULONG_MAX;
1009 int idlest = -1; 1015 int idlest = -1;
1010 int i; 1016 int i;
1011 1017
1012 for_each_cpu_mask(i, group->cpumask) { 1018 /* Traverse only the allowed CPUs */
1019 cpus_and(tmp, group->cpumask, p->cpus_allowed);
1020
1021 for_each_cpu_mask(i, tmp) {
1013 load = source_load(i, 0); 1022 load = source_load(i, 0);
1014 1023
1015 if (load < min_load || (load == min_load && i == this_cpu)) { 1024 if (load < min_load || (load == min_load && i == this_cpu)) {
@@ -1052,7 +1061,7 @@ static int sched_balance_self(int cpu, int flag)
1052 if (!group) 1061 if (!group)
1053 goto nextlevel; 1062 goto nextlevel;
1054 1063
1055 new_cpu = find_idlest_cpu(group, cpu); 1064 new_cpu = find_idlest_cpu(group, t, cpu);
1056 if (new_cpu == -1 || new_cpu == cpu) 1065 if (new_cpu == -1 || new_cpu == cpu)
1057 goto nextlevel; 1066 goto nextlevel;
1058 1067
@@ -1127,7 +1136,7 @@ static inline int wake_idle(int cpu, task_t *p)
1127 * 1136 *
1128 * returns failure only if the task is already active. 1137 * returns failure only if the task is already active.
1129 */ 1138 */
1130static int try_to_wake_up(task_t * p, unsigned int state, int sync) 1139static int try_to_wake_up(task_t *p, unsigned int state, int sync)
1131{ 1140{
1132 int cpu, this_cpu, success = 0; 1141 int cpu, this_cpu, success = 0;
1133 unsigned long flags; 1142 unsigned long flags;
@@ -1252,6 +1261,16 @@ out_activate:
1252 } 1261 }
1253 1262
1254 /* 1263 /*
1264 * Tasks that have marked their sleep as noninteractive get
1265 * woken up without updating their sleep average. (i.e. their
1266 * sleep is handled in a priority-neutral manner, no priority
1267 * boost and no penalty.)
1268 */
1269 if (old_state & TASK_NONINTERACTIVE)
1270 __activate_task(p, rq);
1271 else
1272 activate_task(p, rq, cpu == this_cpu);
1273 /*
1255 * Sync wakeups (i.e. those types of wakeups where the waker 1274 * Sync wakeups (i.e. those types of wakeups where the waker
1256 * has indicated that it will leave the CPU in short order) 1275 * has indicated that it will leave the CPU in short order)
1257 * don't trigger a preemption, if the woken up task will run on 1276 * don't trigger a preemption, if the woken up task will run on
@@ -1259,7 +1278,6 @@ out_activate:
1259 * the waker guarantees that the freshly woken up task is going 1278 * the waker guarantees that the freshly woken up task is going
1260 * to be considered on this CPU.) 1279 * to be considered on this CPU.)
1261 */ 1280 */
1262 activate_task(p, rq, cpu == this_cpu);
1263 if (!sync || cpu != this_cpu) { 1281 if (!sync || cpu != this_cpu) {
1264 if (TASK_PREEMPTS_CURR(p, rq)) 1282 if (TASK_PREEMPTS_CURR(p, rq))
1265 resched_task(rq->curr); 1283 resched_task(rq->curr);
@@ -1274,7 +1292,7 @@ out:
1274 return success; 1292 return success;
1275} 1293}
1276 1294
1277int fastcall wake_up_process(task_t * p) 1295int fastcall wake_up_process(task_t *p)
1278{ 1296{
1279 return try_to_wake_up(p, TASK_STOPPED | TASK_TRACED | 1297 return try_to_wake_up(p, TASK_STOPPED | TASK_TRACED |
1280 TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0); 1298 TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0);
@@ -1353,7 +1371,7 @@ void fastcall sched_fork(task_t *p, int clone_flags)
1353 * that must be done for every newly created context, then puts the task 1371 * that must be done for every newly created context, then puts the task
1354 * on the runqueue and wakes it. 1372 * on the runqueue and wakes it.
1355 */ 1373 */
1356void fastcall wake_up_new_task(task_t * p, unsigned long clone_flags) 1374void fastcall wake_up_new_task(task_t *p, unsigned long clone_flags)
1357{ 1375{
1358 unsigned long flags; 1376 unsigned long flags;
1359 int this_cpu, cpu; 1377 int this_cpu, cpu;
@@ -1436,7 +1454,7 @@ void fastcall wake_up_new_task(task_t * p, unsigned long clone_flags)
1436 * artificially, because any timeslice recovered here 1454 * artificially, because any timeslice recovered here
1437 * was given away by the parent in the first place.) 1455 * was given away by the parent in the first place.)
1438 */ 1456 */
1439void fastcall sched_exit(task_t * p) 1457void fastcall sched_exit(task_t *p)
1440{ 1458{
1441 unsigned long flags; 1459 unsigned long flags;
1442 runqueue_t *rq; 1460 runqueue_t *rq;
@@ -1511,6 +1529,10 @@ static inline void finish_task_switch(runqueue_t *rq, task_t *prev)
1511 * Manfred Spraul <manfred@colorfullife.com> 1529 * Manfred Spraul <manfred@colorfullife.com>
1512 */ 1530 */
1513 prev_task_flags = prev->flags; 1531 prev_task_flags = prev->flags;
1532#ifdef CONFIG_DEBUG_SPINLOCK
1533 /* this is a valid case when another task releases the spinlock */
1534 rq->lock.owner = current;
1535#endif
1514 finish_arch_switch(prev); 1536 finish_arch_switch(prev);
1515 finish_lock_switch(rq, prev); 1537 finish_lock_switch(rq, prev);
1516 if (mm) 1538 if (mm)
@@ -1753,7 +1775,8 @@ void pull_task(runqueue_t *src_rq, prio_array_t *src_array, task_t *p,
1753 */ 1775 */
1754static inline 1776static inline
1755int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu, 1777int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu,
1756 struct sched_domain *sd, enum idle_type idle, int *all_pinned) 1778 struct sched_domain *sd, enum idle_type idle,
1779 int *all_pinned)
1757{ 1780{
1758 /* 1781 /*
1759 * We do not migrate tasks that are: 1782 * We do not migrate tasks that are:
@@ -1883,10 +1906,11 @@ out:
1883 */ 1906 */
1884static struct sched_group * 1907static struct sched_group *
1885find_busiest_group(struct sched_domain *sd, int this_cpu, 1908find_busiest_group(struct sched_domain *sd, int this_cpu,
1886 unsigned long *imbalance, enum idle_type idle) 1909 unsigned long *imbalance, enum idle_type idle, int *sd_idle)
1887{ 1910{
1888 struct sched_group *busiest = NULL, *this = NULL, *group = sd->groups; 1911 struct sched_group *busiest = NULL, *this = NULL, *group = sd->groups;
1889 unsigned long max_load, avg_load, total_load, this_load, total_pwr; 1912 unsigned long max_load, avg_load, total_load, this_load, total_pwr;
1913 unsigned long max_pull;
1890 int load_idx; 1914 int load_idx;
1891 1915
1892 max_load = this_load = total_load = total_pwr = 0; 1916 max_load = this_load = total_load = total_pwr = 0;
@@ -1908,6 +1932,9 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,
1908 avg_load = 0; 1932 avg_load = 0;
1909 1933
1910 for_each_cpu_mask(i, group->cpumask) { 1934 for_each_cpu_mask(i, group->cpumask) {
1935 if (*sd_idle && !idle_cpu(i))
1936 *sd_idle = 0;
1937
1911 /* Bias balancing toward cpus of our domain */ 1938 /* Bias balancing toward cpus of our domain */
1912 if (local_group) 1939 if (local_group)
1913 load = target_load(i, load_idx); 1940 load = target_load(i, load_idx);
@@ -1933,7 +1960,7 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,
1933 group = group->next; 1960 group = group->next;
1934 } while (group != sd->groups); 1961 } while (group != sd->groups);
1935 1962
1936 if (!busiest || this_load >= max_load) 1963 if (!busiest || this_load >= max_load || max_load <= SCHED_LOAD_SCALE)
1937 goto out_balanced; 1964 goto out_balanced;
1938 1965
1939 avg_load = (SCHED_LOAD_SCALE * total_load) / total_pwr; 1966 avg_load = (SCHED_LOAD_SCALE * total_load) / total_pwr;
@@ -1953,8 +1980,12 @@ find_busiest_group(struct sched_domain *sd, int this_cpu,
1953 * by pulling tasks to us. Be careful of negative numbers as they'll 1980 * by pulling tasks to us. Be careful of negative numbers as they'll
1954 * appear as very large values with unsigned longs. 1981 * appear as very large values with unsigned longs.
1955 */ 1982 */
1983
1984 /* Don't want to pull so many tasks that a group would go idle */
1985 max_pull = min(max_load - avg_load, max_load - SCHED_LOAD_SCALE);
1986
1956 /* How much load to actually move to equalise the imbalance */ 1987 /* How much load to actually move to equalise the imbalance */
1957 *imbalance = min((max_load - avg_load) * busiest->cpu_power, 1988 *imbalance = min(max_pull * busiest->cpu_power,
1958 (avg_load - this_load) * this->cpu_power) 1989 (avg_load - this_load) * this->cpu_power)
1959 / SCHED_LOAD_SCALE; 1990 / SCHED_LOAD_SCALE;
1960 1991
@@ -2051,11 +2082,14 @@ static int load_balance(int this_cpu, runqueue_t *this_rq,
2051 unsigned long imbalance; 2082 unsigned long imbalance;
2052 int nr_moved, all_pinned = 0; 2083 int nr_moved, all_pinned = 0;
2053 int active_balance = 0; 2084 int active_balance = 0;
2085 int sd_idle = 0;
2086
2087 if (idle != NOT_IDLE && sd->flags & SD_SHARE_CPUPOWER)
2088 sd_idle = 1;
2054 2089
2055 spin_lock(&this_rq->lock);
2056 schedstat_inc(sd, lb_cnt[idle]); 2090 schedstat_inc(sd, lb_cnt[idle]);
2057 2091
2058 group = find_busiest_group(sd, this_cpu, &imbalance, idle); 2092 group = find_busiest_group(sd, this_cpu, &imbalance, idle, &sd_idle);
2059 if (!group) { 2093 if (!group) {
2060 schedstat_inc(sd, lb_nobusyg[idle]); 2094 schedstat_inc(sd, lb_nobusyg[idle]);
2061 goto out_balanced; 2095 goto out_balanced;
@@ -2079,19 +2113,16 @@ static int load_balance(int this_cpu, runqueue_t *this_rq,
2079 * still unbalanced. nr_moved simply stays zero, so it is 2113 * still unbalanced. nr_moved simply stays zero, so it is
2080 * correctly treated as an imbalance. 2114 * correctly treated as an imbalance.
2081 */ 2115 */
2082 double_lock_balance(this_rq, busiest); 2116 double_rq_lock(this_rq, busiest);
2083 nr_moved = move_tasks(this_rq, this_cpu, busiest, 2117 nr_moved = move_tasks(this_rq, this_cpu, busiest,
2084 imbalance, sd, idle, 2118 imbalance, sd, idle, &all_pinned);
2085 &all_pinned); 2119 double_rq_unlock(this_rq, busiest);
2086 spin_unlock(&busiest->lock);
2087 2120
2088 /* All tasks on this runqueue were pinned by CPU affinity */ 2121 /* All tasks on this runqueue were pinned by CPU affinity */
2089 if (unlikely(all_pinned)) 2122 if (unlikely(all_pinned))
2090 goto out_balanced; 2123 goto out_balanced;
2091 } 2124 }
2092 2125
2093 spin_unlock(&this_rq->lock);
2094
2095 if (!nr_moved) { 2126 if (!nr_moved) {
2096 schedstat_inc(sd, lb_failed[idle]); 2127 schedstat_inc(sd, lb_failed[idle]);
2097 sd->nr_balance_failed++; 2128 sd->nr_balance_failed++;
@@ -2099,6 +2130,16 @@ static int load_balance(int this_cpu, runqueue_t *this_rq,
2099 if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { 2130 if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) {
2100 2131
2101 spin_lock(&busiest->lock); 2132 spin_lock(&busiest->lock);
2133
2134 /* don't kick the migration_thread, if the curr
2135 * task on busiest cpu can't be moved to this_cpu
2136 */
2137 if (!cpu_isset(this_cpu, busiest->curr->cpus_allowed)) {
2138 spin_unlock(&busiest->lock);
2139 all_pinned = 1;
2140 goto out_one_pinned;
2141 }
2142
2102 if (!busiest->active_balance) { 2143 if (!busiest->active_balance) {
2103 busiest->active_balance = 1; 2144 busiest->active_balance = 1;
2104 busiest->push_cpu = this_cpu; 2145 busiest->push_cpu = this_cpu;
@@ -2131,19 +2172,23 @@ static int load_balance(int this_cpu, runqueue_t *this_rq,
2131 sd->balance_interval *= 2; 2172 sd->balance_interval *= 2;
2132 } 2173 }
2133 2174
2175 if (!nr_moved && !sd_idle && sd->flags & SD_SHARE_CPUPOWER)
2176 return -1;
2134 return nr_moved; 2177 return nr_moved;
2135 2178
2136out_balanced: 2179out_balanced:
2137 spin_unlock(&this_rq->lock);
2138
2139 schedstat_inc(sd, lb_balanced[idle]); 2180 schedstat_inc(sd, lb_balanced[idle]);
2140 2181
2141 sd->nr_balance_failed = 0; 2182 sd->nr_balance_failed = 0;
2183
2184out_one_pinned:
2142 /* tune up the balancing interval */ 2185 /* tune up the balancing interval */
2143 if ((all_pinned && sd->balance_interval < MAX_PINNED_INTERVAL) || 2186 if ((all_pinned && sd->balance_interval < MAX_PINNED_INTERVAL) ||
2144 (sd->balance_interval < sd->max_interval)) 2187 (sd->balance_interval < sd->max_interval))
2145 sd->balance_interval *= 2; 2188 sd->balance_interval *= 2;
2146 2189
2190 if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER)
2191 return -1;
2147 return 0; 2192 return 0;
2148} 2193}
2149 2194
@@ -2161,9 +2206,13 @@ static int load_balance_newidle(int this_cpu, runqueue_t *this_rq,
2161 runqueue_t *busiest = NULL; 2206 runqueue_t *busiest = NULL;
2162 unsigned long imbalance; 2207 unsigned long imbalance;
2163 int nr_moved = 0; 2208 int nr_moved = 0;
2209 int sd_idle = 0;
2210
2211 if (sd->flags & SD_SHARE_CPUPOWER)
2212 sd_idle = 1;
2164 2213
2165 schedstat_inc(sd, lb_cnt[NEWLY_IDLE]); 2214 schedstat_inc(sd, lb_cnt[NEWLY_IDLE]);
2166 group = find_busiest_group(sd, this_cpu, &imbalance, NEWLY_IDLE); 2215 group = find_busiest_group(sd, this_cpu, &imbalance, NEWLY_IDLE, &sd_idle);
2167 if (!group) { 2216 if (!group) {
2168 schedstat_inc(sd, lb_nobusyg[NEWLY_IDLE]); 2217 schedstat_inc(sd, lb_nobusyg[NEWLY_IDLE]);
2169 goto out_balanced; 2218 goto out_balanced;
@@ -2177,22 +2226,30 @@ static int load_balance_newidle(int this_cpu, runqueue_t *this_rq,
2177 2226
2178 BUG_ON(busiest == this_rq); 2227 BUG_ON(busiest == this_rq);
2179 2228
2180 /* Attempt to move tasks */
2181 double_lock_balance(this_rq, busiest);
2182
2183 schedstat_add(sd, lb_imbalance[NEWLY_IDLE], imbalance); 2229 schedstat_add(sd, lb_imbalance[NEWLY_IDLE], imbalance);
2184 nr_moved = move_tasks(this_rq, this_cpu, busiest, 2230
2231 nr_moved = 0;
2232 if (busiest->nr_running > 1) {
2233 /* Attempt to move tasks */
2234 double_lock_balance(this_rq, busiest);
2235 nr_moved = move_tasks(this_rq, this_cpu, busiest,
2185 imbalance, sd, NEWLY_IDLE, NULL); 2236 imbalance, sd, NEWLY_IDLE, NULL);
2186 if (!nr_moved) 2237 spin_unlock(&busiest->lock);
2238 }
2239
2240 if (!nr_moved) {
2187 schedstat_inc(sd, lb_failed[NEWLY_IDLE]); 2241 schedstat_inc(sd, lb_failed[NEWLY_IDLE]);
2188 else 2242 if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER)
2243 return -1;
2244 } else
2189 sd->nr_balance_failed = 0; 2245 sd->nr_balance_failed = 0;
2190 2246
2191 spin_unlock(&busiest->lock);
2192 return nr_moved; 2247 return nr_moved;
2193 2248
2194out_balanced: 2249out_balanced:
2195 schedstat_inc(sd, lb_balanced[NEWLY_IDLE]); 2250 schedstat_inc(sd, lb_balanced[NEWLY_IDLE]);
2251 if (!sd_idle && sd->flags & SD_SHARE_CPUPOWER)
2252 return -1;
2196 sd->nr_balance_failed = 0; 2253 sd->nr_balance_failed = 0;
2197 return 0; 2254 return 0;
2198} 2255}
@@ -2317,7 +2374,11 @@ static void rebalance_tick(int this_cpu, runqueue_t *this_rq,
2317 2374
2318 if (j - sd->last_balance >= interval) { 2375 if (j - sd->last_balance >= interval) {
2319 if (load_balance(this_cpu, this_rq, sd, idle)) { 2376 if (load_balance(this_cpu, this_rq, sd, idle)) {
2320 /* We've pulled tasks over so no longer idle */ 2377 /*
2378 * We've pulled tasks over so either we're no
2379 * longer idle, or one of our SMT siblings is
2380 * not idle.
2381 */
2321 idle = NOT_IDLE; 2382 idle = NOT_IDLE;
2322 } 2383 }
2323 sd->last_balance += interval; 2384 sd->last_balance += interval;
@@ -2576,6 +2637,13 @@ out:
2576} 2637}
2577 2638
2578#ifdef CONFIG_SCHED_SMT 2639#ifdef CONFIG_SCHED_SMT
2640static inline void wakeup_busy_runqueue(runqueue_t *rq)
2641{
2642 /* If an SMT runqueue is sleeping due to priority reasons wake it up */
2643 if (rq->curr == rq->idle && rq->nr_running)
2644 resched_task(rq->idle);
2645}
2646
2579static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq) 2647static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq)
2580{ 2648{
2581 struct sched_domain *tmp, *sd = NULL; 2649 struct sched_domain *tmp, *sd = NULL;
@@ -2609,12 +2677,7 @@ static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq)
2609 for_each_cpu_mask(i, sibling_map) { 2677 for_each_cpu_mask(i, sibling_map) {
2610 runqueue_t *smt_rq = cpu_rq(i); 2678 runqueue_t *smt_rq = cpu_rq(i);
2611 2679
2612 /* 2680 wakeup_busy_runqueue(smt_rq);
2613 * If an SMT sibling task is sleeping due to priority
2614 * reasons wake it up now.
2615 */
2616 if (smt_rq->curr == smt_rq->idle && smt_rq->nr_running)
2617 resched_task(smt_rq->idle);
2618 } 2681 }
2619 2682
2620 for_each_cpu_mask(i, sibling_map) 2683 for_each_cpu_mask(i, sibling_map)
@@ -2625,6 +2688,16 @@ static inline void wake_sleeping_dependent(int this_cpu, runqueue_t *this_rq)
2625 */ 2688 */
2626} 2689}
2627 2690
2691/*
2692 * number of 'lost' timeslices this task wont be able to fully
2693 * utilize, if another task runs on a sibling. This models the
2694 * slowdown effect of other tasks running on siblings:
2695 */
2696static inline unsigned long smt_slice(task_t *p, struct sched_domain *sd)
2697{
2698 return p->time_slice * (100 - sd->per_cpu_gain) / 100;
2699}
2700
2628static inline int dependent_sleeper(int this_cpu, runqueue_t *this_rq) 2701static inline int dependent_sleeper(int this_cpu, runqueue_t *this_rq)
2629{ 2702{
2630 struct sched_domain *tmp, *sd = NULL; 2703 struct sched_domain *tmp, *sd = NULL;
@@ -2668,6 +2741,10 @@ static inline int dependent_sleeper(int this_cpu, runqueue_t *this_rq)
2668 runqueue_t *smt_rq = cpu_rq(i); 2741 runqueue_t *smt_rq = cpu_rq(i);
2669 task_t *smt_curr = smt_rq->curr; 2742 task_t *smt_curr = smt_rq->curr;
2670 2743
2744 /* Kernel threads do not participate in dependent sleeping */
2745 if (!p->mm || !smt_curr->mm || rt_task(p))
2746 goto check_smt_task;
2747
2671 /* 2748 /*
2672 * If a user task with lower static priority than the 2749 * If a user task with lower static priority than the
2673 * running task on the SMT sibling is trying to schedule, 2750 * running task on the SMT sibling is trying to schedule,
@@ -2676,21 +2753,45 @@ static inline int dependent_sleeper(int this_cpu, runqueue_t *this_rq)
2676 * task from using an unfair proportion of the 2753 * task from using an unfair proportion of the
2677 * physical cpu's resources. -ck 2754 * physical cpu's resources. -ck
2678 */ 2755 */
2679 if (((smt_curr->time_slice * (100 - sd->per_cpu_gain) / 100) > 2756 if (rt_task(smt_curr)) {
2680 task_timeslice(p) || rt_task(smt_curr)) && 2757 /*
2681 p->mm && smt_curr->mm && !rt_task(p)) 2758 * With real time tasks we run non-rt tasks only
2682 ret = 1; 2759 * per_cpu_gain% of the time.
2760 */
2761 if ((jiffies % DEF_TIMESLICE) >
2762 (sd->per_cpu_gain * DEF_TIMESLICE / 100))
2763 ret = 1;
2764 } else
2765 if (smt_curr->static_prio < p->static_prio &&
2766 !TASK_PREEMPTS_CURR(p, smt_rq) &&
2767 smt_slice(smt_curr, sd) > task_timeslice(p))
2768 ret = 1;
2769
2770check_smt_task:
2771 if ((!smt_curr->mm && smt_curr != smt_rq->idle) ||
2772 rt_task(smt_curr))
2773 continue;
2774 if (!p->mm) {
2775 wakeup_busy_runqueue(smt_rq);
2776 continue;
2777 }
2683 2778
2684 /* 2779 /*
2685 * Reschedule a lower priority task on the SMT sibling, 2780 * Reschedule a lower priority task on the SMT sibling for
2686 * or wake it up if it has been put to sleep for priority 2781 * it to be put to sleep, or wake it up if it has been put to
2687 * reasons. 2782 * sleep for priority reasons to see if it should run now.
2688 */ 2783 */
2689 if ((((p->time_slice * (100 - sd->per_cpu_gain) / 100) > 2784 if (rt_task(p)) {
2690 task_timeslice(smt_curr) || rt_task(p)) && 2785 if ((jiffies % DEF_TIMESLICE) >
2691 smt_curr->mm && p->mm && !rt_task(smt_curr)) || 2786 (sd->per_cpu_gain * DEF_TIMESLICE / 100))
2692 (smt_curr == smt_rq->idle && smt_rq->nr_running)) 2787 resched_task(smt_curr);
2693 resched_task(smt_curr); 2788 } else {
2789 if (TASK_PREEMPTS_CURR(p, smt_rq) &&
2790 smt_slice(p, sd) > task_timeslice(smt_curr))
2791 resched_task(smt_curr);
2792 else
2793 wakeup_busy_runqueue(smt_rq);
2794 }
2694 } 2795 }
2695out_unlock: 2796out_unlock:
2696 for_each_cpu_mask(i, sibling_map) 2797 for_each_cpu_mask(i, sibling_map)
@@ -3016,7 +3117,8 @@ need_resched:
3016 3117
3017#endif /* CONFIG_PREEMPT */ 3118#endif /* CONFIG_PREEMPT */
3018 3119
3019int default_wake_function(wait_queue_t *curr, unsigned mode, int sync, void *key) 3120int default_wake_function(wait_queue_t *curr, unsigned mode, int sync,
3121 void *key)
3020{ 3122{
3021 task_t *p = curr->private; 3123 task_t *p = curr->private;
3022 return try_to_wake_up(p, mode, sync); 3124 return try_to_wake_up(p, mode, sync);
@@ -3058,7 +3160,7 @@ static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
3058 * @key: is directly passed to the wakeup function 3160 * @key: is directly passed to the wakeup function
3059 */ 3161 */
3060void fastcall __wake_up(wait_queue_head_t *q, unsigned int mode, 3162void fastcall __wake_up(wait_queue_head_t *q, unsigned int mode,
3061 int nr_exclusive, void *key) 3163 int nr_exclusive, void *key)
3062{ 3164{
3063 unsigned long flags; 3165 unsigned long flags;
3064 3166
@@ -3090,7 +3192,8 @@ void fastcall __wake_up_locked(wait_queue_head_t *q, unsigned int mode)
3090 * 3192 *
3091 * On UP it can prevent extra preemption. 3193 * On UP it can prevent extra preemption.
3092 */ 3194 */
3093void fastcall __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) 3195void fastcall
3196__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
3094{ 3197{
3095 unsigned long flags; 3198 unsigned long flags;
3096 int sync = 1; 3199 int sync = 1;
@@ -3281,7 +3384,8 @@ void fastcall __sched interruptible_sleep_on(wait_queue_head_t *q)
3281 3384
3282EXPORT_SYMBOL(interruptible_sleep_on); 3385EXPORT_SYMBOL(interruptible_sleep_on);
3283 3386
3284long fastcall __sched interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout) 3387long fastcall __sched
3388interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout)
3285{ 3389{
3286 SLEEP_ON_VAR 3390 SLEEP_ON_VAR
3287 3391
@@ -3500,7 +3604,8 @@ static void __setscheduler(struct task_struct *p, int policy, int prio)
3500 * @policy: new policy. 3604 * @policy: new policy.
3501 * @param: structure containing the new RT priority. 3605 * @param: structure containing the new RT priority.
3502 */ 3606 */
3503int sched_setscheduler(struct task_struct *p, int policy, struct sched_param *param) 3607int sched_setscheduler(struct task_struct *p, int policy,
3608 struct sched_param *param)
3504{ 3609{
3505 int retval; 3610 int retval;
3506 int oldprio, oldpolicy = -1; 3611 int oldprio, oldpolicy = -1;
@@ -3520,7 +3625,7 @@ recheck:
3520 * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL is 0. 3625 * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL is 0.
3521 */ 3626 */
3522 if (param->sched_priority < 0 || 3627 if (param->sched_priority < 0 ||
3523 (p->mm && param->sched_priority > MAX_USER_RT_PRIO-1) || 3628 (p->mm && param->sched_priority > MAX_USER_RT_PRIO-1) ||
3524 (!p->mm && param->sched_priority > MAX_RT_PRIO-1)) 3629 (!p->mm && param->sched_priority > MAX_RT_PRIO-1))
3525 return -EINVAL; 3630 return -EINVAL;
3526 if ((policy == SCHED_NORMAL) != (param->sched_priority == 0)) 3631 if ((policy == SCHED_NORMAL) != (param->sched_priority == 0))
@@ -3583,7 +3688,8 @@ recheck:
3583} 3688}
3584EXPORT_SYMBOL_GPL(sched_setscheduler); 3689EXPORT_SYMBOL_GPL(sched_setscheduler);
3585 3690
3586static int do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param) 3691static int
3692do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
3587{ 3693{
3588 int retval; 3694 int retval;
3589 struct sched_param lparam; 3695 struct sched_param lparam;
@@ -3850,7 +3956,7 @@ asmlinkage long sys_sched_yield(void)
3850 if (rt_task(current)) 3956 if (rt_task(current))
3851 target = rq->active; 3957 target = rq->active;
3852 3958
3853 if (current->array->nr_active == 1) { 3959 if (array->nr_active == 1) {
3854 schedstat_inc(rq, yld_act_empty); 3960 schedstat_inc(rq, yld_act_empty);
3855 if (!rq->expired->nr_active) 3961 if (!rq->expired->nr_active)
3856 schedstat_inc(rq, yld_both_empty); 3962 schedstat_inc(rq, yld_both_empty);
@@ -3914,7 +4020,7 @@ EXPORT_SYMBOL(cond_resched);
3914 * operations here to prevent schedule() from being called twice (once via 4020 * operations here to prevent schedule() from being called twice (once via
3915 * spin_unlock(), once by hand). 4021 * spin_unlock(), once by hand).
3916 */ 4022 */
3917int cond_resched_lock(spinlock_t * lock) 4023int cond_resched_lock(spinlock_t *lock)
3918{ 4024{
3919 int ret = 0; 4025 int ret = 0;
3920 4026
@@ -4097,7 +4203,7 @@ static inline struct task_struct *younger_sibling(struct task_struct *p)
4097 return list_entry(p->sibling.next,struct task_struct,sibling); 4203 return list_entry(p->sibling.next,struct task_struct,sibling);
4098} 4204}
4099 4205
4100static void show_task(task_t * p) 4206static void show_task(task_t *p)
4101{ 4207{
4102 task_t *relative; 4208 task_t *relative;
4103 unsigned state; 4209 unsigned state;
@@ -4123,7 +4229,7 @@ static void show_task(task_t * p)
4123#endif 4229#endif
4124#ifdef CONFIG_DEBUG_STACK_USAGE 4230#ifdef CONFIG_DEBUG_STACK_USAGE
4125 { 4231 {
4126 unsigned long * n = (unsigned long *) (p->thread_info+1); 4232 unsigned long *n = (unsigned long *) (p->thread_info+1);
4127 while (!*n) 4233 while (!*n)
4128 n++; 4234 n++;
4129 free = (unsigned long) n - (unsigned long)(p->thread_info+1); 4235 free = (unsigned long) n - (unsigned long)(p->thread_info+1);
@@ -4332,7 +4438,7 @@ out:
4332 * thread migration by bumping thread off CPU then 'pushing' onto 4438 * thread migration by bumping thread off CPU then 'pushing' onto
4333 * another runqueue. 4439 * another runqueue.
4334 */ 4440 */
4335static int migration_thread(void * data) 4441static int migration_thread(void *data)
4336{ 4442{
4337 runqueue_t *rq; 4443 runqueue_t *rq;
4338 int cpu = (long)data; 4444 int cpu = (long)data;
diff --git a/kernel/signal.c b/kernel/signal.c
index 4980a073237f..b92c3c9f8b9a 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2221,8 +2221,7 @@ sys_rt_sigtimedwait(const sigset_t __user *uthese,
2221 recalc_sigpending(); 2221 recalc_sigpending();
2222 spin_unlock_irq(&current->sighand->siglock); 2222 spin_unlock_irq(&current->sighand->siglock);
2223 2223
2224 current->state = TASK_INTERRUPTIBLE; 2224 timeout = schedule_timeout_interruptible(timeout);
2225 timeout = schedule_timeout(timeout);
2226 2225
2227 try_to_freeze(); 2226 try_to_freeze();
2228 spin_lock_irq(&current->sighand->siglock); 2227 spin_lock_irq(&current->sighand->siglock);
diff --git a/kernel/spinlock.c b/kernel/spinlock.c
index 0c3f9d8bbe17..0375fcd5921d 100644
--- a/kernel/spinlock.c
+++ b/kernel/spinlock.c
@@ -3,7 +3,10 @@
3 * 3 *
4 * Author: Zwane Mwaikambo <zwane@fsmlabs.com> 4 * Author: Zwane Mwaikambo <zwane@fsmlabs.com>
5 * 5 *
6 * Copyright (2004) Ingo Molnar 6 * Copyright (2004, 2005) Ingo Molnar
7 *
8 * This file contains the spinlock/rwlock implementations for the
9 * SMP and the DEBUG_SPINLOCK cases. (UP-nondebug inlines them)
7 */ 10 */
8 11
9#include <linux/config.h> 12#include <linux/config.h>
@@ -17,12 +20,12 @@
17 * Generic declaration of the raw read_trylock() function, 20 * Generic declaration of the raw read_trylock() function,
18 * architectures are supposed to optimize this: 21 * architectures are supposed to optimize this:
19 */ 22 */
20int __lockfunc generic_raw_read_trylock(rwlock_t *lock) 23int __lockfunc generic__raw_read_trylock(raw_rwlock_t *lock)
21{ 24{
22 _raw_read_lock(lock); 25 __raw_read_lock(lock);
23 return 1; 26 return 1;
24} 27}
25EXPORT_SYMBOL(generic_raw_read_trylock); 28EXPORT_SYMBOL(generic__raw_read_trylock);
26 29
27int __lockfunc _spin_trylock(spinlock_t *lock) 30int __lockfunc _spin_trylock(spinlock_t *lock)
28{ 31{
@@ -57,7 +60,7 @@ int __lockfunc _write_trylock(rwlock_t *lock)
57} 60}
58EXPORT_SYMBOL(_write_trylock); 61EXPORT_SYMBOL(_write_trylock);
59 62
60#ifndef CONFIG_PREEMPT 63#if !defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP)
61 64
62void __lockfunc _read_lock(rwlock_t *lock) 65void __lockfunc _read_lock(rwlock_t *lock)
63{ 66{
@@ -72,7 +75,7 @@ unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
72 75
73 local_irq_save(flags); 76 local_irq_save(flags);
74 preempt_disable(); 77 preempt_disable();
75 _raw_spin_lock_flags(lock, flags); 78 _raw_spin_lock_flags(lock, &flags);
76 return flags; 79 return flags;
77} 80}
78EXPORT_SYMBOL(_spin_lock_irqsave); 81EXPORT_SYMBOL(_spin_lock_irqsave);
diff --git a/kernel/timer.c b/kernel/timer.c
index 13e2b513be01..f4152fcd9f8e 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1154,6 +1154,20 @@ fastcall signed long __sched schedule_timeout(signed long timeout)
1154 1154
1155EXPORT_SYMBOL(schedule_timeout); 1155EXPORT_SYMBOL(schedule_timeout);
1156 1156
1157signed long __sched schedule_timeout_interruptible(signed long timeout)
1158{
1159 set_current_state(TASK_INTERRUPTIBLE);
1160 return schedule_timeout(timeout);
1161}
1162EXPORT_SYMBOL(schedule_timeout_interruptible);
1163
1164signed long __sched schedule_timeout_uninterruptible(signed long timeout)
1165{
1166 set_current_state(TASK_UNINTERRUPTIBLE);
1167 return schedule_timeout(timeout);
1168}
1169EXPORT_SYMBOL(schedule_timeout_uninterruptible);
1170
1157/* Thread ID - the internal kernel "pid" */ 1171/* Thread ID - the internal kernel "pid" */
1158asmlinkage long sys_gettid(void) 1172asmlinkage long sys_gettid(void)
1159{ 1173{
@@ -1170,8 +1184,7 @@ static long __sched nanosleep_restart(struct restart_block *restart)
1170 if (!time_after(expire, now)) 1184 if (!time_after(expire, now))
1171 return 0; 1185 return 0;
1172 1186
1173 current->state = TASK_INTERRUPTIBLE; 1187 expire = schedule_timeout_interruptible(expire - now);
1174 expire = schedule_timeout(expire - now);
1175 1188
1176 ret = 0; 1189 ret = 0;
1177 if (expire) { 1190 if (expire) {
@@ -1199,8 +1212,7 @@ asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __us
1199 return -EINVAL; 1212 return -EINVAL;
1200 1213
1201 expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec); 1214 expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
1202 current->state = TASK_INTERRUPTIBLE; 1215 expire = schedule_timeout_interruptible(expire);
1203 expire = schedule_timeout(expire);
1204 1216
1205 ret = 0; 1217 ret = 0;
1206 if (expire) { 1218 if (expire) {
@@ -1598,10 +1610,8 @@ void msleep(unsigned int msecs)
1598{ 1610{
1599 unsigned long timeout = msecs_to_jiffies(msecs) + 1; 1611 unsigned long timeout = msecs_to_jiffies(msecs) + 1;
1600 1612
1601 while (timeout) { 1613 while (timeout)
1602 set_current_state(TASK_UNINTERRUPTIBLE); 1614 timeout = schedule_timeout_uninterruptible(timeout);
1603 timeout = schedule_timeout(timeout);
1604 }
1605} 1615}
1606 1616
1607EXPORT_SYMBOL(msleep); 1617EXPORT_SYMBOL(msleep);
@@ -1614,10 +1624,8 @@ unsigned long msleep_interruptible(unsigned int msecs)
1614{ 1624{
1615 unsigned long timeout = msecs_to_jiffies(msecs) + 1; 1625 unsigned long timeout = msecs_to_jiffies(msecs) + 1;
1616 1626
1617 while (timeout && !signal_pending(current)) { 1627 while (timeout && !signal_pending(current))
1618 set_current_state(TASK_INTERRUPTIBLE); 1628 timeout = schedule_timeout_interruptible(timeout);
1619 timeout = schedule_timeout(timeout);
1620 }
1621 return jiffies_to_msecs(timeout); 1629 return jiffies_to_msecs(timeout);
1622} 1630}
1623 1631
diff --git a/lib/Makefile b/lib/Makefile
index d9c38ba05e7b..44a46750690a 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -16,6 +16,7 @@ CFLAGS_kobject.o += -DDEBUG
16CFLAGS_kobject_uevent.o += -DDEBUG 16CFLAGS_kobject_uevent.o += -DDEBUG
17endif 17endif
18 18
19obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
19lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o 20lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
20lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o 21lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
21lib-$(CONFIG_SEMAPHORE_SLEEPERS) += semaphore-sleepers.o 22lib-$(CONFIG_SEMAPHORE_SLEEPERS) += semaphore-sleepers.o
diff --git a/lib/dec_and_lock.c b/lib/dec_and_lock.c
index 6658d81e1836..2377af057d09 100644
--- a/lib/dec_and_lock.c
+++ b/lib/dec_and_lock.c
@@ -25,8 +25,6 @@
25 * this is trivially done efficiently using a load-locked 25 * this is trivially done efficiently using a load-locked
26 * store-conditional approach, for example. 26 * store-conditional approach, for example.
27 */ 27 */
28
29#ifndef ATOMIC_DEC_AND_LOCK
30int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock) 28int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
31{ 29{
32 spin_lock(lock); 30 spin_lock(lock);
@@ -37,4 +35,3 @@ int _atomic_dec_and_lock(atomic_t *atomic, spinlock_t *lock)
37} 35}
38 36
39EXPORT_SYMBOL(_atomic_dec_and_lock); 37EXPORT_SYMBOL(_atomic_dec_and_lock);
40#endif
diff --git a/lib/kernel_lock.c b/lib/kernel_lock.c
index bd2bc5d887b8..cb5490ec00f2 100644
--- a/lib/kernel_lock.c
+++ b/lib/kernel_lock.c
@@ -177,8 +177,7 @@ static inline void __lock_kernel(void)
177 177
178static inline void __unlock_kernel(void) 178static inline void __unlock_kernel(void)
179{ 179{
180 _raw_spin_unlock(&kernel_flag); 180 spin_unlock(&kernel_flag);
181 preempt_enable();
182} 181}
183 182
184/* 183/*
diff --git a/lib/radix-tree.c b/lib/radix-tree.c
index b972dd29289d..6a8bc6e06431 100644
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -110,7 +110,7 @@ radix_tree_node_free(struct radix_tree_node *node)
110 * success, return zero, with preemption disabled. On error, return -ENOMEM 110 * success, return zero, with preemption disabled. On error, return -ENOMEM
111 * with preemption not disabled. 111 * with preemption not disabled.
112 */ 112 */
113int radix_tree_preload(int gfp_mask) 113int radix_tree_preload(unsigned int __nocast gfp_mask)
114{ 114{
115 struct radix_tree_preload *rtp; 115 struct radix_tree_preload *rtp;
116 struct radix_tree_node *node; 116 struct radix_tree_node *node;
diff --git a/lib/sort.c b/lib/sort.c
index b73dbb0e7c83..ddc4d35df289 100644
--- a/lib/sort.c
+++ b/lib/sort.c
@@ -6,15 +6,16 @@
6 6
7#include <linux/kernel.h> 7#include <linux/kernel.h>
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/sort.h>
9 10
10void u32_swap(void *a, void *b, int size) 11static void u32_swap(void *a, void *b, int size)
11{ 12{
12 u32 t = *(u32 *)a; 13 u32 t = *(u32 *)a;
13 *(u32 *)a = *(u32 *)b; 14 *(u32 *)a = *(u32 *)b;
14 *(u32 *)b = t; 15 *(u32 *)b = t;
15} 16}
16 17
17void generic_swap(void *a, void *b, int size) 18static void generic_swap(void *a, void *b, int size)
18{ 19{
19 char t; 20 char t;
20 21
diff --git a/lib/spinlock_debug.c b/lib/spinlock_debug.c
new file mode 100644
index 000000000000..906ad101eab3
--- /dev/null
+++ b/lib/spinlock_debug.c
@@ -0,0 +1,257 @@
1/*
2 * Copyright 2005, Red Hat, Inc., Ingo Molnar
3 * Released under the General Public License (GPL).
4 *
5 * This file contains the spinlock/rwlock implementations for
6 * DEBUG_SPINLOCK.
7 */
8
9#include <linux/config.h>
10#include <linux/spinlock.h>
11#include <linux/interrupt.h>
12#include <linux/delay.h>
13
14static void spin_bug(spinlock_t *lock, const char *msg)
15{
16 static long print_once = 1;
17 struct task_struct *owner = NULL;
18
19 if (xchg(&print_once, 0)) {
20 if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT)
21 owner = lock->owner;
22 printk("BUG: spinlock %s on CPU#%d, %s/%d\n",
23 msg, smp_processor_id(), current->comm, current->pid);
24 printk(" lock: %p, .magic: %08x, .owner: %s/%d, .owner_cpu: %d\n",
25 lock, lock->magic,
26 owner ? owner->comm : "<none>",
27 owner ? owner->pid : -1,
28 lock->owner_cpu);
29 dump_stack();
30#ifdef CONFIG_SMP
31 /*
32 * We cannot continue on SMP:
33 */
34// panic("bad locking");
35#endif
36 }
37}
38
39#define SPIN_BUG_ON(cond, lock, msg) if (unlikely(cond)) spin_bug(lock, msg)
40
41static inline void debug_spin_lock_before(spinlock_t *lock)
42{
43 SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic");
44 SPIN_BUG_ON(lock->owner == current, lock, "recursion");
45 SPIN_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),
46 lock, "cpu recursion");
47}
48
49static inline void debug_spin_lock_after(spinlock_t *lock)
50{
51 lock->owner_cpu = raw_smp_processor_id();
52 lock->owner = current;
53}
54
55static inline void debug_spin_unlock(spinlock_t *lock)
56{
57 SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic");
58 SPIN_BUG_ON(!spin_is_locked(lock), lock, "already unlocked");
59 SPIN_BUG_ON(lock->owner != current, lock, "wrong owner");
60 SPIN_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
61 lock, "wrong CPU");
62 lock->owner = SPINLOCK_OWNER_INIT;
63 lock->owner_cpu = -1;
64}
65
66static void __spin_lock_debug(spinlock_t *lock)
67{
68 int print_once = 1;
69 u64 i;
70
71 for (;;) {
72 for (i = 0; i < loops_per_jiffy * HZ; i++) {
73 cpu_relax();
74 if (__raw_spin_trylock(&lock->raw_lock))
75 return;
76 }
77 /* lockup suspected: */
78 if (print_once) {
79 print_once = 0;
80 printk("BUG: spinlock lockup on CPU#%d, %s/%d, %p\n",
81 smp_processor_id(), current->comm, current->pid,
82 lock);
83 dump_stack();
84 }
85 }
86}
87
88void _raw_spin_lock(spinlock_t *lock)
89{
90 debug_spin_lock_before(lock);
91 if (unlikely(!__raw_spin_trylock(&lock->raw_lock)))
92 __spin_lock_debug(lock);
93 debug_spin_lock_after(lock);
94}
95
96int _raw_spin_trylock(spinlock_t *lock)
97{
98 int ret = __raw_spin_trylock(&lock->raw_lock);
99
100 if (ret)
101 debug_spin_lock_after(lock);
102#ifndef CONFIG_SMP
103 /*
104 * Must not happen on UP:
105 */
106 SPIN_BUG_ON(!ret, lock, "trylock failure on UP");
107#endif
108 return ret;
109}
110
111void _raw_spin_unlock(spinlock_t *lock)
112{
113 debug_spin_unlock(lock);
114 __raw_spin_unlock(&lock->raw_lock);
115}
116
117static void rwlock_bug(rwlock_t *lock, const char *msg)
118{
119 static long print_once = 1;
120
121 if (xchg(&print_once, 0)) {
122 printk("BUG: rwlock %s on CPU#%d, %s/%d, %p\n", msg,
123 smp_processor_id(), current->comm, current->pid, lock);
124 dump_stack();
125#ifdef CONFIG_SMP
126 /*
127 * We cannot continue on SMP:
128 */
129 panic("bad locking");
130#endif
131 }
132}
133
134#define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg)
135
136static void __read_lock_debug(rwlock_t *lock)
137{
138 int print_once = 1;
139 u64 i;
140
141 for (;;) {
142 for (i = 0; i < loops_per_jiffy * HZ; i++) {
143 cpu_relax();
144 if (__raw_read_trylock(&lock->raw_lock))
145 return;
146 }
147 /* lockup suspected: */
148 if (print_once) {
149 print_once = 0;
150 printk("BUG: read-lock lockup on CPU#%d, %s/%d, %p\n",
151 smp_processor_id(), current->comm, current->pid,
152 lock);
153 dump_stack();
154 }
155 }
156}
157
158void _raw_read_lock(rwlock_t *lock)
159{
160 RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
161 if (unlikely(!__raw_read_trylock(&lock->raw_lock)))
162 __read_lock_debug(lock);
163}
164
165int _raw_read_trylock(rwlock_t *lock)
166{
167 int ret = __raw_read_trylock(&lock->raw_lock);
168
169#ifndef CONFIG_SMP
170 /*
171 * Must not happen on UP:
172 */
173 RWLOCK_BUG_ON(!ret, lock, "trylock failure on UP");
174#endif
175 return ret;
176}
177
178void _raw_read_unlock(rwlock_t *lock)
179{
180 RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
181 __raw_read_unlock(&lock->raw_lock);
182}
183
184static inline void debug_write_lock_before(rwlock_t *lock)
185{
186 RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
187 RWLOCK_BUG_ON(lock->owner == current, lock, "recursion");
188 RWLOCK_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),
189 lock, "cpu recursion");
190}
191
192static inline void debug_write_lock_after(rwlock_t *lock)
193{
194 lock->owner_cpu = raw_smp_processor_id();
195 lock->owner = current;
196}
197
198static inline void debug_write_unlock(rwlock_t *lock)
199{
200 RWLOCK_BUG_ON(lock->magic != RWLOCK_MAGIC, lock, "bad magic");
201 RWLOCK_BUG_ON(lock->owner != current, lock, "wrong owner");
202 RWLOCK_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
203 lock, "wrong CPU");
204 lock->owner = SPINLOCK_OWNER_INIT;
205 lock->owner_cpu = -1;
206}
207
208static void __write_lock_debug(rwlock_t *lock)
209{
210 int print_once = 1;
211 u64 i;
212
213 for (;;) {
214 for (i = 0; i < loops_per_jiffy * HZ; i++) {
215 cpu_relax();
216 if (__raw_write_trylock(&lock->raw_lock))
217 return;
218 }
219 /* lockup suspected: */
220 if (print_once) {
221 print_once = 0;
222 printk("BUG: write-lock lockup on CPU#%d, %s/%d, %p\n",
223 smp_processor_id(), current->comm, current->pid,
224 lock);
225 dump_stack();
226 }
227 }
228}
229
230void _raw_write_lock(rwlock_t *lock)
231{
232 debug_write_lock_before(lock);
233 if (unlikely(!__raw_write_trylock(&lock->raw_lock)))
234 __write_lock_debug(lock);
235 debug_write_lock_after(lock);
236}
237
238int _raw_write_trylock(rwlock_t *lock)
239{
240 int ret = __raw_write_trylock(&lock->raw_lock);
241
242 if (ret)
243 debug_write_lock_after(lock);
244#ifndef CONFIG_SMP
245 /*
246 * Must not happen on UP:
247 */
248 RWLOCK_BUG_ON(!ret, lock, "trylock failure on UP");
249#endif
250 return ret;
251}
252
253void _raw_write_unlock(rwlock_t *lock)
254{
255 debug_write_unlock(lock);
256 __raw_write_unlock(&lock->raw_lock);
257}
diff --git a/mm/filemap.c b/mm/filemap.c
index 88611928e71f..b5346576e58d 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -37,6 +37,10 @@
37#include <asm/uaccess.h> 37#include <asm/uaccess.h>
38#include <asm/mman.h> 38#include <asm/mman.h>
39 39
40static ssize_t
41generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
42 loff_t offset, unsigned long nr_segs);
43
40/* 44/*
41 * Shared mappings implemented 30.11.1994. It's not fully working yet, 45 * Shared mappings implemented 30.11.1994. It's not fully working yet,
42 * though. 46 * though.
@@ -301,8 +305,9 @@ EXPORT_SYMBOL(sync_page_range);
301 * as it forces O_SYNC writers to different parts of the same file 305 * as it forces O_SYNC writers to different parts of the same file
302 * to be serialised right until io completion. 306 * to be serialised right until io completion.
303 */ 307 */
304int sync_page_range_nolock(struct inode *inode, struct address_space *mapping, 308static int sync_page_range_nolock(struct inode *inode,
305 loff_t pos, size_t count) 309 struct address_space *mapping,
310 loff_t pos, size_t count)
306{ 311{
307 pgoff_t start = pos >> PAGE_CACHE_SHIFT; 312 pgoff_t start = pos >> PAGE_CACHE_SHIFT;
308 pgoff_t end = (pos + count - 1) >> PAGE_CACHE_SHIFT; 313 pgoff_t end = (pos + count - 1) >> PAGE_CACHE_SHIFT;
@@ -317,7 +322,6 @@ int sync_page_range_nolock(struct inode *inode, struct address_space *mapping,
317 ret = wait_on_page_writeback_range(mapping, start, end); 322 ret = wait_on_page_writeback_range(mapping, start, end);
318 return ret; 323 return ret;
319} 324}
320EXPORT_SYMBOL(sync_page_range_nolock);
321 325
322/** 326/**
323 * filemap_fdatawait - walk the list of under-writeback pages of the given 327 * filemap_fdatawait - walk the list of under-writeback pages of the given
@@ -2008,7 +2012,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
2008} 2012}
2009EXPORT_SYMBOL(generic_file_buffered_write); 2013EXPORT_SYMBOL(generic_file_buffered_write);
2010 2014
2011ssize_t 2015static ssize_t
2012__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov, 2016__generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
2013 unsigned long nr_segs, loff_t *ppos) 2017 unsigned long nr_segs, loff_t *ppos)
2014{ 2018{
@@ -2108,7 +2112,7 @@ generic_file_aio_write_nolock(struct kiocb *iocb, const struct iovec *iov,
2108 return ret; 2112 return ret;
2109} 2113}
2110 2114
2111ssize_t 2115static ssize_t
2112__generic_file_write_nolock(struct file *file, const struct iovec *iov, 2116__generic_file_write_nolock(struct file *file, const struct iovec *iov,
2113 unsigned long nr_segs, loff_t *ppos) 2117 unsigned long nr_segs, loff_t *ppos)
2114{ 2118{
@@ -2229,7 +2233,7 @@ EXPORT_SYMBOL(generic_file_writev);
2229 * Called under i_sem for writes to S_ISREG files. Returns -EIO if something 2233 * Called under i_sem for writes to S_ISREG files. Returns -EIO if something
2230 * went wrong during pagecache shootdown. 2234 * went wrong during pagecache shootdown.
2231 */ 2235 */
2232ssize_t 2236static ssize_t
2233generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, 2237generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
2234 loff_t offset, unsigned long nr_segs) 2238 loff_t offset, unsigned long nr_segs)
2235{ 2239{
@@ -2264,4 +2268,3 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
2264 } 2268 }
2265 return retval; 2269 return retval;
2266} 2270}
2267EXPORT_SYMBOL_GPL(generic_file_direct_IO);
diff --git a/mm/memory.c b/mm/memory.c
index 788a62810340..ae8161f1f459 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2225,7 +2225,7 @@ void update_mem_hiwater(struct task_struct *tsk)
2225#if !defined(__HAVE_ARCH_GATE_AREA) 2225#if !defined(__HAVE_ARCH_GATE_AREA)
2226 2226
2227#if defined(AT_SYSINFO_EHDR) 2227#if defined(AT_SYSINFO_EHDR)
2228struct vm_area_struct gate_vma; 2228static struct vm_area_struct gate_vma;
2229 2229
2230static int __init gate_vma_init(void) 2230static int __init gate_vma_init(void)
2231{ 2231{
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 5ec8da12cfd9..ac3bf33e5370 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -300,6 +300,5 @@ retry:
300 * Give "p" a good chance of killing itself before we 300 * Give "p" a good chance of killing itself before we
301 * retry to allocate memory. 301 * retry to allocate memory.
302 */ 302 */
303 __set_current_state(TASK_INTERRUPTIBLE); 303 schedule_timeout_interruptible(1);
304 schedule_timeout(1);
305} 304}
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 3974fd81d27c..c5823c395f71 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -335,7 +335,7 @@ static inline void free_pages_check(const char *function, struct page *page)
335/* 335/*
336 * Frees a list of pages. 336 * Frees a list of pages.
337 * Assumes all pages on list are in same zone, and of same order. 337 * Assumes all pages on list are in same zone, and of same order.
338 * count is the number of pages to free, or 0 for all on the list. 338 * count is the number of pages to free.
339 * 339 *
340 * If the zone was previously in an "all pages pinned" state then look to 340 * If the zone was previously in an "all pages pinned" state then look to
341 * see if this freeing clears that state. 341 * see if this freeing clears that state.
diff --git a/mm/slab.c b/mm/slab.c
index 05a391059fe1..9e876d6dfad9 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1720,7 +1720,7 @@ next:
1720 cachep->objsize = size; 1720 cachep->objsize = size;
1721 1721
1722 if (flags & CFLGS_OFF_SLAB) 1722 if (flags & CFLGS_OFF_SLAB)
1723 cachep->slabp_cache = kmem_find_general_cachep(slab_size,0); 1723 cachep->slabp_cache = kmem_find_general_cachep(slab_size, 0u);
1724 cachep->ctor = ctor; 1724 cachep->ctor = ctor;
1725 cachep->dtor = dtor; 1725 cachep->dtor = dtor;
1726 cachep->name = name; 1726 cachep->name = name;
@@ -2839,7 +2839,7 @@ out:
2839 * New and improved: it will now make sure that the object gets 2839 * New and improved: it will now make sure that the object gets
2840 * put on the correct node list so that there is no false sharing. 2840 * put on the correct node list so that there is no false sharing.
2841 */ 2841 */
2842void *kmem_cache_alloc_node(kmem_cache_t *cachep, int flags, int nodeid) 2842void *kmem_cache_alloc_node(kmem_cache_t *cachep, unsigned int __nocast flags, int nodeid)
2843{ 2843{
2844 unsigned long save_flags; 2844 unsigned long save_flags;
2845 void *ptr; 2845 void *ptr;
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 029e56eb5e77..adbc2b426c2f 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -67,8 +67,8 @@ void show_swap_cache_info(void)
67 * __add_to_swap_cache resembles add_to_page_cache on swapper_space, 67 * __add_to_swap_cache resembles add_to_page_cache on swapper_space,
68 * but sets SwapCache flag and private instead of mapping and index. 68 * but sets SwapCache flag and private instead of mapping and index.
69 */ 69 */
70static int __add_to_swap_cache(struct page *page, 70static int __add_to_swap_cache(struct page *page, swp_entry_t entry,
71 swp_entry_t entry, int gfp_mask) 71 unsigned int __nocast gfp_mask)
72{ 72{
73 int error; 73 int error;
74 74
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 4b6e8bf986bc..0184f510aace 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1153,8 +1153,7 @@ asmlinkage long sys_swapoff(const char __user * specialfile)
1153 p->highest_bit = 0; /* cuts scans short */ 1153 p->highest_bit = 0; /* cuts scans short */
1154 while (p->flags >= SWP_SCANNING) { 1154 while (p->flags >= SWP_SCANNING) {
1155 spin_unlock(&swap_lock); 1155 spin_unlock(&swap_lock);
1156 set_current_state(TASK_UNINTERRUPTIBLE); 1156 schedule_timeout_uninterruptible(1);
1157 schedule_timeout(1);
1158 spin_lock(&swap_lock); 1157 spin_lock(&swap_lock);
1159 } 1158 }
1160 1159
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index ea30012dd195..e05f4f955eee 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -78,13 +78,11 @@ static struct dccp_li_hist *ccid3_li_hist;
78 78
79static int ccid3_init(struct sock *sk) 79static int ccid3_init(struct sock *sk)
80{ 80{
81 ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
82 return 0; 81 return 0;
83} 82}
84 83
85static void ccid3_exit(struct sock *sk) 84static void ccid3_exit(struct sock *sk)
86{ 85{
87 ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
88} 86}
89 87
90/* TFRC sender states */ 88/* TFRC sender states */
@@ -287,14 +285,14 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
287 long delay; 285 long delay;
288 int rc = -ENOTCONN; 286 int rc = -ENOTCONN;
289 287
290 /* Check if pure ACK or Terminating*/ 288 BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM);
291 289
290 /* Check if pure ACK or Terminating*/
292 /* 291 /*
293 * XXX: We only call this function for DATA and DATAACK, on, these 292 * XXX: We only call this function for DATA and DATAACK, on, these
294 * packets can have zero length, but why the comment about "pure ACK"? 293 * packets can have zero length, but why the comment about "pure ACK"?
295 */ 294 */
296 if (hctx == NULL || len == 0 || 295 if (unlikely(len == 0))
297 hctx->ccid3hctx_state == TFRC_SSTATE_TERM)
298 goto out; 296 goto out;
299 297
300 /* See if last packet allocated was not sent */ 298 /* See if last packet allocated was not sent */
@@ -304,10 +302,10 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
304 SLAB_ATOMIC); 302 SLAB_ATOMIC);
305 303
306 rc = -ENOBUFS; 304 rc = -ENOBUFS;
307 if (new_packet == NULL) { 305 if (unlikely(new_packet == NULL)) {
308 ccid3_pr_debug("%s, sk=%p, not enough mem to add " 306 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, not enough "
309 "to history, send refused\n", 307 "mem to add to history, send refused\n",
310 dccp_role(sk), sk); 308 __FUNCTION__, dccp_role(sk), sk);
311 goto out; 309 goto out;
312 } 310 }
313 311
@@ -318,9 +316,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
318 316
319 switch (hctx->ccid3hctx_state) { 317 switch (hctx->ccid3hctx_state) {
320 case TFRC_SSTATE_NO_SENT: 318 case TFRC_SSTATE_NO_SENT:
321 ccid3_pr_debug("%s, sk=%p, first packet(%llu)\n",
322 dccp_role(sk), sk, dp->dccps_gss);
323
324 hctx->ccid3hctx_no_feedback_timer.function = ccid3_hc_tx_no_feedback_timer; 319 hctx->ccid3hctx_no_feedback_timer.function = ccid3_hc_tx_no_feedback_timer;
325 hctx->ccid3hctx_no_feedback_timer.data = (unsigned long)sk; 320 hctx->ccid3hctx_no_feedback_timer.data = (unsigned long)sk;
326 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer, 321 sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
@@ -328,7 +323,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
328 hctx->ccid3hctx_last_win_count = 0; 323 hctx->ccid3hctx_last_win_count = 0;
329 hctx->ccid3hctx_t_last_win_count = now; 324 hctx->ccid3hctx_t_last_win_count = now;
330 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); 325 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK);
331 hctx->ccid3hctx_t_ipi = TFRC_INITIAL_TIMEOUT; 326 hctx->ccid3hctx_t_ipi = TFRC_INITIAL_IPI;
332 327
333 /* Set nominal send time for initial packet */ 328 /* Set nominal send time for initial packet */
334 hctx->ccid3hctx_t_nom = now; 329 hctx->ccid3hctx_t_nom = now;
@@ -341,7 +336,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk,
341 case TFRC_SSTATE_FBACK: 336 case TFRC_SSTATE_FBACK:
342 delay = (timeval_delta(&now, &hctx->ccid3hctx_t_nom) - 337 delay = (timeval_delta(&now, &hctx->ccid3hctx_t_nom) -
343 hctx->ccid3hctx_delta); 338 hctx->ccid3hctx_delta);
344 ccid3_pr_debug("send_packet delay=%ld\n", delay);
345 delay /= -1000; 339 delay /= -1000;
346 /* divide by -1000 is to convert to ms and get sign right */ 340 /* divide by -1000 is to convert to ms and get sign right */
347 rc = delay > 0 ? delay : 0; 341 rc = delay > 0 ? delay : 0;
@@ -371,13 +365,7 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len)
371 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 365 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
372 struct timeval now; 366 struct timeval now;
373 367
374 BUG_ON(hctx == NULL); 368 BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM);
375
376 if (hctx->ccid3hctx_state == TFRC_SSTATE_TERM) {
377 ccid3_pr_debug("%s, sk=%p, while state is TFRC_SSTATE_TERM!\n",
378 dccp_role(sk), sk);
379 return;
380 }
381 369
382 dccp_timestamp(sk, &now); 370 dccp_timestamp(sk, &now);
383 371
@@ -387,14 +375,14 @@ static void ccid3_hc_tx_packet_sent(struct sock *sk, int more, int len)
387 struct dccp_tx_hist_entry *packet; 375 struct dccp_tx_hist_entry *packet;
388 376
389 packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist); 377 packet = dccp_tx_hist_head(&hctx->ccid3hctx_hist);
390 if (packet == NULL) { 378 if (unlikely(packet == NULL)) {
391 printk(KERN_CRIT "%s: packet doesn't exists in " 379 LIMIT_NETDEBUG(KERN_WARNING "%s: packet doesn't "
392 "history!\n", __FUNCTION__); 380 "exists in history!\n", __FUNCTION__);
393 return; 381 return;
394 } 382 }
395 if (packet->dccphtx_sent) { 383 if (unlikely(packet->dccphtx_sent)) {
396 printk(KERN_CRIT "%s: no unsent packet in history!\n", 384 LIMIT_NETDEBUG(KERN_WARNING "%s: no unsent packet in "
397 __FUNCTION__); 385 "history!\n", __FUNCTION__);
398 return; 386 return;
399 } 387 }
400 packet->dccphtx_tstamp = now; 388 packet->dccphtx_tstamp = now;
@@ -465,14 +453,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
465 u32 x_recv; 453 u32 x_recv;
466 u32 r_sample; 454 u32 r_sample;
467 455
468 if (hctx == NULL) 456 BUG_ON(hctx == NULL || hctx->ccid3hctx_state == TFRC_SSTATE_TERM);
469 return;
470
471 if (hctx->ccid3hctx_state == TFRC_SSTATE_TERM) {
472 ccid3_pr_debug("%s, sk=%p, received a packet when "
473 "terminating!\n", dccp_role(sk), sk);
474 return;
475 }
476 457
477 /* we are only interested in ACKs */ 458 /* we are only interested in ACKs */
478 if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK || 459 if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK ||
@@ -496,12 +477,12 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
496 /* get t_recvdata from history */ 477 /* get t_recvdata from history */
497 packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist, 478 packet = dccp_tx_hist_find_entry(&hctx->ccid3hctx_hist,
498 DCCP_SKB_CB(skb)->dccpd_ack_seq); 479 DCCP_SKB_CB(skb)->dccpd_ack_seq);
499 if (packet == NULL) { 480 if (unlikely(packet == NULL)) {
500 ccid3_pr_debug("%s, sk=%p, seqno %llu(%s) does't " 481 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, seqno "
501 "exist in history!\n", 482 "%llu(%s) does't exist in history!\n",
502 dccp_role(sk), sk, 483 __FUNCTION__, dccp_role(sk), sk,
503 DCCP_SKB_CB(skb)->dccpd_ack_seq, 484 (unsigned long long)DCCP_SKB_CB(skb)->dccpd_ack_seq,
504 dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type)); 485 dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type));
505 return; 486 return;
506 } 487 }
507 488
@@ -509,8 +490,8 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
509 dccp_timestamp(sk, &now); 490 dccp_timestamp(sk, &now);
510 r_sample = timeval_delta(&now, &packet->dccphtx_tstamp); 491 r_sample = timeval_delta(&now, &packet->dccphtx_tstamp);
511 if (unlikely(r_sample <= t_elapsed)) 492 if (unlikely(r_sample <= t_elapsed))
512 LIMIT_NETDEBUG(KERN_WARNING 493 LIMIT_NETDEBUG(KERN_WARNING "%s: r_sample=%uus, "
513 "%s: r_sample=%uus, t_elapsed=%uus\n", 494 "t_elapsed=%uus\n",
514 __FUNCTION__, r_sample, t_elapsed); 495 __FUNCTION__, r_sample, t_elapsed);
515 else 496 else
516 r_sample -= t_elapsed; 497 r_sample -= t_elapsed;
@@ -606,10 +587,11 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
606 587
607static void ccid3_hc_tx_insert_options(struct sock *sk, struct sk_buff *skb) 588static void ccid3_hc_tx_insert_options(struct sock *sk, struct sk_buff *skb)
608{ 589{
609 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 590 const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
610 591
611 if (hctx == NULL || !(sk->sk_state == DCCP_OPEN || 592 BUG_ON(hctx == NULL);
612 sk->sk_state == DCCP_PARTOPEN)) 593
594 if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN))
613 return; 595 return;
614 596
615 DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count; 597 DCCP_SKB_CB(skb)->dccpd_ccval = hctx->ccid3hctx_last_win_count;
@@ -624,8 +606,7 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
624 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 606 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
625 struct ccid3_options_received *opt_recv; 607 struct ccid3_options_received *opt_recv;
626 608
627 if (hctx == NULL) 609 BUG_ON(hctx == NULL);
628 return 0;
629 610
630 opt_recv = &hctx->ccid3hctx_options_received; 611 opt_recv = &hctx->ccid3hctx_options_received;
631 612
@@ -639,10 +620,10 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
639 620
640 switch (option) { 621 switch (option) {
641 case TFRC_OPT_LOSS_EVENT_RATE: 622 case TFRC_OPT_LOSS_EVENT_RATE:
642 if (len != 4) { 623 if (unlikely(len != 4)) {
643 ccid3_pr_debug("%s, sk=%p, invalid len for " 624 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, invalid "
644 "TFRC_OPT_LOSS_EVENT_RATE\n", 625 "len for TFRC_OPT_LOSS_EVENT_RATE\n",
645 dccp_role(sk), sk); 626 __FUNCTION__, dccp_role(sk), sk);
646 rc = -EINVAL; 627 rc = -EINVAL;
647 } else { 628 } else {
648 opt_recv->ccid3or_loss_event_rate = ntohl(*(u32 *)value); 629 opt_recv->ccid3or_loss_event_rate = ntohl(*(u32 *)value);
@@ -660,10 +641,10 @@ static int ccid3_hc_tx_parse_options(struct sock *sk, unsigned char option,
660 opt_recv->ccid3or_loss_intervals_len); 641 opt_recv->ccid3or_loss_intervals_len);
661 break; 642 break;
662 case TFRC_OPT_RECEIVE_RATE: 643 case TFRC_OPT_RECEIVE_RATE:
663 if (len != 4) { 644 if (unlikely(len != 4)) {
664 ccid3_pr_debug("%s, sk=%p, invalid len for " 645 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, invalid "
665 "TFRC_OPT_RECEIVE_RATE\n", 646 "len for TFRC_OPT_RECEIVE_RATE\n",
666 dccp_role(sk), sk); 647 __FUNCTION__, dccp_role(sk), sk);
667 rc = -EINVAL; 648 rc = -EINVAL;
668 } else { 649 } else {
669 opt_recv->ccid3or_receive_rate = ntohl(*(u32 *)value); 650 opt_recv->ccid3or_receive_rate = ntohl(*(u32 *)value);
@@ -682,8 +663,6 @@ static int ccid3_hc_tx_init(struct sock *sk)
682 struct dccp_sock *dp = dccp_sk(sk); 663 struct dccp_sock *dp = dccp_sk(sk);
683 struct ccid3_hc_tx_sock *hctx; 664 struct ccid3_hc_tx_sock *hctx;
684 665
685 ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
686
687 dp->dccps_hc_tx_ccid_private = kmalloc(sizeof(*hctx), gfp_any()); 666 dp->dccps_hc_tx_ccid_private = kmalloc(sizeof(*hctx), gfp_any());
688 if (dp->dccps_hc_tx_ccid_private == NULL) 667 if (dp->dccps_hc_tx_ccid_private == NULL)
689 return -ENOMEM; 668 return -ENOMEM;
@@ -712,7 +691,6 @@ static void ccid3_hc_tx_exit(struct sock *sk)
712 struct dccp_sock *dp = dccp_sk(sk); 691 struct dccp_sock *dp = dccp_sk(sk);
713 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 692 struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
714 693
715 ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk);
716 BUG_ON(hctx == NULL); 694 BUG_ON(hctx == NULL);
717 695
718 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM); 696 ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM);
@@ -792,10 +770,10 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk)
792 } 770 }
793 771
794 packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist); 772 packet = dccp_rx_hist_find_data_packet(&hcrx->ccid3hcrx_hist);
795 if (packet == NULL) { 773 if (unlikely(packet == NULL)) {
796 printk(KERN_CRIT "%s: %s, sk=%p, no data packet in history!\n", 774 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, no data packet "
797 __FUNCTION__, dccp_role(sk), sk); 775 "in history!\n",
798 dump_stack(); 776 __FUNCTION__, dccp_role(sk), sk);
799 return; 777 return;
800 } 778 }
801 779
@@ -817,11 +795,12 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk)
817 795
818static void ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb) 796static void ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
819{ 797{
820 struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); 798 const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
821 u32 x_recv, pinv; 799 u32 x_recv, pinv;
822 800
823 if (hcrx == NULL || !(sk->sk_state == DCCP_OPEN || 801 BUG_ON(hcrx == NULL);
824 sk->sk_state == DCCP_PARTOPEN)) 802
803 if (!(sk->sk_state == DCCP_OPEN || sk->sk_state == DCCP_PARTOPEN))
825 return; 804 return;
826 805
827 DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_last_counter; 806 DCCP_SKB_CB(skb)->dccpd_ccval = hcrx->ccid3hcrx_last_counter;
@@ -878,17 +857,17 @@ static u32 ccid3_hc_rx_calc_first_li(struct sock *sk)
878 } 857 }
879 } 858 }
880 859
881 if (step == 0) { 860 if (unlikely(step == 0)) {
882 printk(KERN_CRIT "%s: %s, sk=%p, packet history contains no " 861 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, packet history "
883 "data packets!\n", 862 "contains no data packets!\n",
884 __FUNCTION__, dccp_role(sk), sk); 863 __FUNCTION__, dccp_role(sk), sk);
885 return ~0; 864 return ~0;
886 } 865 }
887 866
888 if (interval == 0) { 867 if (unlikely(interval == 0)) {
889 ccid3_pr_debug("%s, sk=%p, Could not find a win_count " 868 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, Could not find a "
890 "interval > 0. Defaulting to 1\n", 869 "win_count interval > 0. Defaulting to 1\n",
891 dccp_role(sk), sk); 870 __FUNCTION__, dccp_role(sk), sk);
892 interval = 1; 871 interval = 1;
893 } 872 }
894found: 873found:
@@ -931,8 +910,9 @@ static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss)
931 if (li_tail == NULL) 910 if (li_tail == NULL)
932 return; 911 return;
933 li_tail->dccplih_interval = ccid3_hc_rx_calc_first_li(sk); 912 li_tail->dccplih_interval = ccid3_hc_rx_calc_first_li(sk);
934 } 913 } else
935 /* FIXME: find end of interval */ 914 LIMIT_NETDEBUG(KERN_WARNING "%s: FIXME: find end of "
915 "interval\n", __FUNCTION__);
936} 916}
937 917
938static void ccid3_hc_rx_detect_loss(struct sock *sk) 918static void ccid3_hc_rx_detect_loss(struct sock *sk)
@@ -956,10 +936,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
956 u32 p_prev, r_sample, t_elapsed; 936 u32 p_prev, r_sample, t_elapsed;
957 int ins; 937 int ins;
958 938
959 if (hcrx == NULL) 939 BUG_ON(hcrx == NULL ||
960 return; 940 !(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA ||
961
962 BUG_ON(!(hcrx->ccid3hcrx_state == TFRC_RSTATE_NO_DATA ||
963 hcrx->ccid3hcrx_state == TFRC_RSTATE_DATA)); 941 hcrx->ccid3hcrx_state == TFRC_RSTATE_DATA));
964 942
965 opt_recv = &dccp_sk(sk)->dccps_options_received; 943 opt_recv = &dccp_sk(sk)->dccps_options_received;
@@ -978,8 +956,8 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
978 t_elapsed = opt_recv->dccpor_elapsed_time * 10; 956 t_elapsed = opt_recv->dccpor_elapsed_time * 10;
979 957
980 if (unlikely(r_sample <= t_elapsed)) 958 if (unlikely(r_sample <= t_elapsed))
981 LIMIT_NETDEBUG(KERN_WARNING 959 LIMIT_NETDEBUG(KERN_WARNING "%s: r_sample=%uus, "
982 "%s: r_sample=%uus, t_elapsed=%uus\n", 960 "t_elapsed=%uus\n",
983 __FUNCTION__, r_sample, t_elapsed); 961 __FUNCTION__, r_sample, t_elapsed);
984 else 962 else
985 r_sample -= t_elapsed; 963 r_sample -= t_elapsed;
@@ -997,19 +975,16 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
997 break; 975 break;
998 case DCCP_PKT_DATA: 976 case DCCP_PKT_DATA:
999 break; 977 break;
1000 default: 978 default: /* We're not interested in other packet types, move along */
1001 ccid3_pr_debug("%s, sk=%p, not DATA/DATAACK/ACK packet(%s)\n",
1002 dccp_role(sk), sk,
1003 dccp_packet_name(DCCP_SKB_CB(skb)->dccpd_type));
1004 return; 979 return;
1005 } 980 }
1006 981
1007 packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp, 982 packet = dccp_rx_hist_entry_new(ccid3_rx_hist, sk, opt_recv->dccpor_ndp,
1008 skb, SLAB_ATOMIC); 983 skb, SLAB_ATOMIC);
1009 if (packet == NULL) { 984 if (unlikely(packet == NULL)) {
1010 ccid3_pr_debug("%s, sk=%p, Not enough mem to add rx packet " 985 LIMIT_NETDEBUG(KERN_WARNING "%s: %s, sk=%p, Not enough mem to "
1011 "to history (consider it lost)!", 986 "add rx packet to history, consider it lost!\n",
1012 dccp_role(sk), sk); 987 __FUNCTION__, dccp_role(sk), sk);
1013 return; 988 return;
1014 } 989 }
1015 990
@@ -1102,10 +1077,7 @@ static void ccid3_hc_rx_exit(struct sock *sk)
1102 struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); 1077 struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1103 struct dccp_sock *dp = dccp_sk(sk); 1078 struct dccp_sock *dp = dccp_sk(sk);
1104 1079
1105 ccid3_pr_debug("%s, sk=%p\n", dccp_role(sk), sk); 1080 BUG_ON(hcrx == NULL);
1106
1107 if (hcrx == NULL)
1108 return;
1109 1081
1110 ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM); 1082 ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM);
1111 1083
@@ -1123,8 +1095,7 @@ static void ccid3_hc_rx_get_info(struct sock *sk, struct tcp_info *info)
1123{ 1095{
1124 const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk); 1096 const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
1125 1097
1126 if (hcrx == NULL) 1098 BUG_ON(hcrx == NULL);
1127 return;
1128 1099
1129 info->tcpi_ca_state = hcrx->ccid3hcrx_state; 1100 info->tcpi_ca_state = hcrx->ccid3hcrx_state;
1130 info->tcpi_options |= TCPI_OPT_TIMESTAMPS; 1101 info->tcpi_options |= TCPI_OPT_TIMESTAMPS;
@@ -1135,8 +1106,7 @@ static void ccid3_hc_tx_get_info(struct sock *sk, struct tcp_info *info)
1135{ 1106{
1136 const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk); 1107 const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
1137 1108
1138 if (hctx == NULL) 1109 BUG_ON(hctx == NULL);
1139 return;
1140 1110
1141 info->tcpi_rto = hctx->ccid3hctx_t_rto; 1111 info->tcpi_rto = hctx->ccid3hctx_t_rto;
1142 info->tcpi_rtt = hctx->ccid3hctx_rtt; 1112 info->tcpi_rtt = hctx->ccid3hctx_rtt;
diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h
index d16f00d784f3..eb248778eea3 100644
--- a/net/dccp/ccids/ccid3.h
+++ b/net/dccp/ccids/ccid3.h
@@ -48,6 +48,8 @@
48/* Two seconds as per CCID3 spec */ 48/* Two seconds as per CCID3 spec */
49#define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC) 49#define TFRC_INITIAL_TIMEOUT (2 * USEC_PER_SEC)
50 50
51#define TFRC_INITIAL_IPI (USEC_PER_SEC / 4)
52
51/* In usecs - half the scheduling granularity as per RFC3448 4.6 */ 53/* In usecs - half the scheduling granularity as per RFC3448 4.6 */
52#define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ)) 54#define TFRC_OPSYS_HALF_TIME_GRAN (USEC_PER_SEC / (2 * HZ))
53 55
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index fee9a8c3777b..2afaa464e7f0 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -641,16 +641,12 @@ int dccp_v4_send_reset(struct sock *sk, enum dccp_reset_codes code)
641 641
642 skb = dccp_make_reset(sk, sk->sk_dst_cache, code); 642 skb = dccp_make_reset(sk, sk->sk_dst_cache, code);
643 if (skb != NULL) { 643 if (skb != NULL) {
644 const struct dccp_sock *dp = dccp_sk(sk);
645 const struct inet_sock *inet = inet_sk(sk); 644 const struct inet_sock *inet = inet_sk(sk);
646 645
647 err = ip_build_and_send_pkt(skb, sk, 646 err = ip_build_and_send_pkt(skb, sk,
648 inet->saddr, inet->daddr, NULL); 647 inet->saddr, inet->daddr, NULL);
649 if (err == NET_XMIT_CN) 648 if (err == NET_XMIT_CN)
650 err = 0; 649 err = 0;
651
652 ccid_hc_rx_exit(dp->dccps_hc_rx_ccid, sk);
653 ccid_hc_tx_exit(dp->dccps_hc_tx_ccid, sk);
654 } 650 }
655 651
656 return err; 652 return err;
diff --git a/net/dccp/output.c b/net/dccp/output.c
index 28de157a4326..ea6d0e91e511 100644
--- a/net/dccp/output.c
+++ b/net/dccp/output.c
@@ -522,7 +522,4 @@ void dccp_send_close(struct sock *sk, const int active)
522 dccp_transmit_skb(sk, skb_clone(skb, prio)); 522 dccp_transmit_skb(sk, skb_clone(skb, prio));
523 } else 523 } else
524 dccp_transmit_skb(sk, skb); 524 dccp_transmit_skb(sk, skb);
525
526 ccid_hc_rx_exit(dp->dccps_hc_rx_ccid, sk);
527 ccid_hc_tx_exit(dp->dccps_hc_tx_ccid, sk);
528} 525}
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 15e1134da1b2..c10e4435e3b1 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -485,11 +485,6 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
485 TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when; 485 TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when;
486 buff->tstamp = skb->tstamp; 486 buff->tstamp = skb->tstamp;
487 487
488 if (TCP_SKB_CB(skb)->sacked & TCPCB_LOST) {
489 tp->lost_out -= tcp_skb_pcount(skb);
490 tp->left_out -= tcp_skb_pcount(skb);
491 }
492
493 old_factor = tcp_skb_pcount(skb); 488 old_factor = tcp_skb_pcount(skb);
494 489
495 /* Fix up tso_factor for both original and new SKB. */ 490 /* Fix up tso_factor for both original and new SKB. */
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 47122728212a..922549581abc 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -406,8 +406,7 @@ ipv6_invert_rthdr(struct sock *sk, struct ipv6_rt_hdr *hdr)
406 406
407 memcpy(opt->srcrt, hdr, sizeof(*hdr)); 407 memcpy(opt->srcrt, hdr, sizeof(*hdr));
408 irthdr = (struct rt0_hdr*)opt->srcrt; 408 irthdr = (struct rt0_hdr*)opt->srcrt;
409 /* Obsolete field, MBZ, when originated by us */ 409 irthdr->reserved = 0;
410 irthdr->bitmap = 0;
411 opt->srcrt->segments_left = n; 410 opt->srcrt->segments_left = n;
412 for (i=0; i<n; i++) 411 for (i=0; i<n; i++)
413 memcpy(irthdr->addr+i, rthdr->addr+(n-1-i), 16); 412 memcpy(irthdr->addr+i, rthdr->addr+(n-1-i), 16);
diff --git a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c
index a9526b773d28..2bb670037df3 100644
--- a/net/ipv6/netfilter/ip6t_rt.c
+++ b/net/ipv6/netfilter/ip6t_rt.c
@@ -161,8 +161,8 @@ match(const struct sk_buff *skb,
161 ((rtinfo->hdrlen == hdrlen) ^ 161 ((rtinfo->hdrlen == hdrlen) ^
162 !!(rtinfo->invflags & IP6T_RT_INV_LEN)))); 162 !!(rtinfo->invflags & IP6T_RT_INV_LEN))));
163 DEBUGP("res %02X %02X %02X ", 163 DEBUGP("res %02X %02X %02X ",
164 (rtinfo->flags & IP6T_RT_RES), ((struct rt0_hdr *)rh)->bitmap, 164 (rtinfo->flags & IP6T_RT_RES), ((struct rt0_hdr *)rh)->reserved,
165 !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)rh)->bitmap))); 165 !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)rh)->reserved)));
166 166
167 ret = (rh != NULL) 167 ret = (rh != NULL)
168 && 168 &&
@@ -179,12 +179,12 @@ match(const struct sk_buff *skb,
179 !!(rtinfo->invflags & IP6T_RT_INV_TYP))); 179 !!(rtinfo->invflags & IP6T_RT_INV_TYP)));
180 180
181 if (ret && (rtinfo->flags & IP6T_RT_RES)) { 181 if (ret && (rtinfo->flags & IP6T_RT_RES)) {
182 u_int32_t *bp, _bitmap; 182 u_int32_t *rp, _reserved;
183 bp = skb_header_pointer(skb, 183 rp = skb_header_pointer(skb,
184 ptr + offsetof(struct rt0_hdr, bitmap), 184 ptr + offsetof(struct rt0_hdr, reserved),
185 sizeof(_bitmap), &_bitmap); 185 sizeof(_reserved), &_reserved);
186 186
187 ret = (*bp == 0); 187 ret = (*rp == 0);
188 } 188 }
189 189
190 DEBUGP("#%d ",rtinfo->addrnr); 190 DEBUGP("#%d ",rtinfo->addrnr);
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 9087273abf91..db3c708e546b 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -49,6 +49,9 @@ build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
49cmd = @$(if $($(quiet)cmd_$(1)),\ 49cmd = @$(if $($(quiet)cmd_$(1)),\
50 echo ' $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1)) 50 echo ' $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1))
51 51
52# Add $(obj)/ for paths that is not absolute
53objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
54
52### 55###
53# if_changed - execute command if any prerequisite is newer than 56# if_changed - execute command if any prerequisite is newer than
54# target, or command line has changed 57# target, or command line has changed
diff --git a/scripts/reference_discarded.pl b/scripts/reference_discarded.pl
index f04f62736851..c2d54148a91f 100644
--- a/scripts/reference_discarded.pl
+++ b/scripts/reference_discarded.pl
@@ -91,12 +91,7 @@ foreach $object (keys(%object)) {
91 $from !~ /\.exit\.data$/ && 91 $from !~ /\.exit\.data$/ &&
92 $from !~ /\.altinstructions$/ && 92 $from !~ /\.altinstructions$/ &&
93 $from !~ /\.pdr$/ && 93 $from !~ /\.pdr$/ &&
94 $from !~ /\.debug_info$/ && 94 $from !~ /\.debug_.*$/ &&
95 $from !~ /\.debug_aranges$/ &&
96 $from !~ /\.debug_ranges$/ &&
97 $from !~ /\.debug_line$/ &&
98 $from !~ /\.debug_frame$/ &&
99 $from !~ /\.debug_loc$/ &&
100 $from !~ /\.exitcall\.exit$/ && 95 $from !~ /\.exitcall\.exit$/ &&
101 $from !~ /\.eh_frame$/ && 96 $from !~ /\.eh_frame$/ &&
102 $from !~ /\.stab$/)) { 97 $from !~ /\.stab$/)) {
diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
index b62920eead3d..d64790bcd831 100644
--- a/sound/isa/sb/sb16_csp.c
+++ b/sound/isa/sb/sb16_csp.c
@@ -42,8 +42,6 @@ MODULE_LICENSE("GPL");
42#else 42#else
43#define CSP_HDR_VALUE(a,b,c,d) ((d) | ((c)<<8) | ((b)<<16) | ((a)<<24)) 43#define CSP_HDR_VALUE(a,b,c,d) ((d) | ((c)<<8) | ((b)<<16) | ((a)<<24))
44#endif 44#endif
45#define LE_SHORT(v) le16_to_cpu(v)
46#define LE_INT(v) le32_to_cpu(v)
47 45
48#define RIFF_HEADER CSP_HDR_VALUE('R', 'I', 'F', 'F') 46#define RIFF_HEADER CSP_HDR_VALUE('R', 'I', 'F', 'F')
49#define CSP__HEADER CSP_HDR_VALUE('C', 'S', 'P', ' ') 47#define CSP__HEADER CSP_HDR_VALUE('C', 'S', 'P', ' ')
@@ -56,20 +54,20 @@ MODULE_LICENSE("GPL");
56/* 54/*
57 * RIFF data format 55 * RIFF data format
58 */ 56 */
59typedef struct riff_header { 57struct riff_header {
60 __u32 name; 58 __u32 name;
61 __u32 len; 59 __u32 len;
62} riff_header_t; 60};
63 61
64typedef struct desc_header { 62struct desc_header {
65 riff_header_t info; 63 struct riff_header info;
66 __u16 func_nr; 64 __u16 func_nr;
67 __u16 VOC_type; 65 __u16 VOC_type;
68 __u16 flags_play_rec; 66 __u16 flags_play_rec;
69 __u16 flags_16bit_8bit; 67 __u16 flags_16bit_8bit;
70 __u16 flags_stereo_mono; 68 __u16 flags_stereo_mono;
71 __u16 flags_rates; 69 __u16 flags_rates;
72} desc_header_t; 70};
73 71
74/* 72/*
75 * prototypes 73 * prototypes
@@ -302,9 +300,9 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
302 unsigned char __user *data_end; 300 unsigned char __user *data_end;
303 unsigned short func_nr = 0; 301 unsigned short func_nr = 0;
304 302
305 riff_header_t file_h, item_h, code_h; 303 struct riff_header file_h, item_h, code_h;
306 __u32 item_type; 304 __u32 item_type;
307 desc_header_t funcdesc_h; 305 struct desc_header funcdesc_h;
308 306
309 unsigned long flags; 307 unsigned long flags;
310 int err; 308 int err;
@@ -316,12 +314,12 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
316 if (copy_from_user(&file_h, data_ptr, sizeof(file_h))) 314 if (copy_from_user(&file_h, data_ptr, sizeof(file_h)))
317 return -EFAULT; 315 return -EFAULT;
318 if ((file_h.name != RIFF_HEADER) || 316 if ((file_h.name != RIFF_HEADER) ||
319 (LE_INT(file_h.len) >= SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE - sizeof(file_h))) { 317 (le32_to_cpu(file_h.len) >= SNDRV_SB_CSP_MAX_MICROCODE_FILE_SIZE - sizeof(file_h))) {
320 snd_printd("%s: Invalid RIFF header\n", __FUNCTION__); 318 snd_printd("%s: Invalid RIFF header\n", __FUNCTION__);
321 return -EINVAL; 319 return -EINVAL;
322 } 320 }
323 data_ptr += sizeof(file_h); 321 data_ptr += sizeof(file_h);
324 data_end = data_ptr + LE_INT(file_h.len); 322 data_end = data_ptr + le32_to_cpu(file_h.len);
325 323
326 if (copy_from_user(&item_type, data_ptr, sizeof(item_type))) 324 if (copy_from_user(&item_type, data_ptr, sizeof(item_type)))
327 return -EFAULT; 325 return -EFAULT;
@@ -331,7 +329,7 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
331 } 329 }
332 data_ptr += sizeof (item_type); 330 data_ptr += sizeof (item_type);
333 331
334 for (; data_ptr < data_end; data_ptr += LE_INT(item_h.len)) { 332 for (; data_ptr < data_end; data_ptr += le32_to_cpu(item_h.len)) {
335 if (copy_from_user(&item_h, data_ptr, sizeof(item_h))) 333 if (copy_from_user(&item_h, data_ptr, sizeof(item_h)))
336 return -EFAULT; 334 return -EFAULT;
337 data_ptr += sizeof(item_h); 335 data_ptr += sizeof(item_h);
@@ -344,7 +342,7 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
344 case FUNC_HEADER: 342 case FUNC_HEADER:
345 if (copy_from_user(&funcdesc_h, data_ptr + sizeof(item_type), sizeof(funcdesc_h))) 343 if (copy_from_user(&funcdesc_h, data_ptr + sizeof(item_type), sizeof(funcdesc_h)))
346 return -EFAULT; 344 return -EFAULT;
347 func_nr = LE_SHORT(funcdesc_h.func_nr); 345 func_nr = le16_to_cpu(funcdesc_h.func_nr);
348 break; 346 break;
349 case CODE_HEADER: 347 case CODE_HEADER:
350 if (func_nr != info.func_req) 348 if (func_nr != info.func_req)
@@ -370,11 +368,11 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
370 if (code_h.name != INIT_HEADER) 368 if (code_h.name != INIT_HEADER)
371 break; 369 break;
372 data_ptr += sizeof(code_h); 370 data_ptr += sizeof(code_h);
373 err = snd_sb_csp_load_user(p, data_ptr, LE_INT(code_h.len), 371 err = snd_sb_csp_load_user(p, data_ptr, le32_to_cpu(code_h.len),
374 SNDRV_SB_CSP_LOAD_INITBLOCK); 372 SNDRV_SB_CSP_LOAD_INITBLOCK);
375 if (err) 373 if (err)
376 return err; 374 return err;
377 data_ptr += LE_INT(code_h.len); 375 data_ptr += le32_to_cpu(code_h.len);
378 } 376 }
379 /* main microcode block */ 377 /* main microcode block */
380 if (copy_from_user(&code_h, data_ptr, sizeof(code_h))) 378 if (copy_from_user(&code_h, data_ptr, sizeof(code_h)))
@@ -386,17 +384,17 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
386 } 384 }
387 data_ptr += sizeof(code_h); 385 data_ptr += sizeof(code_h);
388 err = snd_sb_csp_load_user(p, data_ptr, 386 err = snd_sb_csp_load_user(p, data_ptr,
389 LE_INT(code_h.len), 0); 387 le32_to_cpu(code_h.len), 0);
390 if (err) 388 if (err)
391 return err; 389 return err;
392 390
393 /* fill in codec header */ 391 /* fill in codec header */
394 strlcpy(p->codec_name, info.codec_name, sizeof(p->codec_name)); 392 strlcpy(p->codec_name, info.codec_name, sizeof(p->codec_name));
395 p->func_nr = func_nr; 393 p->func_nr = func_nr;
396 p->mode = LE_SHORT(funcdesc_h.flags_play_rec); 394 p->mode = le16_to_cpu(funcdesc_h.flags_play_rec);
397 switch (LE_SHORT(funcdesc_h.VOC_type)) { 395 switch (le16_to_cpu(funcdesc_h.VOC_type)) {
398 case 0x0001: /* QSound decoder */ 396 case 0x0001: /* QSound decoder */
399 if (LE_SHORT(funcdesc_h.flags_play_rec) == SNDRV_SB_CSP_MODE_DSP_WRITE) { 397 if (le16_to_cpu(funcdesc_h.flags_play_rec) == SNDRV_SB_CSP_MODE_DSP_WRITE) {
400 if (snd_sb_qsound_build(p) == 0) 398 if (snd_sb_qsound_build(p) == 0)
401 /* set QSound flag and clear all other mode flags */ 399 /* set QSound flag and clear all other mode flags */
402 p->mode = SNDRV_SB_CSP_MODE_QSOUND; 400 p->mode = SNDRV_SB_CSP_MODE_QSOUND;
@@ -426,12 +424,12 @@ static int snd_sb_csp_riff_load(snd_sb_csp_t * p, snd_sb_csp_microcode_t __user
426 p->mode = 0; 424 p->mode = 0;
427 snd_printd("%s: Unsupported CSP codec type: 0x%04x\n", 425 snd_printd("%s: Unsupported CSP codec type: 0x%04x\n",
428 __FUNCTION__, 426 __FUNCTION__,
429 LE_SHORT(funcdesc_h.VOC_type)); 427 le16_to_cpu(funcdesc_h.VOC_type));
430 return -EINVAL; 428 return -EINVAL;
431 } 429 }
432 p->acc_channels = LE_SHORT(funcdesc_h.flags_stereo_mono); 430 p->acc_channels = le16_to_cpu(funcdesc_h.flags_stereo_mono);
433 p->acc_width = LE_SHORT(funcdesc_h.flags_16bit_8bit); 431 p->acc_width = le16_to_cpu(funcdesc_h.flags_16bit_8bit);
434 p->acc_rates = LE_SHORT(funcdesc_h.flags_rates); 432 p->acc_rates = le16_to_cpu(funcdesc_h.flags_rates);
435 433
436 /* Decouple CSP from IRQ and DMAREQ lines */ 434 /* Decouple CSP from IRQ and DMAREQ lines */
437 spin_lock_irqsave(&p->chip->reg_lock, flags); 435 spin_lock_irqsave(&p->chip->reg_lock, flags);
diff --git a/sound/oss/skeleton.c b/sound/oss/skeleton.c
deleted file mode 100644
index 8fea783dd0cb..000000000000
--- a/sound/oss/skeleton.c
+++ /dev/null
@@ -1,219 +0,0 @@
1/*
2 * PCI sound skeleton example
3 *
4 * (c) 1998 Red Hat Software
5 *
6 * This software may be used and distributed according to the
7 * terms of the GNU General Public License, incorporated herein by
8 * reference.
9 *
10 * This example is designed to be built in the linux/drivers/sound
11 * directory as part of a kernel build. The example is modular only
12 * drop me a note once you have a working modular driver and want
13 * to integrate it with the main code.
14 * -- Alan <alan@redhat.com>
15 *
16 * This is a first draft. Please report any errors, corrections or
17 * improvements to me.
18 */
19
20#include <linux/module.h>
21#include <linux/delay.h>
22#include <linux/errno.h>
23#include <linux/fs.h>
24#include <linux/kernel.h>
25#include <linux/pci.h>
26
27#include <asm/io.h>
28
29#include "sound_config.h"
30
31/*
32 * Define our PCI vendor ID here
33 */
34
35#ifndef PCI_VENDOR_MYIDENT
36#define PCI_VENDOR_MYIDENT 0x125D
37
38/*
39 * PCI identity for the card.
40 */
41
42#define PCI_DEVICE_ID_MYIDENT_MYCARD1 0x1969
43#endif
44
45#define CARD_NAME "ExampleWave 3D Pro Ultra ThingyWotsit"
46
47#define MAX_CARDS 8
48
49/*
50 * Each address_info object holds the information about one of
51 * our card resources. In this case the MSS emulation of our
52 * ficticious card. Its used to manage and attach things.
53 */
54
55static struct address_info mss_data[MAX_CARDS];
56static int cards;
57
58/*
59 * Install the actual card. This is an example
60 */
61
62static int mycard_install(struct pci_dev *pcidev)
63{
64 int iobase;
65 int mssbase;
66 int mpubase;
67 u8 x;
68 u16 w;
69 u32 v;
70 int i;
71 int dma;
72
73 /*
74 * Our imaginary code has its I/O on PCI address 0, a
75 * MSS on PCI address 1 and an MPU on address 2
76 *
77 * For the example we will only initialise the MSS
78 */
79
80 iobase = pci_resource_start(pcidev, 0);
81 mssbase = pci_resource_start(pcidev, 1);
82 mpubase = pci_resource_start(pcidev, 2);
83
84 /*
85 * Reset the board
86 */
87
88 /*
89 * Wait for completion. udelay() waits in microseconds
90 */
91
92 udelay(100);
93
94 /*
95 * Ok card ready. Begin setup proper. You might for example
96 * load the firmware here
97 */
98
99 dma = card_specific_magic(ioaddr);
100
101 /*
102 * Turn on legacy mode (example), There are also byte and
103 * dword (32bit) PCI configuration function calls
104 */
105
106 pci_read_config_word(pcidev, 0x40, &w);
107 w&=~(1<<15); /* legacy decode on */
108 w|=(1<<14); /* Reserved write as 1 in this case */
109 w|=(1<<3)|(1<<1)|(1<<0); /* SB on , FM on, MPU on */
110 pci_write_config_word(pcidev, 0x40, w);
111
112 /*
113 * Let the user know we found his toy.
114 */
115
116 printk(KERN_INFO "Programmed "CARD_NAME" at 0x%X to legacy mode.\n",
117 iobase);
118
119 /*
120 * Now set it up the description of the card
121 */
122
123 mss_data[cards].io_base = mssbase;
124 mss_data[cards].irq = pcidev->irq;
125 mss_data[cards].dma = dma;
126
127 /*
128 * Check there is an MSS present
129 */
130
131 if(ad1848_detect(mssbase, NULL, mss_data[cards].osp)==0)
132 return 0;
133
134 /*
135 * Initialize it
136 */
137
138 mss_data[cards].slots[3] = ad1848_init("MyCard MSS 16bit",
139 mssbase,
140 mss_data[cards].irq,
141 mss_data[cards].dma,
142 mss_data[cards].dma,
143 0,
144 0,
145 THIS_MODULE);
146
147 cards++;
148 return 1;
149}
150
151
152/*
153 * This loop walks the PCI configuration database and finds where
154 * the sound cards are.
155 */
156
157int init_mycard(void)
158{
159 struct pci_dev *pcidev=NULL;
160 int count=0;
161
162 while((pcidev = pci_find_device(PCI_VENDOR_MYIDENT, PCI_DEVICE_ID_MYIDENT_MYCARD1, pcidev))!=NULL)
163 {
164 if (pci_enable_device(pcidev))
165 continue;
166 count+=mycard_install(pcidev);
167 if(count)
168 return 0;
169 if(count==MAX_CARDS)
170 break;
171 }
172
173 if(count==0)
174 return -ENODEV;
175 return 0;
176}
177
178/*
179 * This function is called when the user or kernel loads the
180 * module into memory.
181 */
182
183
184int init_module(void)
185{
186 if(init_mycard()<0)
187 {
188 printk(KERN_ERR "No "CARD_NAME" cards found.\n");
189 return -ENODEV;
190 }
191
192 return 0;
193}
194
195/*
196 * This is called when it is removed. It will only be removed
197 * when its use count is 0.
198 */
199
200void cleanup_module(void)
201{
202 for(i=0;i< cards; i++)
203 {
204 /*
205 * Free attached resources
206 */
207
208 ad1848_unload(mss_data[i].io_base,
209 mss_data[i].irq,
210 mss_data[i].dma,
211 mss_data[i].dma,
212 0);
213 /*
214 * And disconnect the device from the kernel
215 */
216 sound_unload_audiodevice(mss_data[i].slots[3]);
217 }
218}
219