Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 4 Jun 2007 20:31:39 +0000 (13:31 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 4 Jun 2007 20:31:39 +0000 (13:31 -0700)
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] JAZZ ESP and SUN ESP need SPI_ATTRS
  [SCSI] atari_NCR5380: update_timeout removal
  [SCSI] aacraid: fix shutdown handler to also disable interrupts.
  [SCSI] qla2xxx: fix timeout in qla2x00_down_timeout
  [SCSI] fix CONFIG_SCSI_WAIT_SCAN=m

361 files changed:
Documentation/BUG-HUNTING
Documentation/SubmitChecklist
Documentation/SubmittingPatches
Documentation/feature-removal-schedule.txt
Documentation/hrtimer/timer_stats.txt
Documentation/ia64/aliasing-test.c
Documentation/kernel-parameters.txt
Documentation/networking/xfrm_sysctl.txt [new file with mode: 0644]
Documentation/sound/alsa/ALSA-Configuration.txt
Documentation/thinkpad-acpi.txt
Documentation/vm/slub.txt
Documentation/watchdog/pcwd-watchdog.txt
Documentation/watchdog/watchdog-api.txt
Documentation/watchdog/watchdog.txt [deleted file]
Documentation/watchdog/wdt.txt [new file with mode: 0644]
MAINTAINERS
arch/alpha/Kconfig
arch/alpha/boot/tools/mkbb.c
arch/alpha/kernel/console.c
arch/alpha/kernel/core_marvel.c
arch/alpha/kernel/core_titan.c
arch/alpha/kernel/core_tsunami.c
arch/alpha/kernel/entry.S
arch/alpha/kernel/pci_iommu.c
arch/alpha/kernel/proto.h
arch/alpha/kernel/setup.c
arch/alpha/kernel/signal.c
arch/alpha/kernel/sys_dp264.c
arch/alpha/kernel/sys_marvel.c
arch/alpha/kernel/sys_titan.c
arch/alpha/kernel/systbls.S
arch/alpha/lib/Makefile
arch/alpha/lib/fls.c [new file with mode: 0644]
arch/arm/kernel/armksyms.c
arch/arm/kernel/stacktrace.c
arch/arm/mach-at91/board-dk.c
arch/arm/mach-at91/board-kb9202.c
arch/arm/mach-at91/board-sam9261ek.c
arch/arm/mach-at91/board-sam9263ek.c
arch/arm/mach-at91/board-sam9rlek.c
arch/arm/mach-footbridge/cats-pci.c
arch/arm/mach-imx/generic.c
arch/arm/mach-ixp2000/ixdp2400.c
arch/arm/mach-ixp2000/ixdp2800.c
arch/arm/mach-ixp2000/ixdp2x00.c
arch/arm/mach-ixp23xx/ixdp2351.c
arch/arm/mach-ixp23xx/pci.c
arch/arm/mach-ixp23xx/roadrunner.c
arch/arm/mach-ixp4xx/Kconfig
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-ixp4xx/coyote-pci.c
arch/arm/mach-ixp4xx/dsmg600-setup.c
arch/arm/mach-ixp4xx/ixdpg425-pci.c
arch/arm/mach-ixp4xx/nas100d-setup.c
arch/arm/mach-ixp4xx/nslu2-setup.c
arch/arm/mach-s3c2410/bast.h [deleted file]
arch/arm/mach-s3c2410/mach-amlm5900.c
arch/arm/mach-s3c2412/s3c2412.c
arch/arm/mach-s3c2443/clock.c
arch/arm/mach-sa1100/neponset.c
arch/arm/mm/Kconfig
arch/arm/mm/Makefile
arch/arm/mm/alignment.c
arch/arm/mm/proc-v7.S
arch/arm/mm/tlb-v7.S [new file with mode: 0644]
arch/arm/nwfpe/softfloat.h
arch/arm/oprofile/op_model_mpcore.c
arch/h8300/kernel/sys_h8300.c
arch/h8300/kernel/traps.c
arch/i386/kernel/cpu/mtrr/main.c
arch/i386/kernel/microcode.c
arch/i386/kernel/reboot.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/vmi.c
arch/i386/oprofile/nmi_int.c
arch/i386/pci/fixup.c
arch/m68k/Kconfig
arch/m68k/Makefile
arch/m68k/kernel/Makefile
arch/m68k/kernel/module.c
arch/m68k/kernel/module.lds [new file with mode: 0644]
arch/m68k/kernel/setup.c
arch/m68k/kernel/vmlinux-std.lds
arch/m68k/kernel/vmlinux-sun3.lds
arch/m68k/mac/debug.c
arch/m68k/mm/init.c
arch/m68k/mm/memory.c
arch/m68k/mm/motorola.c
arch/m68k/sun3/config.c
arch/mips/jmr3927/rbhma3100/kgdb_io.c
arch/mips/pci/pci-ocelot.c
arch/powerpc/Makefile
arch/powerpc/boot/Makefile
arch/powerpc/boot/wrapper
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/ptrace.c
arch/powerpc/platforms/pasemi/idle.c
arch/powerpc/platforms/ps3/interrupt.c
arch/powerpc/platforms/pseries/xics.c
arch/ppc/syslib/ibm_ocp.c
arch/s390/hypfs/hypfs_diag.c
arch/s390/kernel/debug.c
arch/s390/kernel/setup.c
arch/s390/kernel/smp.c
arch/sh/Makefile
arch/sh/drivers/dma/dma-api.c
arch/sh/kernel/cf-enabler.c
arch/sh/kernel/cpu/sh3/entry.S
arch/sh/kernel/cpu/sh4/probe.c
arch/sh/kernel/smp.c
arch/sh/kernel/timers/timer.c
arch/sh/kernel/vsyscall/vsyscall.c
arch/sparc/lib/atomic32.c
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/vmlinux.lds.S
arch/x86_64/mm/init.c
crypto/cryptd.c
drivers/acpi/asus_acpi.c
drivers/acpi/numa.c
drivers/acpi/osl.c
drivers/acpi/tables/tbinstal.c
drivers/acpi/thermal.c
drivers/acpi/toshiba_acpi.c
drivers/acpi/utilities/utcopy.c
drivers/acpi/utilities/uteval.c
drivers/acpi/utilities/utobject.c
drivers/acpi/utilities/utxface.c
drivers/ata/Kconfig
drivers/ata/libata-core.c
drivers/atm/firestream.c
drivers/auxdisplay/Kconfig
drivers/auxdisplay/cfag12864bfb.c
drivers/char/drm/drm_drawable.c
drivers/char/drm/drm_pciids.h
drivers/char/drm/i915_irq.c
drivers/char/n_tty.c
drivers/char/tty_io.c
drivers/char/watchdog/Kconfig
drivers/char/watchdog/Makefile
drivers/char/watchdog/ixp2000_wdt.c
drivers/char/watchdog/ks8695_wdt.c [new file with mode: 0644]
drivers/firewire/fw-card.c
drivers/firewire/fw-cdev.c
drivers/firewire/fw-device.h
drivers/firewire/fw-ohci.c
drivers/firewire/fw-sbp2.c
drivers/i2c/busses/i2c-pxa.c
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.h
drivers/ieee1394/sbp2.c
drivers/input/evdev.c
drivers/input/joydev.c
drivers/input/joystick/db9.c
drivers/input/mouse/Kconfig
drivers/input/mousedev.c
drivers/input/serio/sa1111ps2.c
drivers/input/tsdev.c
drivers/isdn/Kconfig
drivers/isdn/hardware/eicon/diva_didd.c
drivers/isdn/hardware/eicon/divasfunc.c
drivers/isdn/i4l/isdn_tty.c
drivers/kvm/vmx.c
drivers/macintosh/Kconfig
drivers/mfd/ucb1x00-ts.c
drivers/misc/thinkpad_acpi.c
drivers/misc/thinkpad_acpi.h
drivers/misc/tifm_7xx1.c
drivers/mtd/devices/pmc551.c
drivers/mtd/nand/autcpu12.c
drivers/mtd/nand/ppchameleonevb.c
drivers/net/8139cp.c
drivers/net/Kconfig
drivers/net/acenic.c
drivers/net/acenic.h
drivers/net/amd8111e.c
drivers/net/amd8111e.h
drivers/net/atl1/atl1_main.c
drivers/net/bnx2.c
drivers/net/cassini.c
drivers/net/chelsio/cxgb2.c
drivers/net/cxgb3/cxgb3_main.c
drivers/net/defxx.c
drivers/net/e1000/e1000_main.c
drivers/net/ehea/ehea.h
drivers/net/ehea/ehea_main.c
drivers/net/fec_8xx/fec_main.c
drivers/net/forcedeth.c
drivers/net/gianfar.c
drivers/net/hp100.c
drivers/net/myri10ge/myri10ge.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/ns83820.c
drivers/net/qla3xxx.c
drivers/net/r8169.c
drivers/net/s2io.c
drivers/net/skfp/smt.c
drivers/net/sky2.c
drivers/net/sky2.h
drivers/net/smc91x.h
drivers/net/spider_net.c
drivers/net/tg3.c
drivers/net/typhoon.c
drivers/net/wireless/hostap/hostap_80211_tx.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/pci/msi.c
drivers/pci/quirks.c
drivers/pci/search.c
drivers/pcmcia/at91_cf.c
drivers/rtc/rtc-cmos.c
drivers/s390/block/dasd_eer.c
drivers/s390/char/raw3270.c
drivers/s390/cio/device.c
drivers/s390/cio/device_fsm.c
drivers/sbus/char/flash.c
drivers/scsi/NCR5380.c
drivers/scsi/aic7xxx/aic79xx_core.c
drivers/serial/amba-pl010.c
drivers/serial/amba-pl011.c
drivers/serial/serial_ks8695.c
drivers/spi/atmel_spi.c
drivers/spi/spi.c
drivers/spi/spi_imx.c
drivers/video/Kconfig
drivers/video/arkfb.c
drivers/video/console/fbcon.h
drivers/video/neofb.c
drivers/video/pm3fb.c
drivers/video/skeletonfb.c
drivers/video/vt8623fb.c
fs/afs/internal.h
fs/ext4/balloc.c
fs/ext4/extents.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/super.c
fs/ioctl.c
fs/nfs/direct.c
fs/ntfs/inode.c
fs/ramfs/file-nommu.c
fs/udf/inode.c
fs/udf/super.c
fs/xfs/linux-2.6/xfs_aops.c
include/acpi/acpi_numa.h
include/acpi/acpiosxf.h
include/acpi/acpixf.h
include/acpi/acutils.h
include/asm-alpha/bitops.h
include/asm-alpha/core_t2.h
include/asm-alpha/core_titan.h
include/asm-alpha/core_tsunami.h
include/asm-alpha/core_wildfire.h
include/asm-alpha/thread_info.h
include/asm-alpha/unistd.h
include/asm-alpha/vga.h
include/asm-arm/arch-ixp4xx/nas100d.h
include/asm-arm/arch-ixp4xx/nslu2.h
include/asm-arm/arch-ixp4xx/platform.h
include/asm-arm/arch-s3c2410/map.h
include/asm-arm/arch-s3c2410/regs-gpioj.h
include/asm-arm/arch-s3c2410/regs-s3c2412.h [new file with mode: 0644]
include/asm-arm/ioctls.h
include/asm-arm/mach/arch.h
include/asm-arm/setup.h
include/asm-arm/termbits.h
include/asm-arm/termios.h
include/asm-arm/tlbflush.h
include/asm-arm26/setup.h
include/asm-generic/vmlinux.lds.h
include/asm-h8300/processor.h
include/asm-m68k/mmzone.h [new file with mode: 0644]
include/asm-m68k/module.h
include/asm-m68k/motorola_pgtable.h
include/asm-m68k/page.h
include/asm-m68k/pgalloc.h
include/asm-m68k/pgtable.h
include/asm-m68k/sun3_pgtable.h
include/asm-m68k/virtconvert.h
include/asm-powerpc/pgalloc-64.h
include/asm-powerpc/tlb.h
include/asm-sh/cpu-sh4/freq.h
include/asm-sh/dma.h
include/asm-sh/io.h
include/asm-sh/smp.h
include/asm-sh/spinlock.h
include/asm-sh/spinlock_types.h
include/asm-sparc64/hypervisor.h
include/linux/Kbuild
include/linux/bootmem.h
include/linux/errno.h
include/linux/ext4_fs.h
include/linux/ext4_fs_extents.h
include/linux/ext4_fs_i.h
include/linux/fb.h
include/linux/firewire-cdev.h
include/linux/ipv6.h
include/linux/netdevice.h
include/linux/pci_ids.h
include/linux/serial_core.h
include/net/af_unix.h
include/net/sock.h
include/net/tcp.h
include/net/xfrm.h
include/sound/version.h
kernel/futex_compat.c
kernel/kallsyms.c
kernel/time/timer_stats.c
lib/Kconfig.debug
mm/memory_hotplug.c
mm/page_alloc.c
mm/slub.c
mm/sparse.c
net/8021q/vlan.c
net/bridge/br_fdb.c
net/bridge/br_stp.c
net/bridge/br_stp_timer.c
net/core/sock.c
net/core/sysctl_net_core.c
net/core/utils.c
net/dccp/probe.c
net/ieee80211/ieee80211_module.c
net/ieee80211/softmac/ieee80211softmac_module.c
net/ipv4/datagram.c
net/ipv4/fib_frontend.c
net/ipv4/icmp.c
net/ipv4/inet_connection_sock.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_probe.c
net/ipv4/tcp_timer.c
net/ipv4/udp.c
net/ipv4/xfrm4_input.c
net/ipv4/xfrm4_mode_tunnel.c
net/ipv6/ah6.c
net/ipv6/ip6_fib.c
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/ipv6/xfrm6_input.c
net/ipv6/xfrm6_mode_tunnel.c
net/mac80211/ieee80211.c
net/mac80211/ieee80211_sta.c
net/packet/af_packet.c
net/sched/act_pedit.c
net/sched/sch_generic.c
net/sctp/debug.c
net/sctp/sm_statetable.c
net/unix/af_unix.c
net/wanrouter/wanmain.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
scripts/checkpatch.pl [new file with mode: 0644]
sound/arm/sa11xx-uda1341.c
sound/pci/ali5451/ali5451.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_local.h
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_si3054.c
sound/pci/hda/patch_sigmatel.c
sound/soc/s3c24xx/s3c24xx-pcm.c

index 65b97e1dbf70cabf7a92dee53831f191f16b4015..35f5bd243336aeb1927f42483e26fa7586bcb205 100644 (file)
@@ -191,6 +191,30 @@ e.g. crash dump output as shown by Dave Miller.
 >        mov        0x8(%ebp), %ebx         ! %ebx = skb->sk
 >        mov        0x13c(%ebx), %eax       ! %eax = inet_sk(sk)->opt
 
+In addition, you can use GDB to figure out the exact file and line
+number of the OOPS from the vmlinux file. If you have
+CONFIG_DEBUG_INFO enabled, you can simply copy the EIP value from the
+OOPS:
+
+ EIP:    0060:[<c021e50e>]    Not tainted VLI
+
+And use GDB to translate that to human-readable form:
+
+  gdb vmlinux
+  (gdb) l *0xc021e50e
+
+If you don't have CONFIG_DEBUG_INFO enabled, you use the function
+offset from the OOPS:
+
+ EIP is at vt_ioctl+0xda8/0x1482
+
+And recompile the kernel with CONFIG_DEBUG_INFO enabled:
+
+  make vmlinux
+  gdb vmlinux
+  (gdb) p vt_ioctl
+  (gdb) l *(0x<address of vt_ioctl> + 0xda8)
+
 Another very useful option of the Kernel Hacking section in menuconfig is
 Debug memory allocations. This will help you see whether data has been
 initialised and not set before use etc. To see the values that get assigned
index 3af3e65cf43b54ccfb150824e9338b8567234812..6ebffb57e3dbf326c6db594da4206c2f30bf1050 100644 (file)
@@ -84,3 +84,9 @@ kernel patches.
 24: Avoid whitespace damage such as indenting with spaces or whitespace
     at the end of lines.  You can test this by feeding the patch to
     "git apply --check --whitespace=error-all"
+
+25: Check your patch for general style as detailed in
+    Documentation/CodingStyle.  Check for trivial violations with the
+    patch style checker prior to submission (scripts/checkpatch.pl).
+    You should be able to justify all violations that remain in
+    your patch.
index a417b25fb1aa40f62234c222db0a4be1cfaa938d..d91125ab6f49253fece7bc6e056cd248ec7812ec 100644 (file)
@@ -118,7 +118,20 @@ then only post say 15 or so at a time and wait for review and integration.
 
 
 
-4) Select e-mail destination.
+4) Style check your changes.
+
+Check your patch for basic style violations, details of which can be
+found in Documentation/CodingStyle.  Failure to do so simply wastes
+the reviewers time and will get your patch rejected, probabally
+without even being read.
+
+At a minimum you should check your patches with the patch style
+checker prior to submission (scripts/patchcheck.pl).  You should
+be able to justify all violations that remain in your patch.
+
+
+
+5) Select e-mail destination.
 
 Look through the MAINTAINERS file and the source code, and determine
 if your change applies to a specific subsystem of the kernel, with
@@ -146,7 +159,7 @@ discussed should the patch then be submitted to Linus.
 
 
 
-5) Select your CC (e-mail carbon copy) list.
+6) Select your CC (e-mail carbon copy) list.
 
 Unless you have a reason NOT to do so, CC linux-kernel@vger.kernel.org.
 
@@ -187,8 +200,7 @@ URL: <http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/>
 
 
 
-
-6) No MIME, no links, no compression, no attachments.  Just plain text.
+7) No MIME, no links, no compression, no attachments.  Just plain text.
 
 Linus and other kernel developers need to be able to read and comment
 on the changes you are submitting.  It is important for a kernel
@@ -223,9 +235,9 @@ pref("mailnews.display.disable_format_flowed_support", true);
 
 
 
-7) E-mail size.
+8) E-mail size.
 
-When sending patches to Linus, always follow step #6.
+When sending patches to Linus, always follow step #7.
 
 Large changes are not appropriate for mailing lists, and some
 maintainers.  If your patch, uncompressed, exceeds 40 kB in size,
@@ -234,7 +246,7 @@ server, and provide instead a URL (link) pointing to your patch.
 
 
 
-8) Name your kernel version.
+9) Name your kernel version.
 
 It is important to note, either in the subject line or in the patch
 description, the kernel version to which this patch applies.
@@ -244,7 +256,7 @@ Linus will not apply it.
 
 
 
-9) Don't get discouraged.  Re-submit.
+10) Don't get discouraged.  Re-submit.
 
 After you have submitted your change, be patient and wait.  If Linus
 likes your change and applies it, it will appear in the next version
@@ -270,7 +282,7 @@ When in doubt, solicit comments on linux-kernel mailing list.
 
 
 
-10) Include PATCH in the subject
+11) Include PATCH in the subject
 
 Due to high e-mail traffic to Linus, and to linux-kernel, it is common
 convention to prefix your subject line with [PATCH].  This lets Linus
@@ -279,7 +291,7 @@ e-mail discussions.
 
 
 
-11) Sign your work
+12) Sign your work
 
 To improve tracking of who did what, especially with patches that can
 percolate to their final resting place in the kernel through several
@@ -328,7 +340,8 @@ now, but you can do this to mark internal company procedures or just
 point out some special detail about the sign-off. 
 
 
-12) The canonical patch format
+
+13) The canonical patch format
 
 The canonical patch subject line is:
 
@@ -427,6 +440,10 @@ section Linus Computer Science 101.
 Nuff said.  If your code deviates too much from this, it is likely
 to be rejected without further review, and without comment.
 
+Check your patches with the patch style checker prior to submission
+(scripts/checkpatch.pl).  You should be able to justify all
+violations that remain in your patch.
+
 
 
 2) #ifdefs are ugly
index 2d7ea85075bab3d33d6402a57371bfdf0745f471..49ae1ea9e868d9d0803e8d2711748be45cc1a546 100644 (file)
@@ -70,6 +70,7 @@ Who:  David Miller <davem@davemloft.net>
 
 What:  Video4Linux API 1 ioctls and video_decoder.h from Video devices.
 When:  December 2006
+Files: include/linux/video_decoder.h
 Why:   V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
        series. The old API have lots of drawbacks and don't provide enough
        means to work with all video and audio standards. The newer API is
index 27f782e3593f2f86047fbc2e74e387710f3a0f9a..22b0814d0ad0927024de028303a4af9cce0afc11 100644 (file)
@@ -2,9 +2,10 @@ timer_stats - timer usage statistics
 ------------------------------------
 
 timer_stats is a debugging facility to make the timer (ab)usage in a Linux
-system visible to kernel and userspace developers. It is not intended for
-production usage as it adds significant overhead to the (hr)timer code and the
-(hr)timer data structures.
+system visible to kernel and userspace developers. If enabled in the config
+but not used it has almost zero runtime overhead, and a relatively small
+data structure overhead. Even if collection is enabled runtime all the
+locking is per-CPU and lookup is hashed.
 
 timer_stats should be used by kernel and userspace developers to verify that
 their code does not make unduly use of timers. This helps to avoid unnecessary
index 3153167b41c3c39b999822df7f283aa1dd686d9e..d485256ee1cead1c71b20610c0db3e458cbd10db 100644 (file)
@@ -197,7 +197,7 @@ skip:
        return rc;
 }
 
-main()
+int main()
 {
        int rc;
 
index aae2282600ca411320cd611c3830d260d43713eb..5d0283cd3a81997fde0eaf901417ac0de33bf16b 100644 (file)
@@ -170,7 +170,10 @@ and is between 256 and 4096 characters. It is defined in the file
        acpi_os_name=   [HW,ACPI] Tell ACPI BIOS the name of the OS
                        Format: To spoof as Windows 98: ="Microsoft Windows"
 
-       acpi_osi=       [HW,ACPI] empty param disables _OSI
+       acpi_osi=       [HW,ACPI] Modify list of supported OS interface strings
+                       acpi_osi="string1"      # add string1 -- only one string
+                       acpi_osi="!string2"     # remove built-in string2
+                       acpi_osi=               # disable all strings
 
        acpi_serialize  [HW,ACPI] force serialization of AML methods
 
@@ -1132,9 +1135,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        when set.
                        Format: <int>
 
-       noaliencache    [MM, NUMA] Disables the allcoation of alien caches in
-                       the slab allocator.  Saves per-node memory, but will
-                       impact performance on real NUMA hardware.
+       noaliencache    [MM, NUMA, SLAB] Disables the allocation of alien
+                       caches in the slab allocator.  Saves per-node memory,
+                       but will impact performance.
 
        noalign         [KNL,ARM]
 
@@ -1613,6 +1616,37 @@ and is between 256 and 4096 characters. It is defined in the file
 
        slram=          [HW,MTD]
 
+       slub_debug      [MM, SLUB]
+                       Enabling slub_debug allows one to determine the culprit
+                       if slab objects become corrupted. Enabling slub_debug
+                       creates guard zones around objects and poisons objects
+                       when not in use. Also tracks the last alloc / free.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_max_order= [MM, SLUB]
+                       Determines the maximum allowed order for slabs. Setting
+                       this too high may cause fragmentation.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_min_objects=       [MM, SLUB]
+                       The minimum objects per slab. SLUB will increase the
+                       slab order up to slub_max_order to generate a
+                       sufficiently big slab to satisfy the number of objects.
+                       The higher the number of objects the smaller the overhead
+                       of tracking slabs.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_min_order= [MM, SLUB]
+                       Determines the mininum page order for slabs. Must be
+                       lower than slub_max_order
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_nomerge    [MM, SLUB]
+                       Disable merging of slabs of similar size. May be
+                       necessary if there is some reason to distinguish
+                       allocs to different slabs.
+                       For more information see Documentation/vm/slub.txt.
+
        smart2=         [HW]
                        Format: <io1>[,<io2>[,...,<io8>]]
 
diff --git a/Documentation/networking/xfrm_sysctl.txt b/Documentation/networking/xfrm_sysctl.txt
new file mode 100644 (file)
index 0000000..5bbd167
--- /dev/null
@@ -0,0 +1,4 @@
+/proc/sys/net/core/xfrm_* Variables:
+
+xfrm_acq_expires - INTEGER
+       default 30 - hard timeout in seconds for acquire requests
index 57b878cc393c20ebd04c7713f83e3c249ae83db3..355ff0a2bb7c5a1cdc9862c4f827e9e49497c165 100644 (file)
@@ -917,6 +917,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          ref           Reference board, base config
          m2-2          Some Gateway MX series laptops
          m6            Some Gateway NX series laptops
+         pa6           Gateway NX860 series
 
        STAC9227/9228/9229/927x
          ref           Reference board
index 2d4803359a043e228292d9f8e82eeffc14ff454b..9e6b94face4bb2a11f0ea743246f0b85adbbd105 100644 (file)
@@ -138,7 +138,7 @@ Hot keys
 --------
 
 procfs: /proc/acpi/ibm/hotkey
-sysfs device attribute: hotkey/*
+sysfs device attribute: hotkey_*
 
 Without this driver, only the Fn-F4 key (sleep button) generates an
 ACPI event. With the driver loaded, the hotkey feature enabled and the
@@ -196,10 +196,7 @@ The following commands can be written to the /proc/acpi/ibm/hotkey file:
 
 sysfs notes:
 
-       The hot keys attributes are in a hotkey/ subdirectory off the
-       thinkpad device.
-
-       bios_enabled:
+       hotkey_bios_enabled:
                Returns the status of the hot keys feature when
                thinkpad-acpi was loaded.  Upon module unload, the hot
                key feature status will be restored to this value.
@@ -207,19 +204,19 @@ sysfs notes:
                0: hot keys were disabled
                1: hot keys were enabled
 
-       bios_mask:
+       hotkey_bios_mask:
                Returns the hot keys mask when thinkpad-acpi was loaded.
                Upon module unload, the hot keys mask will be restored
                to this value.
 
-       enable:
+       hotkey_enable:
                Enables/disables the hot keys feature, and reports
                current status of the hot keys feature.
 
                0: disables the hot keys feature / feature disabled
                1: enables the hot keys feature / feature enabled
 
-       mask:
+       hotkey_mask:
                bit mask to enable ACPI event generation for each hot
                key (see above).  Returns the current status of the hot
                keys mask, and allows one to modify it.
@@ -229,7 +226,7 @@ Bluetooth
 ---------
 
 procfs: /proc/acpi/ibm/bluetooth
-sysfs device attribute: bluetooth/enable
+sysfs device attribute: bluetooth_enable
 
 This feature shows the presence and current state of a ThinkPad
 Bluetooth device in the internal ThinkPad CDC slot.
@@ -244,7 +241,7 @@ If Bluetooth is installed, the following commands can be used:
 Sysfs notes:
 
        If the Bluetooth CDC card is installed, it can be enabled /
-       disabled through the "bluetooth/enable" thinkpad-acpi device
+       disabled through the "bluetooth_enable" thinkpad-acpi device
        attribute, and its current status can also be queried.
 
        enable:
@@ -252,7 +249,7 @@ Sysfs notes:
                1: enables Bluetooth / Bluetooth is enabled.
 
        Note: this interface will be probably be superseeded by the
-       generic rfkill class.
+       generic rfkill class, so it is NOT to be considered stable yet.
 
 Video output control -- /proc/acpi/ibm/video
 --------------------------------------------
@@ -898,7 +895,7 @@ EXPERIMENTAL: WAN
 -----------------
 
 procfs: /proc/acpi/ibm/wan
-sysfs device attribute: wwan/enable
+sysfs device attribute: wwan_enable
 
 This feature is marked EXPERIMENTAL because the implementation
 directly accesses hardware registers and may not work as expected. USE
@@ -921,7 +918,7 @@ If the W-WAN card is installed, the following commands can be used:
 Sysfs notes:
 
        If the W-WAN card is installed, it can be enabled /
-       disabled through the "wwan/enable" thinkpad-acpi device
+       disabled through the "wwan_enable" thinkpad-acpi device
        attribute, and its current status can also be queried.
 
        enable:
@@ -929,7 +926,7 @@ Sysfs notes:
                1: enables WWAN card / WWAN card is enabled.
 
        Note: this interface will be probably be superseeded by the
-       generic rfkill class.
+       generic rfkill class, so it is NOT to be considered stable yet.
 
 Multiple Commands, Module Parameters
 ------------------------------------
index 727c8d81aeaf01da2ea02a5a9986aeff959cc003..1523320abd87e6fdfcf2d099869a54f2d3deea3c 100644 (file)
@@ -1,13 +1,9 @@
 Short users guide for SLUB
 --------------------------
 
-First of all slub should transparently replace SLAB. If you enable
-SLUB then everything should work the same (Note the word "should".
-There is likely not much value in that word at this point).
-
 The basic philosophy of SLUB is very different from SLAB. SLAB
 requires rebuilding the kernel to activate debug options for all
-SLABS. SLUB always includes full debugging but its off by default.
+slab caches. SLUB always includes full debugging but it is off by default.
 SLUB can enable debugging only for selected slabs in order to avoid
 an impact on overall system performance which may make a bug more
 difficult to find.
@@ -76,13 +72,28 @@ of objects.
 Careful with tracing: It may spew out lots of information and never stop if
 used on the wrong slab.
 
-SLAB Merging
+Slab merging
 ------------
 
-If no debugging is specified then SLUB may merge similar slabs together
+If no debug options are specified then SLUB may merge similar slabs together
 in order to reduce overhead and increase cache hotness of objects.
 slabinfo -a displays which slabs were merged together.
 
+Slab validation
+---------------
+
+SLUB can validate all object if the kernel was booted with slub_debug. In
+order to do so you must have the slabinfo tool. Then you can do
+
+slabinfo -v
+
+which will test all objects. Output will be generated to the syslog.
+
+This also works in a more limited way if boot was without slab debug.
+In that case slabinfo -v simply tests all reachable objects. Usually
+these are in the cpu slabs and the partial slabs. Full slabs are not
+tracked by SLUB in a non debug situation.
+
 Getting more performance
 ------------------------
 
@@ -91,9 +102,9 @@ list_lock once in a while to deal with partial slabs. That overhead is
 governed by the order of the allocation for each slab. The allocations
 can be influenced by kernel parameters:
 
-slub_min_objects=x             (default 8)
+slub_min_objects=x             (default 4)
 slub_min_order=x               (default 0)
-slub_max_order=x               (default 4)
+slub_max_order=x               (default 1)
 
 slub_min_objects allows to specify how many objects must at least fit
 into one slab in order for the allocation order to be acceptable.
@@ -109,5 +120,107 @@ longer be checked. This is useful to avoid SLUB trying to generate
 super large order pages to fit slub_min_objects of a slab cache with
 large object sizes into one high order page.
 
-
-Christoph Lameter, <clameter@sgi.com>, April 10, 2007
+SLUB Debug output
+-----------------
+
+Here is a sample of slub debug output:
+
+*** SLUB kmalloc-8: Redzone Active@0xc90f6d20 slab 0xc528c530 offset=3360 flags=0x400000c3 inuse=61 freelist=0xc90f6d58
+  Bytes b4 0xc90f6d10:  00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
+    Object 0xc90f6d20:  31 30 31 39 2e 30 30 35                         1019.005
+   Redzone 0xc90f6d28:  00 cc cc cc                                     .
+FreePointer 0xc90f6d2c -> 0xc90f6d58
+Last alloc: get_modalias+0x61/0xf5 jiffies_ago=53 cpu=1 pid=554
+Filler 0xc90f6d50:  5a 5a 5a 5a 5a 5a 5a 5a                         ZZZZZZZZ
+  [<c010523d>] dump_trace+0x63/0x1eb
+  [<c01053df>] show_trace_log_lvl+0x1a/0x2f
+  [<c010601d>] show_trace+0x12/0x14
+  [<c0106035>] dump_stack+0x16/0x18
+  [<c017e0fa>] object_err+0x143/0x14b
+  [<c017e2cc>] check_object+0x66/0x234
+  [<c017eb43>] __slab_free+0x239/0x384
+  [<c017f446>] kfree+0xa6/0xc6
+  [<c02e2335>] get_modalias+0xb9/0xf5
+  [<c02e23b7>] dmi_dev_uevent+0x27/0x3c
+  [<c027866a>] dev_uevent+0x1ad/0x1da
+  [<c0205024>] kobject_uevent_env+0x20a/0x45b
+  [<c020527f>] kobject_uevent+0xa/0xf
+  [<c02779f1>] store_uevent+0x4f/0x58
+  [<c027758e>] dev_attr_store+0x29/0x2f
+  [<c01bec4f>] sysfs_write_file+0x16e/0x19c
+  [<c0183ba7>] vfs_write+0xd1/0x15a
+  [<c01841d7>] sys_write+0x3d/0x72
+  [<c0104112>] sysenter_past_esp+0x5f/0x99
+  [<b7f7b410>] 0xb7f7b410
+  =======================
+@@@ SLUB kmalloc-8: Restoring redzone (0xcc) from 0xc90f6d28-0xc90f6d2b
+
+
+
+If SLUB encounters a corrupted object then it will perform the following
+actions:
+
+1. Isolation and report of the issue
+
+This will be a message in the system log starting with
+
+*** SLUB <slab cache affected>: <What went wrong>@<object address>
+offset=<offset of object into slab> flags=<slabflags>
+inuse=<objects in use in this slab> freelist=<first free object in slab>
+
+2. Report on how the problem was dealt with in order to ensure the continued
+operation of the system.
+
+These are messages in the system log beginning with
+
+@@@ SLUB <slab cache affected>: <corrective action taken>
+
+
+In the above sample SLUB found that the Redzone of an active object has
+been overwritten. Here a string of 8 characters was written into a slab that
+has the length of 8 characters. However, a 8 character string needs a
+terminating 0. That zero has overwritten the first byte of the Redzone field.
+After reporting the details of the issue encountered the @@@ SLUB message
+tell us that SLUB has restored the redzone to its proper value and then
+system operations continue.
+
+Various types of lines can follow the @@@ SLUB line:
+
+Bytes b4 <address> : <bytes>
+       Show a few bytes before the object where the problem was detected.
+       Can be useful if the corruption does not stop with the start of the
+       object.
+
+Object <address> : <bytes>
+       The bytes of the object. If the object is inactive then the bytes
+       typically contain poisoning values. Any non-poison value shows a
+       corruption by a write after free.
+
+Redzone <address> : <bytes>
+       The redzone following the object. The redzone is used to detect
+       writes after the object. All bytes should always have the same
+       value. If there is any deviation then it is due to a write after
+       the object boundary.
+
+Freepointer
+       The pointer to the next free object in the slab. May become
+       corrupted if overwriting continues after the red zone.
+
+Last alloc:
+Last free:
+       Shows the address from which the object was allocated/freed last.
+       We note the pid, the time and the CPU that did so. This is usually
+       the most useful information to figure out where things went wrong.
+       Here get_modalias() did an kmalloc(8) instead of a kmalloc(9).
+
+Filler <address> : <bytes>
+       Unused data to fill up the space in order to get the next object
+       properly aligned. In the debug case we make sure that there are
+       at least 4 bytes of filler. This allow for the detection of writes
+       before the object.
+
+Following the filler will be a stackdump. That stackdump describes the
+location where the error was detected. The cause of the corruption is more
+likely to be found by looking at the information about the last alloc / free.
+
+Christoph Lameter, <clameter@sgi.com>, May 23, 2007
index d9ee6336c1d49e6cf262d814251741cd340a1036..4f68052395c0323278caa14d003a0924695e0887 100644 (file)
@@ -1,3 +1,5 @@
+Last reviewed: 10/05/2007
+
                      Berkshire Products PC Watchdog Card
                    Support for ISA Cards  Revision A and C
            Documentation and Driver by Ken Hollis <kenji@bitgate.com>
@@ -14,8 +16,8 @@
 
  The Watchdog Driver will automatically find your watchdog card, and will
  attach a running driver for use with that card.  After the watchdog
- drivers have initialized, you can then talk to the card using the PC
- Watchdog program, available from http://ftp.bitgate.com/pcwd/.
+ drivers have initialized, you can then talk to the card using a PC
+ Watchdog program.
 
  I suggest putting a "watchdog -d" before the beginning of an fsck, and
  a "watchdog -e -t 1" immediately after the end of an fsck.  (Remember
@@ -62,5 +64,3 @@
  -- Ken Hollis
     (kenji@bitgate.com)
 
-(This documentation may be out of date.  Check
- http://ftp.bitgate.com/pcwd/ for the absolute latest additions.)
index 8d16f6f3c4eccbbba5e28f1e7f60db24ad942fa7..bb7cb1d31ec70f3424e41e7b99b15c0ce5dbc87a 100644 (file)
@@ -1,3 +1,6 @@
+Last reviewed: 10/05/2007
+
+
 The Linux Watchdog driver API.
 
 Copyright 2002 Christer Weingel <wingel@nano-system.com>
@@ -22,7 +25,7 @@ the system.  If userspace fails (RAM error, kernel bug, whatever), the
 notifications cease to occur, and the hardware watchdog will reset the
 system (causing a reboot) after the timeout occurs.
 
-The Linux watchdog API is a rather AD hoc construction and different
+The Linux watchdog API is a rather ad-hoc construction and different
 drivers implement different, and sometimes incompatible, parts of it.
 This file is an attempt to document the existing usage and allow
 future driver writers to use it as a reference.
@@ -46,14 +49,16 @@ some of the drivers support the configuration option "Disable watchdog
 shutdown on close", CONFIG_WATCHDOG_NOWAYOUT.  If it is set to Y when
 compiling the kernel, there is no way of disabling the watchdog once
 it has been started.  So, if the watchdog daemon crashes, the system
-will reboot after the timeout has passed.
+will reboot after the timeout has passed. Watchdog devices also usually
+support the nowayout module parameter so that this option can be controlled
+at runtime.
 
-Some other drivers will not disable the watchdog, unless a specific
-magic character 'V' has been sent /dev/watchdog just before closing
-the file.  If the userspace daemon closes the file without sending
-this special character, the driver will assume that the daemon (and
-userspace in general) died, and will stop pinging the watchdog without
-disabling it first.  This will then cause a reboot.
+Drivers will not disable the watchdog, unless a specific magic character 'V'
+has been sent /dev/watchdog just before closing the file.  If the userspace
+daemon closes the file without sending this special character, the driver
+will assume that the daemon (and userspace in general) died, and will stop
+pinging the watchdog without disabling it first.  This will then cause a
+reboot if the watchdog is not re-opened in sufficient time.
 
 The ioctl API:
 
@@ -227,218 +232,3 @@ The following options are available:
 
 [FIXME -- better explanations]
 
-Implementations in the current drivers in the kernel tree:
-
-Here I have tried to summarize what the different drivers support and
-where they do strange things compared to the other drivers.
-
-acquirewdt.c -- Acquire Single Board Computer
-
-       This driver has a hardcoded timeout of 1 minute
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns KEEPALIVEPING.  GETSTATUS will return 1 if
-       the device is open, 0 if not.  [FIXME -- isn't this rather
-       silly?  To be able to use the ioctl, the device must be open
-       and so GETSTATUS will always return 1].
-
-advantechwdt.c -- Advantech Single Board Computer
-
-       Timeout that defaults to 60 seconds, supports SETTIMEOUT.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
-       The GETSTATUS call returns if the device is open or not.
-       [FIXME -- silliness again?]
-       
-booke_wdt.c -- PowerPC BookE Watchdog Timer
-
-       Timeout default varies according to frequency, supports
-       SETTIMEOUT
-
-       Watchdog cannot be turned off, CONFIG_WATCHDOG_NOWAYOUT
-       does not make sense
-
-       GETSUPPORT returns the watchdog_info struct, and
-       GETSTATUS returns the supported options. GETBOOTSTATUS
-       returns a 1 if the last reset was caused by the
-       watchdog and a 0 otherwise. This watchdog cannot be
-       disabled once it has been started. The wdt_period kernel
-       parameter selects which bit of the time base changing
-       from 0->1 will trigger the watchdog exception. Changing
-       the timeout from the ioctl calls will change the
-       wdt_period as defined above. Finally if you would like to
-       replace the default Watchdog Handler you can implement the
-       WatchdogHandler() function in your own code.
-
-eurotechwdt.c -- Eurotech CPU-1220/1410
-
-       The timeout can be set using the SETTIMEOUT ioctl and defaults
-       to 60 seconds.
-
-       Also has a module parameter "ev", event type which controls
-       what should happen on a timeout, the string "int" or anything
-       else that causes a reboot.  [FIXME -- better description]
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns CARDRESET and WDIOF_SETTIMEOUT but
-       GETSTATUS is not supported and GETBOOTSTATUS just returns 0.
-
-i810-tco.c -- Intel 810 chipset
-
-       Also has support for a lot of other i8x0 stuff, but the
-       watchdog is one of the things.
-
-       The timeout is set using the module parameter "i810_margin",
-       which is in steps of 0.6 seconds where 2<i810_margin<64.  The
-       driver supports the SETTIMEOUT ioctl.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT.
-
-       GETSUPPORT returns WDIOF_SETTIMEOUT.  The GETSTATUS call
-       returns some kind of timer value which ist not compatible with
-       the other drivers.  GETBOOT status returns some kind of
-       hardware specific boot status.  [FIXME -- describe this]
-
-ib700wdt.c -- IB700 Single Board Computer
-
-       Default timeout of 30 seconds and the timeout is settable
-       using the SETTIMEOUT ioctl.  Note that only a few timeout
-       values are supported.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
-       The GETSTATUS call returns if the device is open or not.
-       [FIXME -- silliness again?]
-
-machzwd.c -- MachZ ZF-Logic
-
-       Hardcoded timeout of 10 seconds
-
-       Has a module parameter "action" that controls what happens
-       when the timeout runs out which can be 0 = RESET (default), 
-       1 = SMI, 2 = NMI, 3 = SCI.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT and the magic character
-       'V' close handling.
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING, and the GETSTATUS call
-       returns if the device is open or not.  [FIXME -- silliness
-       again?]
-
-mixcomwd.c -- MixCom Watchdog
-
-       [FIXME -- I'm unable to tell what the timeout is]
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING, GETSTATUS returns if
-       the device is opened or not [FIXME -- I'm not really sure how
-       this works, there seems to be some magic connected to
-       CONFIG_WATCHDOG_NOWAYOUT]
-
-pcwd.c -- Berkshire PC Watchdog
-
-       Hardcoded timeout of 1.5 seconds
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_OVERHEAT|WDIOF_CARDRESET and both
-       GETSTATUS and GETBOOTSTATUS return something useful.
-
-       The SETOPTIONS call can be used to enable and disable the card
-       and to ask the driver to call panic if the system overheats.
-
-sbc60xxwdt.c -- 60xx Single Board Computer
-
-       Hardcoded timeout of 10 seconds
-
-       Does not support CONFIG_WATCHDOG_NOWAYOUT, but has the magic
-       character 'V' close handling.
-
-       No bits set in GETSUPPORT
-
-scx200.c -- National SCx200 CPUs
-
-       Not in the kernel yet.
-
-       The timeout is set using a module parameter "margin" which
-       defaults to 60 seconds.  The timeout can also be set using
-       SETTIMEOUT and read using GETTIMEOUT.
-
-       Supports a module parameter "nowayout" that is initialized
-       with the value of CONFIG_WATCHDOG_NOWAYOUT.  Also supports the
-       magic character 'V' handling.
-
-shwdt.c -- SuperH 3/4 processors
-
-       [FIXME -- I'm unable to tell what the timeout is]
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING, and the GETSTATUS call
-       returns if the device is open or not.  [FIXME -- silliness
-       again?]
-
-softdog.c -- Software watchdog
-
-       The timeout is set with the module parameter "soft_margin"
-       which defaults to 60 seconds, the timeout is also settable
-       using the SETTIMEOUT ioctl.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       WDIOF_SETTIMEOUT bit set in GETSUPPORT
-
-w83877f_wdt.c -- W83877F Computer
-
-       Hardcoded timeout of 30 seconds
-
-       Does not support CONFIG_WATCHDOG_NOWAYOUT, but has the magic
-       character 'V' close handling.
-
-       No bits set in GETSUPPORT
-
-w83627hf_wdt.c -- w83627hf watchdog
-
-       Timeout that defaults to 60 seconds, supports SETTIMEOUT.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT.
-       The GETSTATUS call returns if the device is open or not.
-
-wdt.c -- ICS WDT500/501 ISA and
-wdt_pci.c -- ICS WDT500/501 PCI
-
-       Default timeout of 60 seconds.  The timeout is also settable
-        using the SETTIMEOUT ioctl.
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       GETSUPPORT returns with bits set depending on the actual
-       card. The WDT501 supports a lot of external monitoring, the
-       WDT500 much less.
-
-wdt285.c -- Footbridge watchdog
-
-       The timeout is set with the module parameter "soft_margin"
-       which defaults to 60 seconds.  The timeout is also settable
-       using the SETTIMEOUT ioctl.
-
-       Does not support CONFIG_WATCHDOG_NOWAYOUT
-
-       WDIOF_SETTIMEOUT bit set in GETSUPPORT
-
-wdt977.c -- Netwinder W83977AF chip
-
-       Hardcoded timeout of 3 minutes
-
-       Supports CONFIG_WATCHDOG_NOWAYOUT
-
-       Does not support any ioctls at all.
-
diff --git a/Documentation/watchdog/watchdog.txt b/Documentation/watchdog/watchdog.txt
deleted file mode 100644 (file)
index 4b1ff69..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-       Watchdog Timer Interfaces For The Linux Operating System
-
-               Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-            Custom Linux Driver And Program Development
-
-
-The following watchdog drivers are currently implemented:
-
-       ICS     WDT501-P
-       ICS     WDT501-P (no fan tachometer)
-       ICS     WDT500-P
-       Software Only
-       SA1100 Internal Watchdog
-       Berkshire Products PC Watchdog Revision A & C (by Ken Hollis)
-
-
-All six interfaces provide /dev/watchdog, which when open must be written
-to within a timeout or the machine will reboot. Each write delays the reboot
-time another timeout. In the case of the software watchdog the ability to 
-reboot will depend on the state of the machines and interrupts. The hardware
-boards physically pull the machine down off their own onboard timers and
-will reboot from almost anything.
-
-A second temperature monitoring interface is available on the WDT501P cards
-and some Berkshire cards. This provides /dev/temperature. This is the machine 
-internal temperature in degrees Fahrenheit. Each read returns a single byte 
-giving the temperature.
-
-The third interface logs kernel messages on additional alert events.
-
-Both software and hardware watchdog drivers are available in the standard
-kernel. If you are using the software watchdog, you probably also want
-to use "panic=60" as a boot argument as well.
-
-The wdt card cannot be safely probed for. Instead you need to pass
-wdt=ioaddr,irq as a boot parameter - eg "wdt=0x240,11".
-
-The SA1100 watchdog module can be configured with the "sa1100_margin"
-commandline argument which specifies timeout value in seconds.
-
-The i810 TCO watchdog modules can be configured with the "i810_margin"
-commandline argument which specifies the counter initial value. The counter
-is decremented every 0.6 seconds and default to 50 (30 seconds). Values can
-range between 3 and 63.
-
-The i810 TCO watchdog driver also implements the WDIOC_GETSTATUS and
-WDIOC_GETBOOTSTATUS ioctl()s. WDIOC_GETSTATUS returns the actual counter value
-and WDIOC_GETBOOTSTATUS returns the value of TCO2 Status Register (see Intel's
-documentation for the 82801AA and 82801AB datasheet). 
-
-Features
---------
-               WDT501P         WDT500P         Software        Berkshire       i810 TCO        SA1100WD
-Reboot Timer      X               X                X               X               X               X
-External Reboot           X               X                o               o               o               X
-I/O Port Monitor   o              o                o               X               o               o
-Temperature       X               o                o               X               o               o
-Fan Speed          X              o                o               o               o               o
-Power Under       X               o                o               o               o               o
-Power Over         X               o                o               o               o               o
-Overheat           X               o                o               o               o               o
-
-The external event interfaces on the WDT boards are not currently supported.
-Minor numbers are however allocated for it.
-
-
-Example Watchdog Driver:  see Documentation/watchdog/src/watchdog-simple.c
-
-
-Contact Information
-
-People keep asking about the WDT watchdog timer hardware: The phone contacts
-for Industrial Computer Source are:
-Industrial Computer Source
-http://www.indcompsrc.com
-ICS Advent, San Diego
-6260 Sequence Dr.
-San Diego, CA 92121-4371
-Phone (858) 677-0877
-FAX: (858) 677-0895
->
-ICS Advent Europe, UK
-Oving Road
-Chichester,
-West Sussex,
-PO19 4ET, UK
-Phone: 00.44.1243.533900
-
-
-and please mention Linux when enquiring.
-
-For full information about the PCWD cards see the pcwd-watchdog.txt document.
diff --git a/Documentation/watchdog/wdt.txt b/Documentation/watchdog/wdt.txt
new file mode 100644 (file)
index 0000000..03fd756
--- /dev/null
@@ -0,0 +1,43 @@
+Last Reviewed: 10/05/2007
+
+       WDT Watchdog Timer Interfaces For The Linux Operating System
+               Alan Cox <alan@lxorguk.ukuu.org.uk>
+
+       ICS     WDT501-P
+       ICS     WDT501-P (no fan tachometer)
+       ICS     WDT500-P
+
+All the interfaces provide /dev/watchdog, which when open must be written
+to within a timeout or the machine will reboot. Each write delays the reboot
+time another timeout. In the case of the software watchdog the ability to
+reboot will depend on the state of the machines and interrupts. The hardware
+boards physically pull the machine down off their own onboard timers and
+will reboot from almost anything.
+
+A second temperature monitoring interface is available on the WDT501P cards
+This provides /dev/temperature. This is the machine internal temperature in
+degrees Fahrenheit. Each read returns a single byte giving the temperature.
+
+The third interface logs kernel messages on additional alert events.
+
+The wdt card cannot be safely probed for. Instead you need to pass
+wdt=ioaddr,irq as a boot parameter - eg "wdt=0x240,11".
+
+Features
+--------
+               WDT501P         WDT500P
+Reboot Timer      X               X
+External Reboot           X               X
+I/O Port Monitor   o              o
+Temperature       X               o
+Fan Speed          X              o
+Power Under       X               o
+Power Over         X               o
+Overheat           X               o
+
+The external event interfaces on the WDT boards are not currently supported.
+Minor numbers are however allocated for it.
+
+
+Example Watchdog Driver:  see Documentation/watchdog/src/watchdog-simple.c
+
index 4cc17b993b6a4dc8d95c5a868817eee812cabc2b..f3b5a391e074822b9303d8bd06e5743efbddacaa 100644 (file)
@@ -30,8 +30,11 @@ trivial patch so apply some common sense.
        job the maintainers (and especially Linus) do is to keep things
        looking the same. Sometimes this means that the clever hack in
        your driver to get around a problem actually needs to become a
-       generalized kernel feature ready for next time. See
-       Documentation/CodingStyle for guidance here.
+       generalized kernel feature ready for next time.
+
+       PLEASE check your patch with the automated style checker
+       (scripts/checkpatch.pl) to catch trival style violations.
+       See Documentation/CodingStyle for guidance here.
 
        PLEASE try to include any credit lines you want added with the
        patch. It avoids people being missed off by mistake and makes
@@ -972,6 +975,15 @@ M: johannes@sipsolutions.net
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
 
+CHECKPATCH
+P:     Andy Whitcroft
+M:     apw@shadowen.org
+P:     Randy Dunlap
+M:     rdunlap@xenotime.net
+P:     Joel Schopp
+M:     jschopp@austin.ibm.com
+S:     Supported
+
 COMMON INTERNET FILE SYSTEM (CIFS)
 P:     Steve French
 M:     sfrench@samba.org
@@ -1475,6 +1487,13 @@ L:       linux-usb-devel@lists.sourceforge.net
 L:     linuxppc-embedded@ozlabs.org
 S:     Maintained
 
+FREESCALE QUICC ENGINE UCC ETHERNET DRIVER
+P:     Li Yang
+M:     leoli@freescale.com
+L:     netdev@vger.kernel.org
+L:     linuxppc-embedded@ozlabs.org
+S:     Maintained
+
 FILE LOCKING (flock() and fcntl()/lockf())
 P:     Matthew Wilcox
 M:     matthew@wil.cx
@@ -1486,6 +1505,14 @@ P:       Alexander Viro
 M:     viro@zeniv.linux.org.uk
 S:     Maintained
 
+FIREWIRE SUBSYSTEM
+P:     Kristian Hoegsberg, Stefan Richter
+M:     krh@redhat.com, stefanr@s5r6.in-berlin.de
+L:     linux1394-devel@lists.sourceforge.net
+W:     http://www.linux1394.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
+S:     Maintained
+
 FIRMWARE LOADER (request_firmware)
 L:     linux-kernel@vger.kernel.org
 S:     Orphan
@@ -2880,8 +2907,8 @@ W:        ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
 S:     Supported
 
 PRISM54 WIRELESS DRIVER
-P:     Prism54 Development Team
-M:     developers@islsm.org
+P:     Luis R. Rodriguez
+M:     mcgrof@gmail.com
 L:     linux-wireless@vger.kernel.org
 W:     http://prism54.org
 S:     Maintained
@@ -3525,7 +3552,7 @@ S:        Maintained
 
 TULIP NETWORK DRIVER
 P:     Valerie Henson
-M:     val_henson@linux.intel.com
+M:     val@nmt.edu
 L:     tulip-users@lists.sourceforge.net
 W:     http://sourceforge.net/projects/tulip/
 S:     Maintained
index 770f717bd250c2c0965b6477e2b6b205b8f37dbe..79c6e5a2445652679b4aafa5d647e06248fe27b2 100644 (file)
@@ -83,22 +83,20 @@ choice
          check out the Linux/Alpha FAQ, accessible on the WWW from
          <http://www.alphalinux.org/>. In summary:
 
-         Alcor/Alpha-XLT     AS 600
+         Alcor/Alpha-XLT     AS 600, AS 500, XL-300, XL-366
          Alpha-XL            XL-233, XL-266
          AlphaBook1          Alpha laptop
          Avanti              AS 200, AS 205, AS 250, AS 255, AS 300, AS 400
          Cabriolet           AlphaPC64, AlphaPCI64
-         DP264               DP264
+         DP264               DP264 / DS20 / ES40 / DS10 / DS10L
          EB164               EB164 21164 evaluation board
          EB64+               EB64+ 21064 evaluation board
          EB66                EB66 21066 evaluation board
          EB66+               EB66+ 21066 evaluation board
-         Jensen              DECpc 150, DEC 2000 model 300,
-         DEC 2000 model 500
+         Jensen              DECpc 150, DEC 2000 models 300, 500
          LX164               AlphaPC164-LX
          Lynx                AS 2100A
-         Miata               Personal Workstation 433a, 433au, 500a,
-         500au, 600a, or 600au
+         Miata               Personal Workstation 433/500/600 a/au
          Marvel              AlphaServer ES47 / ES80 / GS1280
          Mikasa              AS 1000
          Noname              AXPpci33, UDB (Multia)
@@ -108,9 +106,9 @@ choice
          Ruffian             RPX164-2, AlphaPC164-UX, AlphaPC164-BX
          SX164               AlphaPC164-SX
          Sable               AS 2000, AS 2100
-         Shark               DS 20L
-         Takara              Takara
-         Titan               AlphaServer ES45 / DS25
+         Shark               DS 20L
+         Takara              Takara (OEM)
+         Titan               AlphaServer ES45 / DS25 / DS15
          Wildfire            AlphaServer GS 40/80/160/320
 
          If you don't know what to do, choose "generic".
@@ -481,6 +479,15 @@ config ALPHA_BROKEN_IRQ_MASK
        depends on ALPHA_GENERIC || ALPHA_PC164
        default y
 
+config VGA_HOSE
+       bool
+       depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI
+       default y
+       help
+         Support VGA on an arbitrary hose; needed for several platforms
+         which always have multiple hoses, and whose consoles support it.
+
+
 config ALPHA_SRM
        bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME
        default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL
@@ -537,10 +544,14 @@ config HAVE_DEC_LOCK
        default y
 
 config NR_CPUS
-       int "Maximum number of CPUs (2-64)"
-       range 2 64
+       int "Maximum number of CPUs (2-32)"
+       range 2 32
        depends on SMP
-       default "64"
+       default "32" if ALPHA_GENERIC || ALPHA_MARVEL
+       default "4" if !ALPHA_GENERIC && !ALPHA_MARVEL
+       help
+         MARVEL support can handle a maximum of 32 CPUs, all the others
+          with working support have a maximum of 4 CPUs.
 
 config ARCH_DISCONTIGMEM_ENABLE
        bool "Discontiguous Memory Support (EXPERIMENTAL)"
@@ -644,6 +655,13 @@ source "arch/alpha/oprofile/Kconfig"
 
 source "arch/alpha/Kconfig.debug"
 
+# DUMMY_CONSOLE may be defined in drivers/video/console/Kconfig
+# but we also need it if VGA_HOSE is set
+config DUMMY_CONSOLE
+       bool
+       depends on VGA_HOSE
+       default y
+
 source "security/Kconfig"
 
 source "crypto/Kconfig"
index 23c7190b047c2d716303d1beefa69342280c5a43..632a7fd6d7dcfeb42efd837e8188d55b5ebd933d 100644 (file)
@@ -81,7 +81,7 @@ typedef union __bootblock {
 #define        bootblock_label         __u1.__label
 #define bootblock_checksum     __u2.__checksum
 
-main(int argc, char ** argv)
+int main(int argc, char ** argv)
 {
     bootblock          bootblock_from_disk;
     bootblock          bootloader_image;
index f313b34939bbc5516894e64e2d047322bfa69bae..da711e37fc975af1041b7229d02b5aea84856f40 100644 (file)
@@ -9,16 +9,20 @@
 #include <linux/init.h>
 #include <linux/tty.h>
 #include <linux/console.h>
+#include <linux/vt.h>
 #include <asm/vga.h>
 #include <asm/machvec.h>
 
+#include "pci_impl.h"
+
 #ifdef CONFIG_VGA_HOSE
 
-/*
- * Externally-visible vga hose bases
- */
-unsigned long __vga_hose_io_base = 0;  /* base for default hose */
-unsigned long __vga_hose_mem_base = 0; /* base for default hose */
+struct pci_controller *pci_vga_hose;
+static struct resource alpha_vga = {
+       .name   = "alpha-vga+",
+       .start  = 0x3C0,
+       .end    = 0x3DF
+};
 
 static struct pci_controller * __init 
 default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2)
@@ -29,37 +33,59 @@ default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2)
        return h1;
 }
 
-void __init 
-set_vga_hose(struct pci_controller *hose)
-{
-       if (hose) {
-               __vga_hose_io_base = hose->io_space->start;
-               __vga_hose_mem_base = hose->mem_space->start;
-       }
-}
-
 void __init 
 locate_and_init_vga(void *(*sel_func)(void *, void *))
 {
        struct pci_controller *hose = NULL;
        struct pci_dev *dev = NULL;
 
+       /* Default the select function */
        if (!sel_func) sel_func = (void *)default_vga_hose_select;
 
+       /* Find the console VGA device */
        for(dev=NULL; (dev=pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) {
-               if (!hose) hose = dev->sysdata;
-               else hose = sel_func(hose, dev->sysdata);
+               if (!hose)
+                       hose = dev->sysdata;
+               else
+                       hose = sel_func(hose, dev->sysdata);
        }
 
-       /* Did we already inititialize the correct one? */
-       if (conswitchp == &vga_con &&
-           __vga_hose_io_base == hose->io_space->start &&
-           __vga_hose_mem_base == hose->mem_space->start)
+       /* Did we already initialize the correct one? Is there one? */
+       if (!hose || (conswitchp == &vga_con && pci_vga_hose == hose))
                return;
 
-       /* Set the VGA hose and init the new console */
-       set_vga_hose(hose);
+       /* Create a new VGA ioport resource WRT the hose it is on. */
+       alpha_vga.start += hose->io_space->start;
+       alpha_vga.end += hose->io_space->start;
+       request_resource(hose->io_space, &alpha_vga);
+
+       /* Set the VGA hose and init the new console. */
+       pci_vga_hose = hose;
        take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1);
 }
 
+void __init
+find_console_vga_hose(void)
+{
+       u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
+
+       if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
+               struct pci_controller *hose;
+               int h = (pu64[30] >> 24) & 0xff;        /* console hose # */
+
+               /*
+                * Our hose numbering DOES match the console's, so find
+                * the right one...
+                */
+               for (hose = hose_head; hose; hose = hose->next) {
+                       if (hose->index == h) break;
+               }
+
+               if (hose) {
+                       printk("Console graphics on hose %d\n", h);
+                       pci_vga_hose = hose;
+               }
+       }
+}
+
 #endif
index 7f6a98455e74e52f666893b457f138a0eedc3cda..f10d2eddd2c309a807d58df12c48f01156f99efc 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 #include <asm/rtc.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -367,9 +368,8 @@ marvel_io7_present(gct6_node *node)
 }
 
 static void __init
-marvel_init_vga_hose(void)
+marvel_find_console_vga_hose(void)
 {
-#ifdef CONFIG_VGA_HOSE
        u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
 
        if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
@@ -403,7 +403,6 @@ marvel_init_vga_hose(void)
                        pci_vga_hose = hose;
                }
        }
-#endif /* CONFIG_VGA_HOSE */
 }
 
 gct6_search_struct gct_wanted_node_list[] = {
@@ -459,7 +458,7 @@ marvel_init_arch(void)
                marvel_init_io7(io7);
 
        /* Check for graphic console location (if any).  */
-       marvel_init_vga_hose();
+       marvel_find_console_vga_hose();
 }
 
 void
@@ -684,9 +683,6 @@ __marvel_rtc_io(u8 b, unsigned long addr, int write)
 /*
  * IO map support.
  */
-
-#define __marvel_is_mem_vga(a) (((a) >= 0xa0000) && ((a) <= 0xc0000))
-
 void __iomem *
 marvel_ioremap(unsigned long addr, unsigned long size)
 {
@@ -698,13 +694,9 @@ marvel_ioremap(unsigned long addr, unsigned long size)
        unsigned long pfn;
 
        /*
-        * Adjust the addr.
+        * Adjust the address.
         */ 
-#ifdef CONFIG_VGA_HOSE
-       if (pci_vga_hose && __marvel_is_mem_vga(addr)) {
-               addr += pci_vga_hose->mem_space->start;
-       }
-#endif
+       FIXUP_MEMADDR_VGA(addr);
 
        /*
         * Find the hose.
@@ -781,7 +773,9 @@ marvel_ioremap(unsigned long addr, unsigned long size)
                return (void __iomem *) vaddr;
        }
 
-       return NULL;
+       /* Assume it was already a reasonable address */
+       vaddr = baddr + hose->mem_space->start;
+       return (void __iomem *) vaddr;
 }
 
 void
@@ -803,21 +797,12 @@ marvel_is_mmio(const volatile void __iomem *xaddr)
                return (addr & 0xFF000000UL) == 0;
 }
 
-#define __marvel_is_port_vga(a)        \
-  (((a) >= 0x3b0) && ((a) < 0x3e0) && ((a) != 0x3b3) && ((a) != 0x3d3))
 #define __marvel_is_port_kbd(a)        (((a) == 0x60) || ((a) == 0x64))
 #define __marvel_is_port_rtc(a)        (((a) == 0x70) || ((a) == 0x71))
 
 void __iomem *marvel_ioportmap (unsigned long addr)
 {
-       if (__marvel_is_port_rtc (addr) || __marvel_is_port_kbd(addr))
-               ;
-#ifdef CONFIG_VGA_HOSE
-       else if (__marvel_is_port_vga (addr) && pci_vga_hose)
-               addr += pci_vga_hose->io_space->start;
-#endif
-       else
-               return NULL;
+       FIXUP_IOADDR_VGA(addr);
        return (void __iomem *)addr;
 }
 
@@ -829,8 +814,14 @@ marvel_ioread8(void __iomem *xaddr)
                return 0;
        else if (__marvel_is_port_rtc(addr))
                return __marvel_rtc_io(0, addr, 0);
-       else
+       else if (marvel_is_ioaddr(addr))
                return __kernel_ldbu(*(vucp)addr);
+       else
+               /* this should catch other legacy addresses
+                  that would normally fail on MARVEL,
+                  because there really is nothing there...
+               */
+               return ~0;
 }
 
 void
@@ -841,7 +832,7 @@ marvel_iowrite8(u8 b, void __iomem *xaddr)
                return;
        else if (__marvel_is_port_rtc(addr)) 
                __marvel_rtc_io(b, addr, 1);
-       else
+       else if (marvel_is_ioaddr(addr))
                __kernel_stb(b, *(vucp)addr);
 }
 
index 3662fef7db9a9c19413f01e06edf5de013e2edf9..819326627b966c3f166f76b38a11614ad51e11ec 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/smp.h>
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -34,6 +35,11 @@ struct
        unsigned long tba[4];
 } saved_config[4] __attribute__((common));
 
+/*
+ * Is PChip 1 present? No need to query it more than once.
+ */
+static int titan_pchip1_present;
+
 /*
  * BIOS32-style PCI interface:
  */
@@ -344,43 +350,17 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index)
 static void __init
 titan_init_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
+       titan_pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
 
        /* Init the ports in hose order... */
        titan_init_one_pachip_port(&pachip0->g_port, 0);        /* hose 0 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->g_port, 1);/* hose 1 */
        titan_init_one_pachip_port(&pachip0->a_port, 2);        /* hose 2 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->a_port, 3);/* hose 3 */
 }
 
-static void __init
-titan_init_vga_hose(void)
-{
-#ifdef CONFIG_VGA_HOSE
-       u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
-
-       if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
-               struct pci_controller *hose;
-               int h = (pu64[30] >> 24) & 0xff;        /* console hose # */
-
-               /*
-                * Our hose numbering matches the console's, so just find
-                * the right one...
-                */
-               for (hose = hose_head; hose; hose = hose->next) {
-                       if (hose->index == h) break;
-               }
-
-               if (hose) {
-                       printk("Console graphics on hose %d\n", hose->index);
-                       pci_vga_hose = hose;
-               }
-       }
-#endif /* CONFIG_VGA_HOSE */
-}
-
 void __init
 titan_init_arch(void)
 {
@@ -406,6 +386,7 @@ titan_init_arch(void)
 
        /* With multiple PCI busses, we play with I/O as physical addrs.  */
        ioport_resource.end = ~0UL;
+       iomem_resource.end = ~0UL;
 
        /* PCI DMA Direct Mapping is 1GB at 2GB.  */
        __direct_map_base = 0x80000000;
@@ -415,7 +396,7 @@ titan_init_arch(void)
        titan_init_pachips(TITAN_pachip0, TITAN_pachip1);
 
        /* Check for graphic console location (if any).  */
-       titan_init_vga_hose();
+       find_console_vga_hose();
 }
 
 static void
@@ -441,9 +422,7 @@ titan_kill_one_pachip_port(titan_pachip_port *port, int index)
 static void
 titan_kill_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
-
-       if (pchip1_present) {
+       if (titan_pchip1_present) {
                titan_kill_one_pachip_port(&pachip1->g_port, 1);
                titan_kill_one_pachip_port(&pachip1->a_port, 3);
        }
@@ -462,6 +441,14 @@ titan_kill_arch(int mode)
  * IO map support.
  */
 
+void __iomem *
+titan_ioportmap(unsigned long addr)
+{
+       FIXUP_IOADDR_VGA(addr);
+       return (void __iomem *)(addr + TITAN_IO_BIAS);
+}
+
+
 void __iomem *
 titan_ioremap(unsigned long addr, unsigned long size)
 {
@@ -475,14 +462,12 @@ titan_ioremap(unsigned long addr, unsigned long size)
        unsigned long pfn;
 
        /*
-        * Adjust the addr.
+        * Adjust the address and hose, if necessary.
         */ 
-#ifdef CONFIG_VGA_HOSE
-       if (pci_vga_hose && __titan_is_mem_vga(addr)) {
+       if (pci_vga_hose && __is_mem_vga(addr)) {
                h = pci_vga_hose->index;
                addr += pci_vga_hose->mem_space->start;
        }
-#endif
 
        /*
         * Find the hose.
@@ -521,8 +506,10 @@ titan_ioremap(unsigned long addr, unsigned long size)
                 * Map it
                 */
                area = get_vm_area(size, VM_IOREMAP);
-               if (!area)
+               if (!area) {
+                       printk("ioremap failed... no vm_area...\n");
                        return NULL;
+               }
 
                ptes = hose->sg_pci->ptes;
                for (vaddr = (unsigned long)area->addr; 
@@ -539,7 +526,7 @@ titan_ioremap(unsigned long addr, unsigned long size)
                        if (__alpha_remap_area_pages(vaddr,
                                                     pfn << PAGE_SHIFT, 
                                                     PAGE_SIZE, 0)) {
-                               printk("FAILED to map...\n");
+                               printk("FAILED to remap_area_pages...\n");
                                vfree(area->addr);
                                return NULL;
                        }
@@ -551,7 +538,8 @@ titan_ioremap(unsigned long addr, unsigned long size)
                return (void __iomem *) vaddr;
        }
 
-       return NULL;
+       /* Assume a legacy (read: VGA) address, and return appropriately. */
+       return (void __iomem *)(addr + TITAN_MEM_BIAS);
 }
 
 void
@@ -574,6 +562,7 @@ titan_is_mmio(const volatile void __iomem *xaddr)
 }
 
 #ifndef CONFIG_ALPHA_GENERIC
+EXPORT_SYMBOL(titan_ioportmap);
 EXPORT_SYMBOL(titan_ioremap);
 EXPORT_SYMBOL(titan_iounmap);
 EXPORT_SYMBOL(titan_is_mmio);
@@ -750,6 +739,7 @@ titan_agp_info(void)
        if (titan_query_agp(port))
                hosenum = 2;
        if (hosenum < 0 && 
+           titan_pchip1_present &&
            titan_query_agp(port = &TITAN_pachip1->a_port)) 
                hosenum = 3;
        
index ce623c6e55e1c9c30d1521a95309496273a2889f..ef91e09590d4d1aefe76772e81b29c83d9f73b78 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/smp.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -349,6 +350,26 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
        tsunami_pci_tbi(hose, 0, -1);
 }
 
+
+void __iomem *
+tsunami_ioportmap(unsigned long addr)
+{
+       FIXUP_IOADDR_VGA(addr);
+       return (void __iomem *)(addr + TSUNAMI_IO_BIAS);
+}
+
+void __iomem *
+tsunami_ioremap(unsigned long addr, unsigned long size)
+{
+       FIXUP_MEMADDR_VGA(addr);
+       return (void __iomem *)(addr + TSUNAMI_MEM_BIAS);
+}
+
+#ifndef CONFIG_ALPHA_GENERIC
+EXPORT_SYMBOL(tsunami_ioportmap);
+EXPORT_SYMBOL(tsunami_ioremap);
+#endif
+
 void __init
 tsunami_init_arch(void)
 {
@@ -393,6 +414,9 @@ tsunami_init_arch(void)
        tsunami_init_one_pchip(TSUNAMI_pchip0, 0);
        if (TSUNAMI_cchip->csc.csr & 1L<<14)
                tsunami_init_one_pchip(TSUNAMI_pchip1, 1);
+
+       /* Check for graphic console location (if any).  */
+       find_console_vga_hose();
 }
 
 static void
index c95e95e1ab0423b2664e8359a32ff2da0d13372d..debc8f03886cf9edafa577664a90a6c8ec59c9ad 100644 (file)
@@ -391,11 +391,10 @@ $work_resched:
        bne     $2, $work_resched
 
 $work_notifysig:
-       mov     $sp, $17
+       mov     $sp, $16
        br      $1, do_switch_stack
-       mov     $5, $21
-       mov     $sp, $18
-       mov     $31, $16
+       mov     $sp, $17
+       mov     $5, $18
        jsr     $26, do_notify_resume
        bsr     $1, undo_switch_stack
        br      restore_all
index 6e7d1fe6e93532daa923ae6d6b69839e639954b6..28c84e55feb9b80440deda421730ff0c126e2963 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/bootmem.h>
+#include <linux/log2.h>
 
 #include <asm/io.h>
 #include <asm/hwrpb.h>
@@ -53,7 +54,7 @@ size_for_memory(unsigned long max)
 {
        unsigned long mem = max_low_pfn << PAGE_SHIFT;
        if (mem < max)
-               max = 1UL << ceil_log2(mem);
+               max = roundup_pow_of_two(mem);
        return max;
 }
 \f
index 95912ecc65e1bb63af2f6991c08f485bfe938e40..708d5ca87782ad011019250399787e6e1c4258e5 100644 (file)
@@ -108,6 +108,15 @@ extern int wildfire_cpuid_to_nid(int);
 extern unsigned long wildfire_node_mem_start(int);
 extern unsigned long wildfire_node_mem_size(int);
 
+/* console.c */
+#ifdef CONFIG_VGA_HOSE
+extern void find_console_vga_hose(void);
+extern void locate_and_init_vga(void *(*)(void *, void *));
+#else
+static inline void find_console_vga_hose(void) { }
+static inline void locate_and_init_vga(void *(*sel_func)(void *, void *)) { }
+#endif
+
 /* setup.c */
 extern unsigned long srm_hae;
 extern int boot_cpuid;
index 915f26345c45c91a1105d97ed7256c40a859455b..bd5e68cd61e84fb440bd0a618b6c90019d48fb75 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/notifier.h>
 #include <asm/setup.h>
 #include <asm/io.h>
+#include <linux/log2.h>
 
 extern struct atomic_notifier_head panic_notifier_list;
 static int alpha_panic_event(struct notifier_block *, unsigned long, void *);
@@ -1303,7 +1304,7 @@ external_cache_probe(int minsize, int width)
        long size = minsize, maxsize = MAX_BCACHE_SIZE * 2;
 
        if (maxsize > (max_low_pfn + 1) << PAGE_SHIFT)
-               maxsize = 1 << (floor_log2(max_low_pfn + 1) + PAGE_SHIFT);
+               maxsize = 1 << (ilog2(max_low_pfn + 1) + PAGE_SHIFT);
 
        /* Get the first block cached. */
        read_mem_block(__va(0), stride, size);
index 7f64aa767d5a2f92aa8dfca13d466b3983dc64c3..410af4f3140e3ce4ff83256753f8e41d81c12106 100644 (file)
@@ -32,8 +32,8 @@
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
 asmlinkage void ret_from_sys_call(void);
-static int do_signal(sigset_t *, struct pt_regs *, struct switch_stack *,
-                    unsigned long, unsigned long);
+static void do_signal(struct pt_regs *, struct switch_stack *,
+                     unsigned long, unsigned long);
 
 
 /*
@@ -146,11 +146,9 @@ sys_rt_sigaction(int sig, const struct sigaction __user *act,
 asmlinkage int
 do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
 {
-       sigset_t oldset;
-
        mask &= _BLOCKABLE;
        spin_lock_irq(&current->sighand->siglock);
-       oldset = current->blocked;
+       current->saved_sigmask = current->blocked;
        siginitset(&current->blocked, mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
@@ -160,19 +158,17 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
        regs->r0 = EINTR;
        regs->r19 = 1;
 
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(&oldset, regs, sw, 0, 0))
-                       return -EINTR;
-       }
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+       set_thread_flag(TIF_RESTORE_SIGMASK);
+       return -ERESTARTNOHAND;
 }
 
 asmlinkage int
 do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
                 struct pt_regs *regs, struct switch_stack *sw)
 {
-       sigset_t oldset, set;
+       sigset_t set;
 
        /* XXX: Don't preclude handling different sized sigset_t's.  */
        if (sigsetsize != sizeof(sigset_t))
@@ -182,7 +178,7 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
 
        sigdelsetmask(&set, ~_BLOCKABLE);
        spin_lock_irq(&current->sighand->siglock);
-       oldset = current->blocked;
+       current->saved_sigmask = current->blocked;
        current->blocked = set;
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
@@ -192,12 +188,10 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
        regs->r0 = EINTR;
        regs->r19 = 1;
 
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(&oldset, regs, sw, 0, 0))
-                       return -EINTR;
-       }
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+       set_thread_flag(TIF_RESTORE_SIGMASK);
+       return -ERESTARTNOHAND;
 }
 
 asmlinkage int
@@ -436,7 +430,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
        return err;
 }
 
-static void
+static int
 setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
            struct pt_regs *regs, struct switch_stack * sw)
 {
@@ -481,13 +475,14 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
                current->comm, current->pid, frame, regs->pc, regs->r26);
 #endif
 
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
-static void
+static int
 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
               sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
 {
@@ -543,34 +538,38 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                current->comm, current->pid, frame, regs->pc, regs->r26);
 #endif
 
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
 
 /*
  * OK, we're invoking a handler.
  */
-static inline void
+static inline int
 handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
              sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw)
 {
+       int ret;
+
        if (ka->sa.sa_flags & SA_SIGINFO)
-               setup_rt_frame(sig, ka, info, oldset, regs, sw);
+               ret = setup_rt_frame(sig, ka, info, oldset, regs, sw);
        else
-               setup_frame(sig, ka, oldset, regs, sw);
+               ret = setup_frame(sig, ka, oldset, regs, sw);
 
-       if (ka->sa.sa_flags & SA_RESETHAND)
-               ka->sa.sa_handler = SIG_DFL;
+       if (ret == 0) {
+               spin_lock_irq(&current->sighand->siglock);
+               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               if (!(ka->sa.sa_flags & SA_NODEFER)) 
+                       sigaddset(&current->blocked,sig);
+               recalc_sigpending();
+               spin_unlock_irq(&current->sighand->siglock);
+       }
 
-       spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER)) 
-               sigaddset(&current->blocked,sig);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       return ret;
 }
 
 static inline void
@@ -611,30 +610,42 @@ syscall_restart(unsigned long r0, unsigned long r19,
  * restart. "r0" is also used as an indicator whether we can restart at
  * all (if we get here from anything but a syscall return, it will be 0)
  */
-static int
-do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw,
+static void
+do_signal(struct pt_regs * regs, struct switch_stack * sw,
          unsigned long r0, unsigned long r19)
 {
        siginfo_t info;
        int signr;
        unsigned long single_stepping = ptrace_cancel_bpt(current);
        struct k_sigaction ka;
+       sigset_t *oldset;
 
-       if (!oldset)
+       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+               oldset = &current->saved_sigmask;
+       else
                oldset = &current->blocked;
 
        /* This lets the debugger run, ... */
        signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+
        /* ... so re-check the single stepping. */
        single_stepping |= ptrace_cancel_bpt(current);
 
        if (signr > 0) {
                /* Whee!  Actually deliver the signal.  */
-               if (r0) syscall_restart(r0, r19, regs, &ka);
-               handle_signal(signr, &ka, &info, oldset, regs, sw);
+               if (r0)
+                       syscall_restart(r0, r19, regs, &ka);
+               if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) {
+                       /* A signal was successfully delivered, and the
+                          saved sigmask was stored on the signal frame,
+                          and will be restored by sigreturn.  So we can
+                          simply clear the restore sigmask flag.  */
+                       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               }
                if (single_stepping) 
                        ptrace_set_bpt(current); /* re-set bpt */
-               return 1;
+               return;
        }
 
        if (r0) {
@@ -654,17 +665,22 @@ do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw,
                        break;
                }
        }
+
+       /* If there's no signal to deliver, we just restore the saved mask.  */
+       if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
+               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
+       }
+
        if (single_stepping)
                ptrace_set_bpt(current);        /* re-set breakpoint */
-
-       return 0;
 }
 
 void
-do_notify_resume(sigset_t *oldset, struct pt_regs *regs,
-                struct switch_stack *sw, unsigned long r0,
-                unsigned long r19, unsigned long thread_info_flags)
+do_notify_resume(struct pt_regs *regs, struct switch_stack *sw,
+                unsigned long thread_info_flags,
+                unsigned long r0, unsigned long r19)
 {
-       if (thread_info_flags & _TIF_SIGPENDING)
-               do_signal(oldset, regs, sw, r0, r19);
+       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
+               do_signal(regs, sw, r0, r19);
 }
index 85d2f933dd07b0b8d9ca88f13646e302d13e1328..c71b0fd7a61f8748b857463c03854006ec5b91a1 100644 (file)
@@ -543,6 +543,7 @@ dp264_init_pci(void)
 {
        common_init_pci();
        SMC669_Init(0);
+       locate_and_init_vga(NULL);
 }
 
 static void __init
@@ -551,6 +552,14 @@ monet_init_pci(void)
        common_init_pci();
        SMC669_Init(1);
        es1888_init();
+       locate_and_init_vga(NULL);
+}
+
+static void __init
+clipper_init_pci(void)
+{
+       common_init_pci();
+       locate_and_init_vga(NULL);
 }
 
 static void __init
@@ -655,7 +664,7 @@ struct alpha_machine_vector clipper_mv __initmv = {
        .init_arch              = tsunami_init_arch,
        .init_irq               = clipper_init_irq,
        .init_rtc               = common_init_rtc,
-       .init_pci               = common_init_pci,
+       .init_pci               = clipper_init_pci,
        .kill_arch              = tsunami_kill_arch,
        .pci_map_irq            = clipper_map_irq,
        .pci_swizzle            = common_swizzle,
index e349f03b830e9c96826646877006e640dcf0edad..0bcb968cb60a72b7a71b99d98947a53882f620be 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/core_marvel.h>
 #include <asm/hwrpb.h>
 #include <asm/tlbflush.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "err_impl.h"
@@ -412,10 +413,7 @@ marvel_init_pci(void)
 
        pci_probe_only = 1;
        common_init_pci();
-
-#ifdef CONFIG_VGA_HOSE
        locate_and_init_vga(NULL);
-#endif
 
        /* Clear any io7 errors.  */
        for (io7 = NULL; (io7 = marvel_next_io7(io7)) != NULL; ) 
index f009b7bc094310da51ff2f154df86911e01d24cc..1d3c1398c428d324d42f67b4fc24284831278b2b 100644 (file)
@@ -331,9 +331,7 @@ titan_init_pci(void)
        pci_probe_only = 1;
        common_init_pci();
        SMC669_Init(0);
-#ifdef CONFIG_VGA_HOSE
        locate_and_init_vga(NULL);
-#endif
 }
 
 \f
index f6cfe8ce3f966b68cd5827c215eca6df94ffc57e..79de99e32c35f91ad2fcebc0ab8513bc5fd612d7 100644 (file)
@@ -465,6 +465,38 @@ sys_call_table:
        .quad sys_inotify_init
        .quad sys_inotify_add_watch             /* 445 */
        .quad sys_inotify_rm_watch
+       .quad sys_fdatasync
+       .quad sys_kexec_load
+       .quad sys_migrate_pages
+       .quad sys_openat                        /* 450 */
+       .quad sys_mkdirat
+       .quad sys_mknodat
+       .quad sys_fchownat
+       .quad sys_futimesat
+       .quad sys_fstatat64                     /* 455 */
+       .quad sys_unlinkat
+       .quad sys_renameat
+       .quad sys_linkat
+       .quad sys_symlinkat
+       .quad sys_readlinkat                    /* 460 */
+       .quad sys_fchmodat
+       .quad sys_faccessat
+       .quad sys_pselect6
+       .quad sys_ppoll
+       .quad sys_unshare                       /* 465 */
+       .quad sys_set_robust_list
+       .quad sys_get_robust_list
+       .quad sys_splice
+       .quad sys_sync_file_range
+       .quad sys_tee                           /* 470 */
+       .quad sys_vmsplice
+       .quad sys_move_pages
+       .quad sys_getcpu
+       .quad sys_epoll_pwait
+       .quad sys_utimensat                     /* 475 */
+       .quad sys_signalfd
+       .quad sys_timerfd
+       .quad sys_eventfd
 
        .size sys_call_table, . - sys_call_table
        .type sys_call_table, @object
index ea098f3b629f166c703720f65cf358429d10cf03..266f78e130766f5dc3ad1c1af261d368a92ef610 100644 (file)
@@ -37,7 +37,8 @@ lib-y =       __divqu.o __remqu.o __divlu.o __remlu.o \
        $(ev6-y)clear_page.o \
        $(ev6-y)copy_page.o \
        fpreg.o \
-       callback_srm.o srm_puts.o srm_printk.o
+       callback_srm.o srm_puts.o srm_printk.o \
+       fls.o
 
 lib-$(CONFIG_SMP) += dec_and_lock.o
 
diff --git a/arch/alpha/lib/fls.c b/arch/alpha/lib/fls.c
new file mode 100644 (file)
index 0000000..7ad84ea
--- /dev/null
@@ -0,0 +1,38 @@
+/* 
+ * arch/alpha/lib/fls.c
+ */
+
+#include <linux/module.h>
+#include <asm/bitops.h>
+
+/* This is fls(x)-1, except zero is held to zero.  This allows most
+   efficent input into extbl, plus it allows easy handling of fls(0)=0.  */
+
+const unsigned char __flsm1_tab[256] = 
+{
+  0,
+  0,
+  1, 1,
+  2, 2, 2, 2,
+  3, 3, 3, 3, 3, 3, 3, 3,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+};
+
+EXPORT_SYMBOL(__flsm1_tab);
index 9179e82203142bec7678ab20051b52590549396a..f73d62e8ab606473b4cc69e4f25775493f3a8af8 100644 (file)
@@ -57,7 +57,7 @@ extern void fp_enter(void);
 #define EXPORT_SYMBOL_ALIAS(sym,orig)          \
  EXPORT_CRC_ALIAS(sym)                         \
  static const struct kernel_symbol __ksymtab_##sym     \
-  __attribute_used__ __attribute__((section("__ksymtab"))) =   \
+  __used __attribute__((section("__ksymtab"))) =       \
     { (unsigned long)&orig, #sym };
 
 /*
index 8b63ad89d0a815c2cde57f138b951bffba33471a..ae31deb2d0653a6a8fe57b000fb2827de9acdf13 100644 (file)
@@ -13,7 +13,7 @@ int walk_stackframe(unsigned long fp, unsigned long low, unsigned long high,
                /*
                 * Check current frame pointer is within bounds
                 */
-               if ((fp - 12) < low || fp + 4 >= high)
+               if (fp < (low + 12) || fp + 4 >= high)
                        break;
 
                frame = (struct stackframe *)(fp - 12);
index 6043c38c0a9e84b6063d52111cb9c9b2173b8eb6..af497896a96ce761dcb6a45281a7148e1c7e3bd6 100644 (file)
@@ -132,7 +132,7 @@ static struct mtd_partition __initdata dk_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(dk_nand_partition);
        return dk_nand_partition;
index 76f6e1e553eaeabc252b1f4e60d9ba86b59101db..7d9b1a278fd63feb961e3ff21466952bae530dd2 100644 (file)
@@ -96,7 +96,7 @@ static struct mtd_partition __initdata kb9202_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(kb9202_nand_partition);
        return kb9202_nand_partition;
index 1f0c8a400b3a6c219dc981d9b84fba471559bbd9..26ca8ab3f62a7dc3df8f620178cf2695614ce44e 100644 (file)
@@ -178,7 +178,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index f57458559fb66da229df4273f2aebf56f79739dd..c164c8e58ae6a037cdfbbf4b9b5a9842b9b094e2 100644 (file)
@@ -180,7 +180,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index 30c79aca84d420f2b67eb0da8393ce9c01395d2c..9b61320f295aca158355be2ad7ead7596a2cb385 100644 (file)
@@ -87,7 +87,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index 4f984fde7375fc867d865bfae26ed53668c93f0c..35eb232a649a2b11aae684fdc169e3cf69fcefd2 100644 (file)
@@ -45,7 +45,7 @@ static struct hw_pci cats_pci __initdata = {
        .postinit               = dc21285_postinit,
 };
 
-static int cats_pci_init(void)
+static int __init cats_pci_init(void)
 {
        if (machine_is_cats())
                pci_common_init(&cats_pci);
index 7a7fa51ec62c11882e8833c94368536e3c77be2d..1c474cf709ca9b4a4241a112fceba2c1560244ea 100644 (file)
@@ -201,7 +201,6 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
 {
        imx_mmc_device.dev.platform_data = info;
 }
-EXPORT_SYMBOL(imx_set_mmc_info);
 
 static struct imxfb_mach_info imx_fb_info;
 
index 0fdd03ab36e6c4cbbcfd7da57a7cb8c4d8684c68..ce7c15c73004e6e9a353abb66f04946cdc660f03 100644 (file)
@@ -164,7 +164,7 @@ int __init ixdp2400_pci_init(void)
 
 subsys_initcall(ixdp2400_pci_init);
 
-void ixdp2400_init_irq(void)
+void __init ixdp2400_init_irq(void)
 {
        ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);
 }
index 70d247f09a7ecebe5451f4290efdea4c362b0bbb..14f09b80ab77180977da17826c0b8b8170203862 100644 (file)
@@ -279,7 +279,7 @@ int __init ixdp2800_pci_init(void)
 
 subsys_initcall(ixdp2800_pci_init);
 
-void ixdp2800_init_irq(void)
+void __init ixdp2800_init_irq(void)
 {
        ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS);
 }
index 011065b967b45db3080d8e6dfe45d8546853755e..73c651e83d92e5fe98dd2b1ecaa0f7c15c402a2e 100644 (file)
@@ -145,7 +145,7 @@ static struct irq_chip ixdp2x00_cpld_irq_chip = {
        .unmask = ixdp2x00_irq_unmask
 };
 
-void ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
+void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
 {
        unsigned int irq;
 
index 7a86a2516eaa57e30fc74c7330116fbff53bb02d..c41a6b5a0accbe986eafbbbf50f603c5c203e669 100644 (file)
@@ -124,7 +124,7 @@ static struct irq_chip ixdp2351_intb_chip = {
        .unmask = ixdp2351_intb_unmask
 };
 
-void ixdp2351_init_irq(void)
+void __init ixdp2351_init_irq(void)
 {
        int irq;
 
index ac7d43d23c28f1f35d6dd5abc62adee1dee95e0b..227f808dc0ecc8a52723d1003ed30d9c014907e9 100644 (file)
@@ -284,7 +284,7 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
        return 1;
 }
 
-void ixp23xx_pci_slave_init(void)
+void __init ixp23xx_pci_slave_init(void)
 {
        ixp23xx_pci_common_init();
 }
index d06e21b70de57e4e9c627489a762fd0bf3a543cb..e35644961aa442d9766a168088bee79713bd3151 100644 (file)
@@ -110,7 +110,7 @@ static int __init roadrunner_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
        return NO_IRQ;
 }
 
-static void roadrunner_pci_preinit(void)
+static void __init roadrunner_pci_preinit(void)
 {
        set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQT_LOW);
        set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQT_LOW);
index 9715ef506c24b363f09164ac2cde59c4acba9e92..060909870b505b582ee4a2ee684cdd9ddd311e67 100644 (file)
@@ -104,9 +104,6 @@ config MACH_DSMG600
          DSM-G600 RevA device. For more information on this platform,
          see http://www.nslu2-linux.org/wiki/DSMG600/HomePage
 
-#
-# Avila and IXDP share the same source for now. Will change in future
-#
 config ARCH_IXDP4XX
        bool
        depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435
index 64685da1462d644c35dbc66434f07cdb105a9e23..8112f726ffa0885e2edd505b3a0e17ad5e925b0f 100644 (file)
@@ -283,7 +283,7 @@ static struct irqaction ixp4xx_timer_irq = {
        .handler        = ixp4xx_timer_interrupt,
 };
 
-static void __init ixp4xx_timer_init(void)
+void __init ixp4xx_timer_init(void)
 {
        /* Reset/disable counter */
        *IXP4XX_OSRT1 = 0;
index 7bc94f3def1c8dc8d3b882de548747ced6c99c79..ad2e5b97966ecfbb221d6260489f320c5e64e087 100644 (file)
 
 #include <asm/mach/pci.h>
 
-extern void ixp4xx_pci_preinit(void);
-extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
-extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
-
 void __init coyote_pci_preinit(void)
 {
        set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW);
index 1caff65e22cc398ce5df87f87c64ea0207418e34..1e75e105c4f7fe4638d6da3d6224b6b79a6a811a 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
+#include <asm/mach/time.h>
 
 static struct flash_platform_data dsmg600_flash_data = {
        .map_name               = "cfi_probe",
@@ -128,6 +129,19 @@ static void dsmg600_power_off(void)
        gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH);
 }
 
+static void __init dsmg600_timer_init(void)
+{
+    /* The xtal on this machine is non-standard. */
+    ixp4xx_timer_freq = DSMG600_FREQ;
+
+    /* Call standard timer_init function. */
+    ixp4xx_timer_init();
+}
+
+static struct sys_timer dsmg600_timer = {
+    .init   = dsmg600_timer_init,
+};
+
 static void __init dsmg600_init(void)
 {
        ixp4xx_sys_init();
@@ -155,21 +169,13 @@ static void __init dsmg600_init(void)
 #endif
 }
 
-static void __init dsmg600_fixup(struct machine_desc *desc,
-                struct tag *tags, char **cmdline, struct meminfo *mi)
-{
-       /* The xtal on this machine is non-standard. */
-        ixp4xx_timer_freq = DSMG600_FREQ;
-}
-
 MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")
        /* Maintainer: www.nslu2-linux.org */
        .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
        .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
        .boot_params    = 0x00000100,
-       .fixup          = dsmg600_fixup,
        .map_io         = ixp4xx_map_io,
        .init_irq       = ixp4xx_init_irq,
-       .timer          = &ixp4xx_timer,
+       .timer          = &dsmg600_timer,
        .init_machine   = dsmg600_init,
 MACHINE_END
index 509a95a692a419b569a8514bc08cb87434f39031..d1e75b7dc3b1a1263ed545c3f3a43dace8037a60 100644 (file)
 
 #include <asm/mach/pci.h>
 
-extern void ixp4xx_pci_preinit(void);
-extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
-extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
-
 void __init ixdpg425_pci_preinit(void)
 {
        set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW);
index 9a31444d9214e82aea76b803c6bff835ce187829..78a17413ceca702549b1b6a0d7720bef782c6f67 100644 (file)
@@ -155,7 +155,8 @@ static void __init nas100d_init(void)
 
        pm_power_off = nas100d_power_off;
 
-       /* This is only useful on a modified machine, but it is valuable
+       /*
+        * This is only useful on a modified machine, but it is valuable
         * to have it first in order to see debug messages, and so that
         * it does *not* get removed if platform_add_devices fails!
         */
index 162c266e5f8fb8ff3883f4df29ddc69c7f80e3ab..9bf8ccbcaccfd009baa0c07da854e38cbda96010 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
+#include <asm/mach/time.h>
 
 static struct flash_platform_data nslu2_flash_data = {
        .map_name               = "cfi_probe",
@@ -49,26 +50,26 @@ static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = {
 static struct resource nslu2_led_resources[] = {
        {
                .name           = "ready",  /* green led */
-               .start          = NSLU2_LED_GRN,
-               .end            = NSLU2_LED_GRN,
+               .start          = NSLU2_LED_GRN_GPIO,
+               .end            = NSLU2_LED_GRN_GPIO,
                .flags          = IXP4XX_GPIO_HIGH,
        },
        {
                .name           = "status", /* red led */
-               .start          = NSLU2_LED_RED,
-               .end            = NSLU2_LED_RED,
+               .start          = NSLU2_LED_RED_GPIO,
+               .end            = NSLU2_LED_RED_GPIO,
                .flags          = IXP4XX_GPIO_HIGH,
        },
        {
                .name           = "disk-1",
-               .start          = NSLU2_LED_DISK1,
-               .end            = NSLU2_LED_DISK1,
+               .start          = NSLU2_LED_DISK1_GPIO,
+               .end            = NSLU2_LED_DISK1_GPIO,
                .flags          = IXP4XX_GPIO_LOW,
        },
        {
                .name           = "disk-2",
-               .start          = NSLU2_LED_DISK2,
-               .end            = NSLU2_LED_DISK2,
+               .start          = NSLU2_LED_DISK2_GPIO,
+               .end            = NSLU2_LED_DISK2_GPIO,
                .flags          = IXP4XX_GPIO_LOW,
        },
 };
@@ -157,10 +158,21 @@ static void nslu2_power_off(void)
        gpio_line_set(NSLU2_PO_GPIO, IXP4XX_GPIO_HIGH);
 }
 
-static void __init nslu2_init(void)
+static void __init nslu2_timer_init(void)
 {
-       ixp4xx_timer_freq = NSLU2_FREQ;
+    /* The xtal on this machine is non-standard. */
+    ixp4xx_timer_freq = NSLU2_FREQ;
+
+    /* Call standard timer_init function. */
+    ixp4xx_timer_init();
+}
 
+static struct sys_timer nslu2_timer = {
+    .init   = nslu2_timer_init,
+};
+
+static void __init nslu2_init(void)
+{
        ixp4xx_sys_init();
 
        nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
@@ -169,7 +181,8 @@ static void __init nslu2_init(void)
 
        pm_power_off = nslu2_power_off;
 
-       /* This is only useful on a modified machine, but it is valuable
+       /*
+        * This is only useful on a modified machine, but it is valuable
         * to have it first in order to see debug messages, and so that
         * it does *not* get removed if platform_add_devices fails!
         */
@@ -185,6 +198,6 @@ MACHINE_START(NSLU2, "Linksys NSLU2")
        .boot_params    = 0x00000100,
        .map_io         = ixp4xx_map_io,
        .init_irq       = ixp4xx_init_irq,
-       .timer          = &ixp4xx_timer,
+       .timer          = &nslu2_timer,
        .init_machine   = nslu2_init,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2410/bast.h b/arch/arm/mach-s3c2410/bast.h
deleted file mode 100644 (file)
index e985437..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* linux/arch/arm/mach-s3c2410/bast.h
-extern void bast_init_irq(void);
index bc308ceb91c31788c972b97b262dd72f3709f0dd..435adcce6482a369e5898de40bfc4bdfb690a6e1 100644 (file)
@@ -160,7 +160,7 @@ static struct platform_device *amlm5900_devices[] __initdata = {
 #endif
 };
 
-void __init amlm5900_map_io(void)
+static void __init amlm5900_map_io(void)
 {
        s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
        s3c24xx_init_clocks(0);
index c602aa39f9c4080671a6525c4e4cd2ecbde7d475..782b5814ced24411f356a4566c8f19265de3601b 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 #include <linux/sysdev.h>
 #include <linux/serial_core.h>
 #include <linux/platform_device.h>
@@ -29,6 +30,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
+#include <asm/arch/reset.h>
 #include <asm/arch/idle.h>
 
 #include <asm/arch/regs-clock.h>
@@ -38,6 +40,7 @@
 #include <asm/arch/regs-gpioj.h>
 #include <asm/arch/regs-dsc.h>
 #include <asm/arch/regs-spi.h>
+#include <asm/arch/regs-s3c2412.h>
 
 #include <asm/plat-s3c24xx/s3c2412.h>
 #include <asm/plat-s3c24xx/cpu.h>
@@ -106,6 +109,23 @@ static void s3c2412_idle(void)
        cpu_do_idle();
 }
 
+static void s3c2412_hard_reset(void)
+{
+       /* errata "Watch-dog/Software Reset Problem" specifies that
+        * this reset must be done with the SYSCLK sourced from
+        * EXTCLK instead of FOUT to avoid a glitch in the reset
+        * mechanism.
+        *
+        * See the watchdog section of the S3C2412 manual for more
+        * information on this fix.
+        */
+
+       __raw_writel(0x00, S3C2412_CLKSRC);
+       __raw_writel(S3C2412_SWRST_RESET, S3C2412_SWRST);
+
+       mdelay(1);
+}
+
 /* s3c2412_map_io
  *
  * register the standard cpu IO areas, and any passed in from the
@@ -122,6 +142,10 @@ void __init s3c2412_map_io(struct map_desc *mach_desc, int mach_size)
 
        s3c24xx_idle = s3c2412_idle;
 
+       /* set custom reset hook */
+
+       s3c24xx_reset_hook = s3c2412_hard_reset;
+
        /* register our io-tables */
 
        iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
index 5955efb5de8d8b4af1032ef739e2ca67c6d2ee82..58402948c47cd6c9a7099ef1ec233577ed18f833 100644 (file)
@@ -394,7 +394,7 @@ static int s3c2443_setrate_usbhost(struct clk *clk, unsigned long rate)
        return 0;
 }
 
-struct clk clk_usb_bus_host = {
+static struct clk clk_usb_bus_host = {
        .name           = "usb-bus-host-parent",
        .id             = -1,
        .parent         = &clk_esysclk,
@@ -758,7 +758,6 @@ static struct clk init_clocks[] = {
                .parent         = &clk_h,
                .enable         = s3c2443_clkcon_enable_h,
                .ctrlbit        = S3C2443_HCLKCON_CFC,
-               .ctrlbit        = S3C2443_HCLKCON_HSMMC,
        }, {
                .name           = "ssmc",
                .id             = -1,
index d7c038a0256bf9cfd82d9ea7d2b9f7e1676897a3..4cbf9468f654c970b226262c7e1d4a481436f9c5 100644 (file)
@@ -139,12 +139,12 @@ static u_int neponset_get_mctrl(struct uart_port *port)
        return ret;
 }
 
-static struct sa1100_port_fns neponset_port_fns __initdata = {
+static struct sa1100_port_fns neponset_port_fns __devinitdata = {
        .set_mctrl      = neponset_set_mctrl,
        .get_mctrl      = neponset_get_mctrl,
 };
 
-static int neponset_probe(struct platform_device *dev)
+static int __devinit neponset_probe(struct platform_device *dev)
 {
        sa1100_register_uart_fns(&neponset_port_fns);
 
index 5f472a8b406a554dc0033a6dedba517f8192c247..e7904bc92c73f846abda2b872f3c3e86139c0cfd 100644 (file)
@@ -379,7 +379,7 @@ config CPU_V7
        select CPU_CP15_MMU
        select CPU_HAS_ASID
        select CPU_COPY_V6 if MMU
-       select CPU_TLB_V6 if MMU
+       select CPU_TLB_V7 if MMU
 
 # Figure out what processor architecture version we should be using.
 # This defines the compiler instruction set which depends on the machine type.
@@ -498,6 +498,9 @@ config CPU_TLB_V4WBI
 config CPU_TLB_V6
        bool
 
+config CPU_TLB_V7
+       bool
+
 endif
 
 config CPU_HAS_ASID
index b5bd335ff14aad48f44331c0c17e5462f38d433d..762702765fc3f03d4e3c30ea52cb9cf0b0673793 100644 (file)
@@ -46,6 +46,7 @@ obj-$(CONFIG_CPU_TLB_V4WT)    += tlb-v4.o
 obj-$(CONFIG_CPU_TLB_V4WB)     += tlb-v4wb.o
 obj-$(CONFIG_CPU_TLB_V4WBI)    += tlb-v4wbi.o
 obj-$(CONFIG_CPU_TLB_V6)       += tlb-v6.o
+obj-$(CONFIG_CPU_TLB_V7)       += tlb-v7.o
 
 obj-$(CONFIG_CPU_ARM610)       += proc-arm6_7.o
 obj-$(CONFIG_CPU_ARM710)       += proc-arm6_7.o
index 36440c899583b9131143e9fc30a54fb8b9be70ab..074b7cb0774349d6a51e7c4d210e472a892c4e01 100644 (file)
@@ -630,7 +630,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 
        fs = get_fs();
        set_fs(KERNEL_DS);
-       if thumb_mode(regs) {
+       if (thumb_mode(regs)) {
                fault = __get_user(tinstr, (u16 *)(instrptr & ~1));
                if (!(fault))
                        instr = thumb2arm(tinstr);
index dd823dd4a374545031a11fd890bb8344411b8a14..718f4782ee8b943e14d6a4bb6dc9f515ff9c47b4 100644 (file)
@@ -256,7 +256,7 @@ __v7_proc_info:
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
        .long   cpu_v7_name
        .long   v7_processor_functions
-       .long   v6wbi_tlb_fns
+       .long   v7wbi_tlb_fns
        .long   v6_user_fns
        .long   v7_cache_fns
        .size   __v7_proc_info, . - __v7_proc_info
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S
new file mode 100644 (file)
index 0000000..b56dda8
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ *  linux/arch/arm/mm/tlb-v7.S
+ *
+ *  Copyright (C) 1997-2002 Russell King
+ *  Modified for ARMv7 by Catalin Marinas
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  ARM architecture version 6 TLB handling functions.
+ *  These assume a split I/D TLB.
+ */
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/page.h>
+#include <asm/tlbflush.h>
+#include "proc-macros.S"
+
+/*
+ *     v7wbi_flush_user_tlb_range(start, end, vma)
+ *
+ *     Invalidate a range of TLB entries in the specified address space.
+ *
+ *     - start - start address (may not be aligned)
+ *     - end   - end address (exclusive, may not be aligned)
+ *     - vma   - vma_struct describing address range
+ *
+ *     It is assumed that:
+ *     - the "Invalidate single entry" instruction will invalidate
+ *       both the I and the D TLBs on Harvard-style TLBs
+ */
+ENTRY(v7wbi_flush_user_tlb_range)
+       vma_vm_mm r3, r2                        @ get vma->vm_mm
+       mmid    r3, r3                          @ get vm_mm->context.id
+       dsb
+       mov     r0, r0, lsr #PAGE_SHIFT         @ align address
+       mov     r1, r1, lsr #PAGE_SHIFT
+       asid    r3, r3                          @ mask ASID
+       orr     r0, r3, r0, lsl #PAGE_SHIFT     @ Create initial MVA
+       mov     r1, r1, lsl #PAGE_SHIFT
+       vma_vm_flags r2, r2                     @ get vma->vm_flags
+1:
+       mcr     p15, 0, r0, c8, c6, 1           @ TLB invalidate D MVA (was 1)
+       tst     r2, #VM_EXEC                    @ Executable area ?
+       mcrne   p15, 0, r0, c8, c5, 1           @ TLB invalidate I MVA (was 1)
+       add     r0, r0, #PAGE_SZ
+       cmp     r0, r1
+       blo     1b
+       mov     ip, #0
+       mcr     p15, 0, ip, c7, c5, 6           @ flush BTAC/BTB
+       dsb
+       mov     pc, lr
+
+/*
+ *     v7wbi_flush_kern_tlb_range(start,end)
+ *
+ *     Invalidate a range of kernel TLB entries
+ *
+ *     - start - start address (may not be aligned)
+ *     - end   - end address (exclusive, may not be aligned)
+ */
+ENTRY(v7wbi_flush_kern_tlb_range)
+       dsb
+       mov     r0, r0, lsr #PAGE_SHIFT         @ align address
+       mov     r1, r1, lsr #PAGE_SHIFT
+       mov     r0, r0, lsl #PAGE_SHIFT
+       mov     r1, r1, lsl #PAGE_SHIFT
+1:
+       mcr     p15, 0, r0, c8, c6, 1           @ TLB invalidate D MVA
+       mcr     p15, 0, r0, c8, c5, 1           @ TLB invalidate I MVA
+       add     r0, r0, #PAGE_SZ
+       cmp     r0, r1
+       blo     1b
+       mov     r2, #0
+       mcr     p15, 0, r2, c7, c5, 6           @ flush BTAC/BTB
+       dsb
+       isb
+       mov     pc, lr
+
+       .section ".text.init", #alloc, #execinstr
+
+       .type   v7wbi_tlb_fns, #object
+ENTRY(v7wbi_tlb_fns)
+       .long   v7wbi_flush_user_tlb_range
+       .long   v7wbi_flush_kern_tlb_range
+       .long   v6wbi_tlb_flags
+       .size   v7wbi_tlb_fns, . - v7wbi_tlb_fns
index 0a3067452cd29767544cc4b3198d7eabc0a32b7c..260fe29d73f576d4e6d8df64420c3ed8eb8f283f 100644 (file)
@@ -273,4 +273,7 @@ static inline flag float64_lt_nocheck(float64 a, float64 b)
 extern flag float32_is_nan( float32 a );
 extern flag float64_is_nan( float64 a );
 
+extern int32 float64_to_uint32( struct roundingData *roundData, float64 a );
+extern int32 float64_to_uint32_round_to_zero( float64 a );
+
 #endif
index 898500718249dc59da11a9b76359c0e72481c3a0..7791da791f5f936cb54c7d1f7cf38832652007e5 100644 (file)
@@ -257,8 +257,13 @@ static void em_stop(void)
  */
 static void em_route_irq(int irq, unsigned int cpu)
 {
-       irq_desc[irq].affinity = cpumask_of_cpu(cpu);
-       irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu));
+       struct irq_desc *desc = irq_desc + irq;
+       cpumask_t mask = cpumask_of_cpu(cpu);
+
+       spin_lock_irq(&desc->lock);
+       desc->affinity = mask;
+       desc->chip->set_affinity(irq, mask);
+       spin_unlock_irq(&desc->lock);
 }
 
 static int em_setup(void)
index 11ba75a05220bc7cfefe8febcbfd19b7c29b9315..de7688cfd573e6f73373b754efc1aecbcdf5571c 100644 (file)
@@ -288,9 +288,9 @@ asmlinkage void syscall_print(void *dummy,...)
 int kernel_execve(const char *filename, char *const argv[], char *const envp[])
 {
        register long res __asm__("er0");
+       register char *const *_c __asm__("er3") = envp;
+       register char *const *_b __asm__("er2") = argv;
        register const char * _a __asm__("er1") = filename;
-       register void *_b __asm__("er2") = argv;
-       register void *_c __asm__("er3") = envp;
        __asm__ __volatile__ ("mov.l %1,er0\n\t"
                        "trapa  #0\n\t"
                        : "=r" (res)
index 300e3279ca5abb5b25c3afab13fd8748dba41382..f97183011c2cb501ccf6cb07de9d12a87e00d93a 100644 (file)
@@ -136,7 +136,7 @@ void show_stack(struct task_struct *task, unsigned long *esp)
        printk("\nCall Trace:");
        i = 0;
        stack = esp;
-       while (((unsigned long)stack & (THREAD_SIZE - 1)) == 0) {
+       while (((unsigned long)stack & (THREAD_SIZE - 1)) != 0) {
                addr = *stack++;
                /*
                 * If the address is either in the text segment of the
index 1cf466df330ad567c26355aeda582b98196534ae..7202b98aac4f2f53516e421ef935545538e5466a 100644 (file)
@@ -734,10 +734,13 @@ void mtrr_ap_init(void)
  */
 void mtrr_save_state(void)
 {
-       if (smp_processor_id() == 0)
+       int cpu = get_cpu();
+
+       if (cpu == 0)
                mtrr_save_fixed_ranges(NULL);
        else
                smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1);
+       put_cpu();
 }
 
 static int __init mtrr_init_finialize(void)
index 83f825f2e2d7db0ee5b5a002d78792219fb64b8f..d865d041bea1dc7c25d9a8e1eaa63f54c6812ea0 100644 (file)
@@ -478,7 +478,7 @@ static int __init microcode_dev_init (void)
        return 0;
 }
 
-static void __exit microcode_dev_exit (void)
+static void microcode_dev_exit (void)
 {
        misc_deregister(&microcode_dev);
 }
index 50dfc65319cda0392ae1c79152d148b694fa7c86..5513f8d5b5becff34c9e77cceb77835aeb90b0ec 100644 (file)
@@ -89,6 +89,14 @@ static int __init set_bios_reboot(struct dmi_system_id *d)
 }
 
 static struct dmi_system_id __initdata reboot_dmi_table[] = {
+       {       /* Handle problems with rebooting on Dell E520's */
+               .callback = set_bios_reboot,
+               .ident = "Dell E520",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"),
+               },
+       },
        {       /* Handle problems with rebooting on Dell 1300's */
                .callback = set_bios_reboot,
                .ident = "Dell PowerEdge 1300",
index 08f07a74a9d3753184ab7a3096697eaac4d2cb98..88baed1e7e83a1469ecc33f1ed5e6e1c17a00af4 100644 (file)
@@ -943,10 +943,9 @@ exit:
 
 static void smp_tune_scheduling(void)
 {
-       unsigned long cachesize;       /* kB   */
-
        if (cpu_khz) {
-               cachesize = boot_cpu_data.x86_cache_size;
+               /* cache size in kB */
+               long cachesize = boot_cpu_data.x86_cache_size;
 
                if (cachesize > 0)
                        max_cache_size = cachesize * 1024;
index c8726c424b3549a2b45aaa839dc21a3d464769ba..c12720d7cbc50b8b0bc0804ba19df993128a574d 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/bootmem.h>
 #include <linux/mm.h>
 #include <linux/highmem.h>
+#include <linux/sched.h>
 #include <asm/vmi.h>
 #include <asm/io.h>
 #include <asm/fixmap.h>
index a7c0783b269a5ecaf9d74feaa4d8b8350291a7df..11b7a51566a8cb4715dc606bf82534e374a210c8 100644 (file)
@@ -154,7 +154,7 @@ static int allocate_msrs(void)
        size_t counters_size = sizeof(struct op_msr) * model->num_counters;
 
        int i;
-       for_each_online_cpu(i) {
+       for_each_possible_cpu(i) {
                cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL);
                if (!cpu_msrs[i].counters) {
                        success = 0;
@@ -211,8 +211,14 @@ static int nmi_setup(void)
        /* Assume saved/restored counters are the same on all CPUs */
        model->fill_in_addresses(&cpu_msrs[0]);
        for_each_possible_cpu (cpu) {
-               if (cpu != 0)
-                       cpu_msrs[cpu] = cpu_msrs[0];
+               if (cpu != 0) {
+                       memcpy(cpu_msrs[cpu].counters, cpu_msrs[0].counters,
+                               sizeof(struct op_msr) * model->num_counters);
+
+                       memcpy(cpu_msrs[cpu].controls, cpu_msrs[0].controls,
+                               sizeof(struct op_msr) * model->num_controls);
+               }
+
        }
        on_each_cpu(nmi_save_registers, NULL, 0, 1);
        on_each_cpu(nmi_cpu_setup, NULL, 0, 1);
index b62eafb997bce2b1bf4dcd379ef06ca954bceae7..b95b42950ed447d2774fe2aac9e6e66830d91960 100644 (file)
@@ -436,3 +436,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
                        pci_early_fixup_cyrix_5530);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
                        pci_early_fixup_cyrix_5530);
+
+/*
+ * Siemens Nixdorf AG FSC Multiprocessor Interrupt Controller:
+ * prevent update of the BAR0, which doesn't look like a normal BAR.
+ */
+static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev)
+{
+       dev->resource[0].flags |= IORESOURCE_PCI_FIXED;
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015,
+                         pci_siemens_interrupt_controller);
index b8536c7c0877577541f1a7ab0b977f29a44b82b0..85cdd23b0447e2dafd1ed517a2a2cd66910da365 100644 (file)
@@ -355,8 +355,9 @@ config RMW_INSNS
          adventurous.
 
 config SINGLE_MEMORY_CHUNK
-       bool "Use one physical chunk of memory only"
-       depends on ADVANCED && !SUN3
+       bool "Use one physical chunk of memory only" if ADVANCED && !SUN3
+       default y if SUN3
+       select NEED_MULTIPLE_NODES
        help
          Ignore all but the first contiguous chunk of physical memory for VM
          purposes.  This will save a few bytes kernel size and may speed up
@@ -377,6 +378,14 @@ config 060_WRITETHROUGH
          is hardwired on.  The 53c710 SCSI driver is known to suffer from
          this problem.
 
+config ARCH_DISCONTIGMEM_ENABLE
+       def_bool !SINGLE_MEMORY_CHUNK
+
+config NODES_SHIFT
+       int
+       default "3"
+       depends on !SINGLE_MEMORY_CHUNK
+
 source "mm/Kconfig"
 
 endmenu
index c20831a7e1a9e1a064261ab861d5ea960ea322a9..aa383a5ea7acbcd34191e77867a3f969c5635c48 100644 (file)
@@ -19,6 +19,7 @@ COMPILE_ARCH = $(shell uname -m)
 # override top level makefile
 AS += -m68020
 LDFLAGS := -m m68kelf
+LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
 ifneq ($(COMPILE_ARCH),$(ARCH))
        # prefix for cross-compiling binaries
        CROSS_COMPILE = m68k-linux-gnu-
index 0b68ab8d63d1d5a120f9e4403b317ecdbfd71308..a806208c7fb5fadea24701d9d7b4dab68582aee6 100644 (file)
@@ -9,13 +9,12 @@ else
 endif
 extra-y        += vmlinux.lds
 
-obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o \
+obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
           sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o
 
 devres-y = ../../../kernel/irq/devres.o
 
 obj-$(CONFIG_PCI)      += bios32.o
-obj-$(CONFIG_MODULES)  += module.o
 obj-y$(CONFIG_MMU_SUN3) += dma.o       # no, it's not a typo
 
 EXTRA_AFLAGS := -traditional
index 3b1a2ff61ddcf18846fc108859e964a6d28110fd..774862bc6977297c0099c4bdfa96980820dcf1df 100644 (file)
@@ -1,3 +1,9 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+
 #include <linux/moduleloader.h>
 #include <linux/elf.h>
 #include <linux/vmalloc.h>
@@ -11,6 +17,8 @@
 #define DEBUGP(fmt...)
 #endif
 
+#ifdef CONFIG_MODULES
+
 void *module_alloc(unsigned long size)
 {
        if (size == 0)
@@ -118,11 +126,32 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 
 int module_finalize(const Elf_Ehdr *hdr,
                    const Elf_Shdr *sechdrs,
-                   struct module *me)
+                   struct module *mod)
 {
+       module_fixup(mod, mod->arch.fixup_start, mod->arch.fixup_end);
+
        return 0;
 }
 
 void module_arch_cleanup(struct module *mod)
 {
 }
+
+#endif /* CONFIG_MODULES */
+
+void module_fixup(struct module *mod, struct m68k_fixup_info *start,
+                 struct m68k_fixup_info *end)
+{
+       struct m68k_fixup_info *fixup;
+
+       for (fixup = start; fixup < end; fixup++) {
+               switch (fixup->type) {
+               case m68k_fixup_memoffset:
+                       *(u32 *)fixup->addr = m68k_memoffset;
+                       break;
+               case m68k_fixup_vnode_shift:
+                       *(u16 *)fixup->addr += m68k_virt_to_node_shift;
+                       break;
+               }
+       }
+}
diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/kernel/module.lds
new file mode 100644 (file)
index 0000000..fda94fa
--- /dev/null
@@ -0,0 +1,7 @@
+SECTIONS {
+       .m68k_fixup : {
+               __start_fixup = .;
+               *(.m68k_fixup)
+               __stop_fixup = .;
+       }
+}
index 610319356691d2fda4d8796cbcdffa3b9e18b3e7..215c7bd43924f43a21ce8b55d90ef3acc54e6da2 100644 (file)
@@ -60,14 +60,12 @@ extern unsigned long availmem;
 int m68k_num_memory;
 int m68k_realnum_memory;
 EXPORT_SYMBOL(m68k_realnum_memory);
-#ifdef CONFIG_SINGLE_MEMORY_CHUNK
 unsigned long m68k_memoffset;
 EXPORT_SYMBOL(m68k_memoffset);
-#endif
 struct mem_info m68k_memory[NUM_MEMINFO];
 EXPORT_SYMBOL(m68k_memory);
 
-static struct mem_info m68k_ramdisk;
+struct mem_info m68k_ramdisk;
 
 static char m68k_command_line[CL_SIZE];
 
@@ -208,9 +206,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
 void __init setup_arch(char **cmdline_p)
 {
        extern int _etext, _edata, _end;
-#ifndef CONFIG_SUN3
-       unsigned long endmem, startmem;
-#endif
        int i;
 
        /* The bootinfo is located right after the kernel bss */
@@ -320,30 +315,16 @@ void __init setup_arch(char **cmdline_p)
                panic("No configuration setup");
        }
 
-#ifndef CONFIG_SUN3
-       startmem= m68k_memory[0].addr;
-       endmem = startmem + m68k_memory[0].size;
-       high_memory = (void *)PAGE_OFFSET;
-       for (i = 0; i < m68k_num_memory; i++) {
-               m68k_memory[i].size &= MASK_256K;
-               if (m68k_memory[i].addr < startmem)
-                       startmem = m68k_memory[i].addr;
-               if (m68k_memory[i].addr+m68k_memory[i].size > endmem)
-                       endmem = m68k_memory[i].addr+m68k_memory[i].size;
-               high_memory += m68k_memory[i].size;
-       }
-
-       availmem += init_bootmem_node(NODE_DATA(0), availmem >> PAGE_SHIFT,
-                                     startmem >> PAGE_SHIFT, endmem >> PAGE_SHIFT);
-
-       for (i = 0; i < m68k_num_memory; i++)
-               free_bootmem(m68k_memory[i].addr, m68k_memory[i].size);
-
-       reserve_bootmem(m68k_memory[0].addr, availmem - m68k_memory[0].addr);
+       paging_init();
 
+#ifndef CONFIG_SUN3
+       for (i = 1; i < m68k_num_memory; i++)
+               free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
+                                 m68k_memory[i].size);
 #ifdef CONFIG_BLK_DEV_INITRD
        if (m68k_ramdisk.size) {
-               reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size);
+               reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)),
+                                    m68k_ramdisk.addr, m68k_ramdisk.size);
                initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr);
                initrd_end = initrd_start + m68k_ramdisk.size;
                printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end);
@@ -362,8 +343,6 @@ void __init setup_arch(char **cmdline_p)
 
 #endif /* !CONFIG_SUN3 */
 
-       paging_init();
-
 /* set ISA defs early as possible */
 #if defined(CONFIG_ISA) && defined(MULTI_ISA)
 #if defined(CONFIG_Q40)
index 78f139226a1ba1dee2fce98e7c1e7a7ee2e3af3c..40f02b128f22bb3a62ebce9d66349f3f78dc7fdc 100644 (file)
@@ -60,6 +60,11 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  .m68k_fixup : {
+       __start_fixup = .;
+       *(.m68k_fixup)
+       __stop_fixup = .;
+  }
   SECURITY_INIT
 #ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(8192);
index c8999b2db23b01f86f0aff8d269b78894147f623..f06425b6d20643a9fc32d74bfdc5af6c3487a394 100644 (file)
@@ -54,6 +54,11 @@ __init_begin = .;
        __con_initcall_start = .;
        .con_initcall.init : { *(.con_initcall.init) }
        __con_initcall_end = .;
+       .m68k_fixup : {
+               __start_fixup = .;
+               *(.m68k_fixup)
+               __stop_fixup = .;
+       }
        SECURITY_INIT
 #ifdef CONFIG_BLK_DEV_INITRD
        . = ALIGN(8192);
index 7a5bed5bdc574d11a29daaa65a859655a2ede48f..e8a57138b4a6e54980247110f56c7310a32dad4f 100644 (file)
@@ -71,7 +71,7 @@ void mac_debugging_short(int pos, short num)
 
        /* calculate current offset */
        pengoffset = (unsigned char *)mac_videobase +
-               (150+line*2) * mac_rowbytes) + 80 * peng;
+               (150+line*2) * mac_rowbytes + 80 * peng;
 
        pptr = pengoffset;
 
index ab90213e5c54030bb1872b68e3342c31c0fb40b7..f1de19e1dde66f50317db6f7a40992fdba481f2f 100644 (file)
@@ -7,6 +7,7 @@
  *  to motorola.c and sun3mmu.c
  */
 
+#include <linux/module.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
+static bootmem_data_t __initdata bootmem_data[MAX_NUMNODES];
+
+pg_data_t pg_data_map[MAX_NUMNODES];
+EXPORT_SYMBOL(pg_data_map);
+
+int m68k_virt_to_node_shift;
+
+#ifndef CONFIG_SINGLE_MEMORY_CHUNK
+pg_data_t *pg_data_table[65];
+EXPORT_SYMBOL(pg_data_table);
+#endif
+
+void m68k_setup_node(int node)
+{
+#ifndef CONFIG_SINGLE_MEMORY_CHUNK
+       struct mem_info *info = m68k_memory + node;
+       int i, end;
+
+       i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift();
+       end = (unsigned long)phys_to_virt(info->addr + info->size - 1) >> __virt_to_node_shift();
+       for (; i <= end; i++) {
+               if (pg_data_table[i])
+                       printk("overlap at %u for chunk %u\n", i, node);
+               pg_data_table[i] = pg_data_map + node;
+       }
+#endif
+       pg_data_map[node].bdata = bootmem_data + node;
+       node_set_online(node);
+}
+
+
 /*
  * ZERO_PAGE is a special page that is used for zero-initialized
  * data and COW.
@@ -40,52 +72,51 @@ void *empty_zero_page;
 
 void show_mem(void)
 {
-    unsigned long i;
-    int free = 0, total = 0, reserved = 0, shared = 0;
-    int cached = 0;
-
-    printk("\nMem-info:\n");
-    show_free_areas();
-    printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-    i = max_mapnr;
-    while (i-- > 0) {
-       total++;
-       if (PageReserved(mem_map+i))
-           reserved++;
-       else if (PageSwapCache(mem_map+i))
-           cached++;
-       else if (!page_count(mem_map+i))
-           free++;
-       else
-           shared += page_count(mem_map+i) - 1;
-    }
-    printk("%d pages of RAM\n",total);
-    printk("%d free pages\n",free);
-    printk("%d reserved pages\n",reserved);
-    printk("%d pages shared\n",shared);
-    printk("%d pages swap cached\n",cached);
+       pg_data_t *pgdat;
+       int free = 0, total = 0, reserved = 0, shared = 0;
+       int cached = 0;
+       int i;
+
+       printk("\nMem-info:\n");
+       show_free_areas();
+       printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
+       for_each_online_pgdat(pgdat) {
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat->node_mem_map + i;
+                       total++;
+                       if (PageReserved(page))
+                               reserved++;
+                       else if (PageSwapCache(page))
+                               cached++;
+                       else if (!page_count(page))
+                               free++;
+                       else
+                               shared += page_count(page) - 1;
+               }
+       }
+       printk("%d pages of RAM\n",total);
+       printk("%d free pages\n",free);
+       printk("%d reserved pages\n",reserved);
+       printk("%d pages shared\n",shared);
+       printk("%d pages swap cached\n",cached);
 }
 
 extern void init_pointer_table(unsigned long ptable);
 
 /* References to section boundaries */
 
-extern char _text, _etext, _edata, __bss_start, _end;
-extern char __init_begin, __init_end;
+extern char _text[], _etext[];
+extern char __init_begin[], __init_end[];
 
 extern pmd_t *zero_pgtable;
 
 void __init mem_init(void)
 {
+       pg_data_t *pgdat;
        int codepages = 0;
        int datapages = 0;
        int initpages = 0;
-       unsigned long tmp;
-#ifndef CONFIG_SUN3
        int i;
-#endif
-
-       max_mapnr = num_physpages = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT);
 
 #ifdef CONFIG_ATARI
        if (MACH_IS_ATARI)
@@ -93,19 +124,25 @@ void __init mem_init(void)
 #endif
 
        /* this will put all memory onto the freelists */
-       totalram_pages = free_all_bootmem();
-
-       for (tmp = PAGE_OFFSET ; tmp < (unsigned long)high_memory; tmp += PAGE_SIZE) {
-               if (PageReserved(virt_to_page(tmp))) {
-                       if (tmp >= (unsigned long)&_text
-                           && tmp < (unsigned long)&_etext)
+       totalram_pages = num_physpages = 0;
+       for_each_online_pgdat(pgdat) {
+               num_physpages += pgdat->node_present_pages;
+
+               totalram_pages += free_all_bootmem_node(pgdat);
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat->node_mem_map + i;
+                       char *addr = page_to_virt(page);
+
+                       if (!PageReserved(page))
+                               continue;
+                       if (addr >= _text &&
+                           addr < _etext)
                                codepages++;
-                       else if (tmp >= (unsigned long) &__init_begin
-                                && tmp < (unsigned long) &__init_end)
+                       else if (addr >= __init_begin &&
+                                addr < __init_end)
                                initpages++;
                        else
                                datapages++;
-                       continue;
                }
        }
 
@@ -124,7 +161,7 @@ void __init mem_init(void)
 
        printk("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)\n",
               (unsigned long)nr_free_pages() << (PAGE_SHIFT-10),
-              max_mapnr << (PAGE_SHIFT-10),
+              totalram_pages << (PAGE_SHIFT-10),
               codepages << (PAGE_SHIFT-10),
               datapages << (PAGE_SHIFT-10),
               initpages << (PAGE_SHIFT-10));
index 13c0b4ad01eb5977384b333a7f761303bfa1b56c..b7473525b43179fa9066d3a1d978120f1caac164 100644 (file)
@@ -127,67 +127,6 @@ int free_pointer_table (pmd_t *ptable)
        return 0;
 }
 
-#ifdef DEBUG_INVALID_PTOV
-int mm_inv_cnt = 5;
-#endif
-
-#ifndef CONFIG_SINGLE_MEMORY_CHUNK
-/*
- * The following two routines map from a physical address to a kernel
- * virtual address and vice versa.
- */
-unsigned long mm_vtop(unsigned long vaddr)
-{
-       int i=0;
-       unsigned long voff = (unsigned long)vaddr - PAGE_OFFSET;
-
-       do {
-               if (voff < m68k_memory[i].size) {
-#ifdef DEBUGPV
-                       printk ("VTOP(%p)=%lx\n", vaddr,
-                               m68k_memory[i].addr + voff);
-#endif
-                       return m68k_memory[i].addr + voff;
-               }
-               voff -= m68k_memory[i].size;
-       } while (++i < m68k_num_memory);
-
-       /* As a special case allow `__pa(high_memory)'.  */
-       if (voff == 0)
-               return m68k_memory[i-1].addr + m68k_memory[i-1].size;
-
-       return -1;
-}
-EXPORT_SYMBOL(mm_vtop);
-
-unsigned long mm_ptov (unsigned long paddr)
-{
-       int i = 0;
-       unsigned long poff, voff = PAGE_OFFSET;
-
-       do {
-               poff = paddr - m68k_memory[i].addr;
-               if (poff < m68k_memory[i].size) {
-#ifdef DEBUGPV
-                       printk ("PTOV(%lx)=%lx\n", paddr, poff + voff);
-#endif
-                       return poff + voff;
-               }
-               voff += m68k_memory[i].size;
-       } while (++i < m68k_num_memory);
-
-#ifdef DEBUG_INVALID_PTOV
-       if (mm_inv_cnt > 0) {
-               mm_inv_cnt--;
-               printk("Invalid use of phys_to_virt(0x%lx) at 0x%p!\n",
-                       paddr, __builtin_return_address(0));
-       }
-#endif
-       return -1;
-}
-EXPORT_SYMBOL(mm_ptov);
-#endif
-
 /* invalidate page in both caches */
 static inline void clear040(unsigned long paddr)
 {
@@ -354,15 +293,3 @@ void cache_push (unsigned long paddr, int len)
 }
 EXPORT_SYMBOL(cache_push);
 
-#ifndef CONFIG_SINGLE_MEMORY_CHUNK
-int mm_end_of_chunk (unsigned long addr, int len)
-{
-       int i;
-
-       for (i = 0; i < m68k_num_memory; i++)
-               if (m68k_memory[i].addr + m68k_memory[i].size == addr + len)
-                       return 1;
-       return 0;
-}
-EXPORT_SYMBOL(mm_end_of_chunk);
-#endif
index afcccdc6ad45db38b9b656b08cd5e5e7f3a2e95d..7d571a2b44dd0bd2d61e6d3dcc9239146fe5d4c4 100644 (file)
@@ -43,6 +43,11 @@ unsigned long mm_cachebits;
 EXPORT_SYMBOL(mm_cachebits);
 #endif
 
+/* size of memory already mapped in head.S */
+#define INIT_MAPPED_SIZE       (4UL<<20)
+
+extern unsigned long availmem;
+
 static pte_t * __init kernel_page_table(void)
 {
        pte_t *ptablep;
@@ -98,19 +103,20 @@ static pmd_t * __init kernel_ptr_table(void)
        return last_pgtable;
 }
 
-static unsigned long __init
-map_chunk (unsigned long addr, long size)
+static void __init map_node(int node)
 {
 #define PTRTREESIZE (256*1024)
 #define ROOTTREESIZE (32*1024*1024)
-       static unsigned long virtaddr = PAGE_OFFSET;
-       unsigned long physaddr;
+       unsigned long physaddr, virtaddr, size;
        pgd_t *pgd_dir;
        pmd_t *pmd_dir;
        pte_t *pte_dir;
 
-       physaddr = (addr | m68k_supervisor_cachemode |
-                   _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
+       size = m68k_memory[node].size;
+       physaddr = m68k_memory[node].addr;
+       virtaddr = (unsigned long)phys_to_virt(physaddr);
+       physaddr |= m68k_supervisor_cachemode |
+                   _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY;
        if (CPU_IS_040_OR_060)
                physaddr |= _PAGE_GLOBAL040;
 
@@ -190,8 +196,6 @@ map_chunk (unsigned long addr, long size)
 #ifdef DEBUG
        printk("\n");
 #endif
-
-       return virtaddr;
 }
 
 /*
@@ -200,15 +204,16 @@ map_chunk (unsigned long addr, long size)
  */
 void __init paging_init(void)
 {
-       int chunk;
-       unsigned long mem_avail = 0;
        unsigned long zones_size[MAX_NR_ZONES] = { 0, };
+       unsigned long min_addr, max_addr;
+       unsigned long addr, size, end;
+       int i;
 
 #ifdef DEBUG
        {
                extern unsigned long availmem;
-               printk ("start of paging_init (%p, %lx, %lx, %lx)\n",
-                       kernel_pg_dir, availmem, start_mem, end_mem);
+               printk ("start of paging_init (%p, %lx)\n",
+                       kernel_pg_dir, availmem);
        }
 #endif
 
@@ -222,24 +227,62 @@ void __init paging_init(void)
                        pgprot_val(protection_map[i]) |= _PAGE_CACHE040;
        }
 
+       min_addr = m68k_memory[0].addr;
+       max_addr = min_addr + m68k_memory[0].size;
+       for (i = 1; i < m68k_num_memory;) {
+               if (m68k_memory[i].addr < min_addr) {
+                       printk("Ignoring memory chunk at 0x%lx:0x%lx before the first chunk\n",
+                               m68k_memory[i].addr, m68k_memory[i].size);
+                       printk("Fix your bootloader or use a memfile to make use of this area!\n");
+                       m68k_num_memory--;
+                       memmove(m68k_memory + i, m68k_memory + i + 1,
+                               (m68k_num_memory - i) * sizeof(struct mem_info));
+                       continue;
+               }
+               addr = m68k_memory[i].addr + m68k_memory[i].size;
+               if (addr > max_addr)
+                       max_addr = addr;
+               i++;
+       }
+       m68k_memoffset = min_addr - PAGE_OFFSET;
+       m68k_virt_to_node_shift = fls(max_addr - min_addr - 1) - 6;
+
+       module_fixup(NULL, __start_fixup, __stop_fixup);
+       flush_icache();
+
+       high_memory = phys_to_virt(max_addr);
+
+       min_low_pfn = availmem >> PAGE_SHIFT;
+       max_low_pfn = max_addr >> PAGE_SHIFT;
+
+       for (i = 0; i < m68k_num_memory; i++) {
+               addr = m68k_memory[i].addr;
+               end = addr + m68k_memory[i].size;
+               m68k_setup_node(i);
+               availmem = PAGE_ALIGN(availmem);
+               availmem += init_bootmem_node(NODE_DATA(i),
+                                             availmem >> PAGE_SHIFT,
+                                             addr >> PAGE_SHIFT,
+                                             end >> PAGE_SHIFT);
+       }
+
        /*
         * Map the physical memory available into the kernel virtual
-        * address space.  It may allocate some memory for page
-        * tables and thus modify availmem.
+        * address space. First initialize the bootmem allocator with
+        * the memory we already mapped, so map_node() has something
+        * to allocate.
         */
+       addr = m68k_memory[0].addr;
+       size = m68k_memory[0].size;
+       free_bootmem_node(NODE_DATA(0), availmem, min(INIT_MAPPED_SIZE, size) - (availmem - addr));
+       map_node(0);
+       if (size > INIT_MAPPED_SIZE)
+               free_bootmem_node(NODE_DATA(0), addr + INIT_MAPPED_SIZE, size - INIT_MAPPED_SIZE);
 
-       for (chunk = 0; chunk < m68k_num_memory; chunk++) {
-               mem_avail = map_chunk (m68k_memory[chunk].addr,
-                                      m68k_memory[chunk].size);
-
-       }
+       for (i = 1; i < m68k_num_memory; i++)
+               map_node(i);
 
        flush_tlb_all();
-#ifdef DEBUG
-       printk ("memory available is %ldKB\n", mem_avail >> 10);
-       printk ("start_mem is %#lx\nvirtual_end is %#lx\n",
-               start_mem, end_mem);
-#endif
 
        /*
         * initialize the bad page table and bad page to point
@@ -256,14 +299,11 @@ void __init paging_init(void)
 #ifdef DEBUG
        printk ("before free_area_init\n");
 #endif
-       zones_size[ZONE_DMA] = (mach_max_dma_address < (unsigned long)high_memory ?
-                               (mach_max_dma_address+1) : (unsigned long)high_memory);
-       zones_size[ZONE_NORMAL] = (unsigned long)high_memory - zones_size[0];
-
-       zones_size[ZONE_DMA] = (zones_size[ZONE_DMA] - PAGE_OFFSET) >> PAGE_SHIFT;
-       zones_size[ZONE_NORMAL] >>= PAGE_SHIFT;
-
-       free_area_init(zones_size);
+       for (i = 0; i < m68k_num_memory; i++) {
+               zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
+               free_area_init_node(i, pg_data_map + i, zones_size,
+                                   m68k_memory[i].addr >> PAGE_SHIFT, NULL);
+       }
 }
 
 extern char __init_begin, __init_end;
index 4851b8437a87f69d1d6ab9659d534819d367aca7..c0fbd278fbb151e30821a66bb25b4c902f2573ee 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/contregs.h>
 #include <asm/movs.h>
 #include <asm/pgtable.h>
+#include <asm/pgalloc.h>
 #include <asm/sun3-head.h>
 #include <asm/sun3mmu.h>
 #include <asm/rtc.h>
@@ -127,6 +128,7 @@ void __init sun3_bootmem_alloc(unsigned long memory_start, unsigned long memory_
        high_memory = (void *)memory_end;
        availmem = memory_start;
 
+       m68k_setup_node(0);
        availmem += init_bootmem_node(NODE_DATA(0), start_page, 0, num_pages);
        availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK;
 
index 2604f2c9a96e0c89359553ec747e25a65d78da89..342579cfdc01d3b37ca739b96c862753734cc202 100644 (file)
@@ -36,7 +36,7 @@
 #define TIMEOUT       0xffffff
 
 static int remoteDebugInitialized = 0;
-static void debugInit(int baud)
+static void debugInit(int baud);
 
 int putDebugChar(unsigned char c)
 {
index 7f94f26d35ae054abc028298e6aacc77321486c1..1421d34535efecf29475c631492010480feb4942 100644 (file)
@@ -71,19 +71,19 @@ static inline void pci0WriteConfigReg(unsigned int offset, unsigned int data)
 }
 
 static struct resource ocelot_mem_resource = {
-       start   = GT_PCI_MEM_BASE;
-       end     = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1;
+       .start  = GT_PCI_MEM_BASE,
+       .end    = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1,
 };
 
 static struct resource ocelot_io_resource = {
-       start   = GT_PCI_IO_BASE;
-       end     = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1;
+       .start  = GT_PCI_IO_BASE,
+       .end    = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1,
 };
 
 static struct pci_controller ocelot_pci_controller = {
-       .pci_ops        = gt64xxx_pci0_ops;
-       .mem_resource   = &ocelot_mem_resource;
-       .io_resource    = &ocelot_io_resource;
+       .pci_ops        = gt64xxx_pci0_ops,
+       .mem_resource   = &ocelot_mem_resource,
+       .io_resource    = &ocelot_io_resource,
 };
 
 static int __init ocelot_pcibios_init(void)
index 6238b5875fd1c746f2f5a9fc838167bb0f3443d8..fbafd965dcd298049338d84d9b8fca406ab27825 100644 (file)
@@ -142,7 +142,6 @@ drivers-$(CONFIG_OPROFILE)  += arch/powerpc/oprofile/
 
 # Default to zImage, override when needed
 defaultimage-y                 := zImage
-defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
 defaultimage-$(CONFIG_DEFAULT_UIMAGE) := uImage
 KBUILD_IMAGE := $(defaultimage-y)
 all: $(KBUILD_IMAGE)
index 83788986b93b3418adb02d1b352e1a277b009f49..ff2701949ee18616021fee3af3332f7043a25ba7 100644 (file)
 #      bootloader and increase compatibility with OpenFirmware.
 #
 #      To this end we need to define BOOTCC, etc, as the tools
-#      needed to build the 32 bit image.  These are normally HOSTCC,
-#      but may be a third compiler if, for example, you are cross
-#      compiling from an intel box.  Once the 64bit ppc gcc is
-#      stable it will probably simply be a compiler switch to
-#      compile for 32bit mode.
+#      needed to build the 32 bit image.  That's normally the same
+#      compiler for the rest of the kernel, with the -m32 flag added.
 #      To make it easier to setup a cross compiler,
 #      CROSS32_COMPILE is setup as a prefix just like CROSS_COMPILE
 #      in the toplevel makefile.
 
 all: $(obj)/zImage
 
-HOSTCC         := gcc
-BOOTCFLAGS     := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \
-                  $(shell $(CROSS32CC) -print-file-name=include) -fPIC
+BOOTCFLAGS    := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+                -fno-strict-aliasing -Os -msoft-float -pipe \
+                -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \
+                -isystem $(shell $(CROSS32CC) -print-file-name=include)
 BOOTAFLAGS     := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
 
 ifeq ($(call cc-option-yn, -fstack-protector),y)
@@ -33,8 +31,8 @@ endif
 
 BOOTCFLAGS     += -I$(obj) -I$(srctree)/$(obj)
 
-$(obj)/44x.o: BOOTCFLAGS += -Wa,-mbooke
-$(obj)/ebony.o: BOOTCFLAGS += -Wa,-mbooke
+$(obj)/44x.o: BOOTCFLAGS += -mcpu=440
+$(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
 
 zlib       := inffast.c inflate.c inftrees.c
 zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
@@ -136,6 +134,7 @@ image-$(CONFIG_PPC_EFIKA)           += zImage.chrp
 image-$(CONFIG_PPC_PMAC)               += zImage.pmac
 image-$(CONFIG_PPC_HOLLY)              += zImage.holly-elf
 image-$(CONFIG_PPC_PRPMC2800)          += zImage.prpmc2800
+image-$(CONFIG_PPC_ISERIES)            += zImage.iseries
 image-$(CONFIG_DEFAULT_UIMAGE)         += uImage
 
 ifneq ($(CONFIG_DEVICE_TREE),"")
@@ -185,6 +184,9 @@ $(obj)/zImage.initrd.%: vmlinux $(wrapperbits)
 $(obj)/zImage.%: vmlinux $(wrapperbits)
        $(call if_changed,wrap,$*)
 
+$(obj)/zImage.iseries: vmlinux
+       $(STRIP) -s -R .comment $< -o $@
+
 $(obj)/zImage.ps3: vmlinux
        $(STRIP) -s -R .comment $< -o $@
 
index 2ed8b8b3f0ec0f10c1764017969b622c71718ba3..da77adc73078d3561144edf3d335dab4c901dbdc 100755 (executable)
@@ -129,7 +129,7 @@ case "$platform" in
 pmac|pseries|chrp)
     platformo=$object/of.o
     ;;
-pmaccoff)
+coff)
     platformo=$object/of.o
     lds=$object/zImage.coff.lds
     ;;
@@ -220,7 +220,7 @@ case "$platform" in
 pseries|chrp)
     $object/addnote "$ofile"
     ;;
-pmaccoff)
+coff)
     ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
     $object/hack-coff "$ofile"
     ;;
index 068377a2a8dc021b008f7cb56d3d82b2e94994cb..42c8ed6ed528be8a6a62c35e71a0a2e130811753 100644 (file)
@@ -489,7 +489,7 @@ struct irq_host *irq_alloc_host(unsigned int revmap_type,
        case IRQ_HOST_MAP_LINEAR:
                rmap = (unsigned int *)(host + 1);
                for (i = 0; i < revmap_arg; i++)
-                       rmap[i] = IRQ_NONE;
+                       rmap[i] = NO_IRQ;
                host->revmap_data.linear.size = revmap_arg;
                smp_wmb();
                host->revmap_data.linear.revmap = rmap;
@@ -614,7 +614,7 @@ unsigned int irq_create_mapping(struct irq_host *host,
         * host->ops->map() to update the flags
         */
        virq = irq_find_mapping(host, hwirq);
-       if (virq != IRQ_NONE) {
+       if (virq != NO_IRQ) {
                if (host->ops->remap)
                        host->ops->remap(host, virq, hwirq);
                pr_debug("irq: -> existing mapping on virq %d\n", virq);
@@ -741,7 +741,7 @@ void irq_dispose_mapping(unsigned int virq)
        switch(host->revmap_type) {
        case IRQ_HOST_MAP_LINEAR:
                if (hwirq < host->revmap_data.linear.size)
-                       host->revmap_data.linear.revmap[hwirq] = IRQ_NONE;
+                       host->revmap_data.linear.revmap[hwirq] = NO_IRQ;
                break;
        case IRQ_HOST_MAP_TREE:
                /* Check if radix tree allocated yet */
index 066a6a7a25b88c2bb41017459c938287b4db521f..af42ddab3ab473ba7f9085c3a28d2f37fb4672c7 100644 (file)
@@ -1171,11 +1171,12 @@ EXPORT_SYMBOL(of_find_node_by_name);
 
 /**
  *     of_find_node_by_type - Find a node by its "device_type" property
- *     @from:  The node to start searching from or NULL, the node
- *             you pass will not be searched, only the next one
- *             will; typically, you pass what the previous call
- *             returned. of_node_put() will be called on it
- *     @name:  The type string to match against
+ *     @from:  The node to start searching from, or NULL to start searching
+ *             the entire device tree. The node you pass will not be
+ *             searched, only the next one will; typically, you pass
+ *             what the previous call returned. of_node_put() will be
+ *             called on from for you.
+ *     @type:  The type string to match against
  *
  *     Returns a node pointer with refcount incremented, use
  *     of_node_put() on it when done.
index f4f391cdd8f5e8bb45c059cf2779fd97d7f1cd3f..bf76562167c34dc4334332b65cdc4bc14f90aa6e 100644 (file)
@@ -218,6 +218,7 @@ set_single_step(struct task_struct *task)
                regs->msr |= MSR_SE;
 #endif
        }
+       set_tsk_thread_flag(task, TIF_SINGLESTEP);
 }
 
 static inline void
@@ -233,6 +234,7 @@ clear_single_step(struct task_struct *task)
                regs->msr &= ~MSR_SE;
 #endif
        }
+       clear_tsk_thread_flag(task, TIF_SINGLESTEP);
 }
 #endif /* CONFIG_PPC32 */
 
index 03cd45d8fefa3b5fcc86a34974ff768a52025525..3c962d5757be797446c5195ff32278929f3489ab 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <asm/machdep.h>
 #include <asm/reg.h>
+#include <asm/smp.h>
 
 #include "pasemi.h"
 
index 9da82c266ba9ccc45110a5b2daa9f32004253001..ec9030dbb5f1ba13fc86c116d1675f6a5c82dc15 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/machdep.h>
 #include <asm/udbg.h>
 #include <asm/lv1call.h>
+#include <asm/smp.h>
 
 #include "platform.h"
 
index b854e7f1001c60c79697cd96c957b388a0fe7b98..f1df942072bbdefdb3e7a397e2c7637c53423d43 100644 (file)
@@ -752,6 +752,7 @@ skip_gserver_check:
 void xics_request_IPIs(void)
 {
        unsigned int ipi;
+       int rc;
 
        ipi = irq_create_mapping(xics_host, XICS_IPI);
        BUG_ON(ipi == NO_IRQ);
@@ -762,11 +763,12 @@ void xics_request_IPIs(void)
         */
        set_irq_handler(ipi, handle_percpu_irq);
        if (firmware_has_feature(FW_FEATURE_LPAR))
-               request_irq(ipi, xics_ipi_action_lpar, IRQF_DISABLED,
-                           "IPI", NULL);
+               rc = request_irq(ipi, xics_ipi_action_lpar, IRQF_DISABLED,
+                               "IPI", NULL);
        else
-               request_irq(ipi, xics_ipi_action_direct, IRQF_DISABLED,
-                           "IPI", NULL);
+               rc = request_irq(ipi, xics_ipi_action_direct, IRQF_DISABLED,
+                               "IPI", NULL);
+       BUG_ON(rc);
 }
 #endif /* CONFIG_SMP */
 
index 3f6e55c79181167f7730963704d1801487228fcc..2ee176610e7c684a477fe7ffa3efce91c1a1c103 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/module.h>
+#include <asm/ibm4xx.h>
 #include <asm/ocp.h>
 
 struct ocp_sys_info_data ocp_sys_info = {
index 2782cf9da5b47b2057d20314e4af604183c01196..b9a1ce1f28e488e25ab251350316475f1f114395 100644 (file)
@@ -481,9 +481,17 @@ out:
 
 /* Diagnose 224 functions */
 
-static void diag224(void *ptr)
+static int diag224(void *ptr)
 {
-       asm volatile("diag %0,%1,0x224" : :"d" (0), "d"(ptr) : "memory");
+       int rc = -ENOTSUPP;
+
+       asm volatile(
+               "       diag    %1,%2,0x224\n"
+               "0:     lhi     %0,0x0\n"
+               "1:\n"
+               EX_TABLE(0b,1b)
+               : "+d" (rc) :"d" (0), "d" (ptr) : "memory");
+       return rc;
 }
 
 static int diag224_get_name_table(void)
@@ -492,7 +500,10 @@ static int diag224_get_name_table(void)
        diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
        if (!diag224_cpu_names)
                return -ENOMEM;
-       diag224(diag224_cpu_names);
+       if (diag224(diag224_cpu_names)) {
+               kfree(diag224_cpu_names);
+               return -ENOTSUPP;
+       }
        EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16);
        return 0;
 }
index dca6eaf82c80859a847802a1d6e975e8682a7691..1b2f5ce45320967275e3da19d6d33d43707e1a21 100644 (file)
@@ -163,7 +163,7 @@ unsigned int debug_feature_version = __DEBUG_FEATURE_VERSION;
 
 static debug_info_t *debug_area_first = NULL;
 static debug_info_t *debug_area_last = NULL;
-static DECLARE_MUTEX(debug_lock);
+static DEFINE_MUTEX(debug_mutex);
 
 static int initialized;
 
@@ -576,7 +576,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length,
        int rc = 0;
        file_private_info_t *p_info;
 
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        p_info = ((file_private_info_t *) file->private_data);
        if (p_info->view->input_proc)
                rc = p_info->view->input_proc(p_info->debug_info_org,
@@ -584,7 +584,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length,
                                              length, offset);
        else
                rc = -EPERM;
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;              /* number of input characters */
 }
 
@@ -602,7 +602,7 @@ debug_open(struct inode *inode, struct file *file)
        file_private_info_t *p_info;
        debug_info_t *debug_info, *debug_info_snapshot;
 
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_info = file->f_path.dentry->d_inode->i_private;
        /* find debug view */
        for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
@@ -653,7 +653,7 @@ found:
        file->private_data = p_info;
        debug_info_get(debug_info);
 out:
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;
 }
 
@@ -688,7 +688,7 @@ debug_register (char *name, int pages_per_area, int nr_areas, int buf_size)
 
        if (!initialized)
                BUG();
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
 
         /* create new debug_info */
 
@@ -702,7 +702,7 @@ out:
         if (!rc){
                printk(KERN_ERR "debug: debug_register failed for %s\n",name);
         }
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;
 }
 
@@ -716,9 +716,9 @@ debug_unregister(debug_info_t * id)
 {
        if (!id)
                goto out;
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_info_put(id);
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
 
 out:
        return;
@@ -1054,11 +1054,11 @@ __init debug_init(void)
        int rc = 0;
 
        s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table);
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT,NULL);
        printk(KERN_INFO "debug: Initialization complete\n");
        initialized = 1;
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
 
        return rc;
 }
index 6bfb0889eb1076510f4856a84ea76d5820de4f7c..51d6309e7f3bc90939335c6269c04170ab987481 100644 (file)
@@ -102,7 +102,7 @@ static struct resource data_resource = {
 /*
  * cpu_init() initializes state that is per-CPU.
  */
-void __devinit cpu_init (void)
+void __cpuinit cpu_init(void)
 {
         int addr = hard_smp_processor_id();
 
@@ -915,7 +915,7 @@ setup_arch(char **cmdline_p)
        setup_zfcpdump(console_devno);
 }
 
-void print_cpu_info(struct cpuinfo_S390 *cpuinfo)
+void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo)
 {
    printk("cpu %d "
 #ifdef CONFIG_SMP
index 09f028a3266ba7698061422c3dfd5c0f2998827a..8ff2feaf9b00357996efe466410da5181f70ce39 100644 (file)
@@ -492,7 +492,7 @@ static unsigned int __init smp_count_cpus(void)
 /*
  *     Activate a secondary processor.
  */
-int __devinit start_secondary(void *cpuvoid)
+int __cpuinit start_secondary(void *cpuvoid)
 {
        /* Setup the cpu */
        cpu_init();
@@ -741,7 +741,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                        smp_create_idle(cpu);
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void __init smp_prepare_boot_cpu(void)
 {
        BUG_ON(smp_processor_id() != 0);
 
@@ -750,7 +750,7 @@ void __devinit smp_prepare_boot_cpu(void)
        current_set[0] = current;
 }
 
-void smp_cpus_done(unsigned int max_cpus)
+void __init smp_cpus_done(unsigned int max_cpus)
 {
        cpu_present_map = cpu_possible_map;
 }
index 7b1122417050a8cd01c991f876398e98f86506f5..883b03b040c455c471c704e605c62e8163c607e1 100644 (file)
@@ -39,7 +39,7 @@ cflags-$(CONFIG_CPU_SH2A)             := -m2a $(call cc-option,-m2a-nofpu,)
 cflags-$(CONFIG_CPU_SH3)               := -m3
 cflags-$(CONFIG_CPU_SH4)               := -m4 \
        $(call cc-option,-mno-implicit-fp,-m4-nofpu)
-cflags-$(CONFIG_CPU_SH4A)              := -m4a $(call cc-option,-m4a-nofpu,)
+cflags-$(CONFIG_CPU_SH4A)              := $(call cc-option,-m4a,) $(call cc-option,-m4a-nofpu,)
 
 cflags-$(CONFIG_CPU_BIG_ENDIAN)                += -mb
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     += -ml
index 8057a27a1bc6bb760d81ce01ee800b7638ceebaf..cf8e119943306abd598cd1c761c7ce118891cb14 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/list.h>
 #include <linux/platform_device.h>
 #include <linux/mm.h>
+#include <linux/sched.h>
 #include <asm/dma.h>
 
 DEFINE_SPINLOCK(dma_spin_lock);
index 849a9e191391dee23ea1d4c48a85b7c541471513..ebc73b85094a9b9b63a3667556c077c432e0e624 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
+#include <linux/interrupt.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 
@@ -149,6 +150,11 @@ static int __init cf_init_se(void)
        ctrl_outb(0x42, PA_MRSHPC_MW2 + 0x200);
        return 0;
 }
+#else
+static int __init cf_init_se(void)
+{
+       return -1;
+}
 #endif
 
 int __init cf_init(void)
index 832c0b4a1e6ca2fe78583e57af93ebd44f78d7bc..659cc081e5e701f5d155bf72e9cd297f93a42524 100644 (file)
@@ -320,6 +320,7 @@ skip_restore:
 
        .align  2
 5:     .long   0x00001000      ! DSP
+6:     .long   in_nmi
 7:     .long   0x30000000
 
 ! common exception handler
index 8cd04904c77a02c9fc6dfff2f28756fc8ca8f282..fab2eb07196b2538ac24bf5b05733df66fb1ee73 100644 (file)
@@ -12,6 +12,7 @@
  */
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/smp.h>
 #include <asm/processor.h>
 #include <asm/cache.h>
 
index dbebaddcfe394974686c833a39f837d562720fa5..283e1425ced57046d63cd850317f1c6b5e8dd766 100644 (file)
@@ -10,6 +10,8 @@
  * Free Software Foundation; either version 2 of the License, or (at your
  * option) any later version.
  */
+
+#include <linux/err.h>
 #include <linux/cache.h>
 #include <linux/cpumask.h>
 #include <linux/delay.h>
index a6bcc913d25e8687f96ad783220fbdfaa64f111b..4e7e747d1b696c59a16016cb42aedbe516ae734b 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/string.h>
 #include <asm/timer.h>
 
-static struct sys_timer *sys_timers[] __initdata = {
+static struct sys_timer *sys_timers[] = {
 #ifdef CONFIG_SH_TMU
        &tmu_timer,
 #endif
@@ -26,7 +26,7 @@ static struct sys_timer *sys_timers[] __initdata = {
        NULL,
 };
 
-static char timer_override[10] __initdata;
+static char timer_override[10];
 static int __init timer_setup(char *str)
 {
        if (str)
@@ -53,4 +53,3 @@ struct sys_timer *get_sys_timer(void)
 
        return NULL;
 }
-
index e146bafcd14fb11459e60f1db77549502b22644e..2aa9438361bcb99a75ac7369dd0c1c2ea8ba5997 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/gfp.h>
 #include <linux/module.h>
 #include <linux/elf.h>
+#include <linux/sched.h>
 
 /*
  * Should the kernel map a VDSO page into processes and pass its
index 617d29832e192fc1a0e7258c374886bd592d225f..cbddeb38ffdab2bf5f25562190dd833bf2f9ded4 100644 (file)
@@ -124,10 +124,10 @@ unsigned long __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new)
        unsigned long flags;
        u32 prev;
 
-       spin_lock_irqsave(ATOMIC_HASH(addr), flags);
+       spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
        if ((prev = *ptr) == old)
                *ptr = new;
-       spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
+       spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
 
        return (unsigned long)prev;
 }
index 8f10dda0f5c026eb10f4004fd3df575e80fde3b3..ed712e0b337238199b52aadc646b6123a585aef6 100644 (file)
@@ -2498,3 +2498,75 @@ sun4v_vintr_set_target:
        retl
         nop
        .size   sun4v_vintr_set_target, .-sun4v_vintr_set_target
+
+       /* %o0: NCS sub-function
+        * %o1: sub-function arg real-address
+        * %o2: sub-function arg size
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ncs_request
+       .type   sun4v_ncs_request,#function
+sun4v_ncs_request:
+       mov     HV_FAST_NCS_REQUEST, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ncs_request, .-sun4v_ncs_request
+
+       .globl  sun4v_scv_send
+       .type   sun4v_scv_send,#function
+sun4v_scv_send:
+       save    %sp, -192, %sp
+       mov     %i0, %o0
+       mov     %i1, %o1
+       mov     %i2, %o2
+       mov     HV_FAST_SVC_SEND, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%i3]
+       ret
+       restore
+       .size   sun4v_scv_send, .-sun4v_scv_send
+
+       .globl  sun4v_scv_recv
+       .type   sun4v_scv_recv,#function
+sun4v_scv_recv:
+       save    %sp, -192, %sp
+       mov     %i0, %o0
+       mov     %i1, %o1
+       mov     %i2, %o2
+       mov     HV_FAST_SVC_RECV, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%i3]
+       ret
+       restore
+       .size   sun4v_scv_recv, .-sun4v_scv_recv
+
+       .globl  sun4v_scv_getstatus
+       .type   sun4v_scv_getstatus,#function
+sun4v_scv_getstatus:
+       mov     HV_FAST_SVC_GETSTATUS, %o5
+       mov     %o1, %o4
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_scv_getstatus, .-sun4v_scv_getstatus
+
+       .globl  sun4v_scv_setstatus
+       .type   sun4v_scv_setstatus,#function
+sun4v_scv_setstatus:
+       mov     HV_FAST_SVC_SETSTATUS, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_scv_setstatus, .-sun4v_scv_setstatus
+
+       .globl  sun4v_scv_clrstatus
+       .type   sun4v_scv_clrstatus,#function
+sun4v_scv_clrstatus:
+       mov     HV_FAST_SVC_CLRSTATUS, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_scv_clrstatus, .-sun4v_scv_clrstatus
index fb648de18a8d0b6350c06cc0c76191831907d304..3ad10f3027e4b2e82790dd826db811bf136b72f8 100644 (file)
@@ -1,5 +1,6 @@
 /* ld script to make UltraLinux kernel */
 
+#include <asm/page.h>
 #include <asm-generic/vmlinux.lds.h>
 
 OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
@@ -23,7 +24,7 @@ SECTIONS
   _etext = .;
   PROVIDE (etext = .);
 
-  RODATA
+  RO_DATA(PAGE_SIZE)
 
   .data    :
   {
@@ -44,7 +45,7 @@ SECTIONS
   __ex_table : { *(__ex_table) }
   __stop___ex_table = .;
 
-  . = ALIGN(8192);
+  . = ALIGN(PAGE_SIZE);
   __init_begin = .;
   .init.text : { 
        _sinittext = .;
@@ -83,17 +84,17 @@ SECTIONS
   __sun4v_2insn_patch_end = .;
 
 #ifdef CONFIG_BLK_DEV_INITRD
-  . = ALIGN(8192); 
+  . = ALIGN(PAGE_SIZE);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
 #endif
 
-  . = ALIGN(8192);
+  . = ALIGN(PAGE_SIZE);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
-  . = ALIGN(8192);
+  . = ALIGN(PAGE_SIZE);
   __init_end = .;
   __bss_start = .;
   .sbss      : { *(.sbss) *(.scommon) }
index 1336da8bdee125f5b0ba227360d89c4709264323..1ad5111aec381d7042648c0a871f2707181f3400 100644 (file)
@@ -761,3 +761,9 @@ int in_gate_area_no_task(unsigned long addr)
 {
        return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END);
 }
+
+void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size)
+{
+       return __alloc_bootmem_core(pgdat->bdata, size,
+                       SMP_CACHE_BYTES, (4UL*1024*1024*1024), 0);
+}
index 3ff4e1f0f0328d9acb023628e4233b0b1acd607e..ac6dce2e7596c4518287bdc355c088eb1a1e5a37 100644 (file)
@@ -298,7 +298,7 @@ static inline int cryptd_create_thread(struct cryptd_state *state,
        mutex_init(&state->mutex);
        crypto_init_queue(&state->queue, CRYPTD_MAX_QLEN);
 
-       state->task = kthread_create(fn, state, name);
+       state->task = kthread_run(fn, state, name);
        if (IS_ERR(state->task))
                return PTR_ERR(state->task);
 
@@ -316,6 +316,8 @@ static int cryptd_thread(void *data)
        struct cryptd_state *state = data;
        int stop;
 
+       current->flags |= PF_NOFREEZE;
+
        do {
                struct crypto_async_request *req, *backlog;
 
index b770deab968c492322eaee25c2cbd84f0c4b92fb..6d7d4157e049f6d624069900de980629ae3ea866 100644 (file)
@@ -1357,7 +1357,7 @@ static struct backlight_ops asus_backlight_data = {
         .update_status  = set_brightness_status,
 };
 
-static void __exit asus_acpi_exit(void)
+static void asus_acpi_exit(void)
 {
        if (asus_backlight_device)
                backlight_device_unregister(asus_backlight_device);
index a2efae8a4c4eec093bcfda836e96b49e97f2251e..0c9f15c54e8c6265d3eaec4ea14f0b4e7991cc52 100644 (file)
@@ -59,7 +59,7 @@ int node_to_pxm(int node)
        return node_to_pxm_map[node];
 }
 
-int __cpuinit acpi_map_pxm_to_node(int pxm)
+int acpi_map_pxm_to_node(int pxm)
 {
        int node = pxm_to_node_map[pxm];
 
index b998340e23d4126074a36cc1af38d05461b4bde9..58ceb18ec997f7c16b62c1bba6035411a61450ab 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/interrupt.h>
 #include <linux/kmod.h>
 #include <linux/delay.h>
+#include <linux/dmi.h>
 #include <linux/workqueue.h>
 #include <linux/nmi.h>
 #include <linux/acpi.h>
@@ -73,6 +74,21 @@ static void *acpi_irq_context;
 static struct workqueue_struct *kacpid_wq;
 static struct workqueue_struct *kacpi_notify_wq;
 
+#define        OSI_STRING_LENGTH_MAX 64        /* arbitrary */
+static char osi_additional_string[OSI_STRING_LENGTH_MAX];
+
+#define OSI_LINUX_ENABLED
+#ifdef OSI_LINUX_ENABLED
+int osi_linux = 1;     /* enable _OSI(Linux) by default */
+#else
+int osi_linux;         /* disable _OSI(Linux) by default */
+#endif
+
+
+#ifdef CONFIG_DMI
+static struct __initdata dmi_system_id acpi_osl_dmi_table[];
+#endif
+
 static void __init acpi_request_region (struct acpi_generic_address *addr,
        unsigned int length, char *desc)
 {
@@ -121,8 +137,9 @@ static int __init acpi_reserve_resources(void)
 }
 device_initcall(acpi_reserve_resources);
 
-acpi_status acpi_os_initialize(void)
+acpi_status __init acpi_os_initialize(void)
 {
+       dmi_check_system(acpi_osl_dmi_table);
        return AE_OK;
 }
 
@@ -960,20 +977,38 @@ static int __init acpi_os_name_setup(char *str)
 
 __setup("acpi_os_name=", acpi_os_name_setup);
 
+static void enable_osi_linux(int enable) {
+
+       if (osi_linux != enable)
+               printk(KERN_INFO PREFIX "%sabled _OSI(Linux)\n",
+                       enable ? "En": "Dis");
+
+       osi_linux = enable;
+       return;
+}
+
 /*
- * _OSI control
+ * Modify the list of "OS Interfaces" reported to BIOS via _OSI
+ *
  * empty string disables _OSI
- * TBD additional string adds to _OSI
+ * string starting with '!' disables that string
+ * otherwise string is added to list, augmenting built-in strings
  */
 static int __init acpi_osi_setup(char *str)
 {
        if (str == NULL || *str == '\0') {
                printk(KERN_INFO PREFIX "_OSI method disabled\n");
                acpi_gbl_create_osi_method = FALSE;
-       } else {
-               /* TBD */
-               printk(KERN_ERR PREFIX "_OSI additional string ignored -- %s\n",
-                      str);
+       } else if (*str == '!') {
+               if (acpi_osi_invalidate(++str) == AE_OK)
+                       printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
+       } else if (!strcmp("!Linux", str)) {
+               enable_osi_linux(0);
+       } else if (!strcmp("Linux", str)) {
+               enable_osi_linux(1);
+       } else if (*osi_additional_string == '\0') {
+               strncpy(osi_additional_string, str, OSI_STRING_LENGTH_MAX);
+               printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
        }
 
        return 1;
@@ -1143,11 +1178,28 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
 acpi_status
 acpi_os_validate_interface (char *interface)
 {
-
-    return AE_SUPPORT;
+       if (!strncmp(osi_additional_string, interface, OSI_STRING_LENGTH_MAX))
+               return AE_OK;
+       if (!strcmp("Linux", interface)) {
+               printk(KERN_WARNING PREFIX
+                       "System BIOS is requesting _OSI(Linux)\n");
+#ifdef OSI_LINUX_ENABLED
+               printk(KERN_WARNING PREFIX
+                       "Please test with \"acpi_osi=!Linux\"\n"
+                       "Please send dmidecode "
+                       "to linux-acpi@vger.kernel.org\n");
+#else
+               printk(KERN_WARNING PREFIX
+                       "If \"acpi_osi=Linux\" works better,\n"
+                       "Please send dmidecode "
+                       "to linux-acpi@vger.kernel.org\n");
+#endif
+               if(osi_linux)
+                       return AE_OK;
+       }
+       return AE_SUPPORT;
 }
 
-
 /******************************************************************************
  *
  * FUNCTION:    acpi_os_validate_address
@@ -1174,5 +1226,51 @@ acpi_os_validate_address (
     return AE_OK;
 }
 
+#ifdef CONFIG_DMI
+#ifdef OSI_LINUX_ENABLED
+static int dmi_osi_not_linux(struct dmi_system_id *d)
+{
+       printk(KERN_NOTICE "%s detected: requires not _OSI(Linux)\n", d->ident);
+       enable_osi_linux(0);
+       return 0;
+}
+#else
+static int dmi_osi_linux(struct dmi_system_id *d)
+{
+       printk(KERN_NOTICE "%s detected: requires _OSI(Linux)\n", d->ident);
+       enable_osi_linux(1);
+       return 0;
+}
+#endif
+
+static struct dmi_system_id acpi_osl_dmi_table[] __initdata = {
+#ifdef OSI_LINUX_ENABLED
+       /*
+        * Boxes that need NOT _OSI(Linux)
+        */
+       {
+        .callback = dmi_osi_not_linux,
+        .ident = "Toshiba Satellite P100",
+        .matches = {
+                    DMI_MATCH(DMI_BOARD_VENDOR, "TOSHIBA"),
+                    DMI_MATCH(DMI_BOARD_NAME, "Satellite P100"),
+                    },
+        },
+#else
+       /*
+        * Boxes that need _OSI(Linux)
+        */
+       {
+        .callback = dmi_osi_linux,
+        .ident = "Intel Napa CRB",
+        .matches = {
+                    DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
+                    DMI_MATCH(DMI_BOARD_NAME, "MPAD-MSAE Customer Reference Boards"),
+                    },
+        },
+#endif
+       {}
+};
+#endif /* CONFIG_DMI */
 
 #endif
index 0e7b121a99ce6b163961a61d16b8952d143ca497..3bc0c67a9283e395943ee0e42c5db83b3c43f134 100644 (file)
@@ -123,14 +123,14 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc,
                }
        }
 
-       /* The table must be either an SSDT or a PSDT */
+       /* The table must be either an SSDT or a PSDT or an OEMx */
 
        if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT))
            &&
-           (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)))
-       {
+           (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT))
+           && (strncmp(table_desc->pointer->signature, "OEM", 3))) {
                ACPI_ERROR((AE_INFO,
-                           "Table has invalid signature [%4.4s], must be SSDT or PSDT",
+                           "Table has invalid signature [%4.4s], must be SSDT, PSDT or OEMx",
                            table_desc->pointer->signature));
                return_ACPI_STATUS(AE_BAD_SIGNATURE);
        }
index 1ada017d01efb8c8d03630b7c87bd7b01565fd5b..194ecfe8b3600d6195a491eae99483546f1a3abe 100644 (file)
@@ -827,6 +827,7 @@ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file)
 static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
 {
        struct acpi_thermal *tz = seq->private;
+       struct acpi_device *device;
        int i = 0;
        int j = 0;
 
@@ -849,9 +850,8 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
                           tz->trips.passive.tc1, tz->trips.passive.tc2,
                           tz->trips.passive.tsp);
                for (j = 0; j < tz->trips.passive.devices.count; j++) {
-
-                       seq_printf(seq, "0x%p ",
-                                  tz->trips.passive.devices.handles[j]);
+                       acpi_bus_get_device(tz->trips.passive.devices.handles[j], &device);
+                       seq_printf(seq, "%4.4s ", acpi_device_bid(device));
                }
                seq_puts(seq, "\n");
        }
@@ -862,9 +862,10 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset)
                seq_printf(seq, "active[%d]:               %ld C: devices=",
                           i,
                           KELVIN_TO_CELSIUS(tz->trips.active[i].temperature));
-               for (j = 0; j < tz->trips.active[i].devices.count; j++)
-                       seq_printf(seq, "0x%p ",
-                                  tz->trips.active[i].devices.handles[j]);
+               for (j = 0; j < tz->trips.active[i].devices.count; j++){
+                       acpi_bus_get_device(tz->trips.active[i].devices.handles[j], &device);
+                       seq_printf(seq, "%4.4s ", acpi_device_bid(device));
+               }
                seq_puts(seq, "\n");
        }
 
index 3906d47b9783521683bcf001ad5ead9b29639c30..1cfbecb0ac10463fa5dfe0afb8741cfc384d2cae 100644 (file)
@@ -538,7 +538,7 @@ static struct backlight_ops toshiba_backlight_data = {
         .update_status  = set_lcd_status,
 };
 
-static void __exit toshiba_acpi_exit(void)
+static void toshiba_acpi_exit(void)
 {
        if (toshiba_backlight_device)
                backlight_device_unregister(toshiba_backlight_device);
index 4c1e00874dffab04407ddaf8975e7700d72dc5c5..879eaa10d3ae77cf92777f4198dc60eb1b4c7058 100644 (file)
@@ -67,6 +67,10 @@ static acpi_status
 acpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj,
                                union acpi_operand_object **return_obj);
 
+static acpi_status
+acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object,
+                                 union acpi_operand_object **internal_object);
+
 static acpi_status
 acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
                           union acpi_operand_object *dest_desc);
@@ -518,77 +522,73 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
        return_ACPI_STATUS(AE_NO_MEMORY);
 }
 
-#ifdef ACPI_FUTURE_IMPLEMENTATION
-/* Code to convert packages that are parameters to control methods */
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_copy_epackage_to_ipackage
  *
- * PARAMETERS:  *internal_object   - Pointer to the object we are returning
- *              *Buffer            - Where the object is returned
- *              *space_used        - Where the length of the object is returned
+ * PARAMETERS:  external_object     - The external object to be converted
+ *              internal_object     - Where the internal object is returned
  *
  * RETURN:      Status
  *
- * DESCRIPTION: This function is called to place a package object in a user
- *              buffer.  A package object by definition contains other objects.
- *
- *              The buffer is assumed to have sufficient space for the object.
- *              The caller must have verified the buffer length needed using the
- *              acpi_ut_get_object_size function before calling this function.
+ * DESCRIPTION: Copy an external package object to an internal package.
+ *              Handles nested packages.
  *
  ******************************************************************************/
 
 static acpi_status
-acpi_ut_copy_epackage_to_ipackage(union acpi_operand_object *internal_object,
-                                 u8 * buffer, u32 * space_used)
+acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object,
+                                 union acpi_operand_object **internal_object)
 {
-       u8 *free_space;
-       union acpi_object *external_object;
-       u32 length = 0;
-       u32 this_index;
-       u32 object_space = 0;
-       union acpi_operand_object *this_internal_obj;
-       union acpi_object *this_external_obj;
+       acpi_status status = AE_OK;
+       union acpi_operand_object *package_object;
+       union acpi_operand_object **package_elements;
+       acpi_native_uint i;
 
        ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage);
 
-       /*
-        * First package at head of the buffer
-        */
-       external_object = (union acpi_object *)buffer;
+       /* Create the package object */
 
-       /*
-        * Free space begins right after the first package
-        */
-       free_space = buffer + sizeof(union acpi_object);
+       package_object =
+           acpi_ut_create_package_object(external_object->package.count);
+       if (!package_object) {
+               return_ACPI_STATUS(AE_NO_MEMORY);
+       }
 
-       external_object->type = ACPI_GET_OBJECT_TYPE(internal_object);
-       external_object->package.count = internal_object->package.count;
-       external_object->package.elements = (union acpi_object *)free_space;
+       package_elements = package_object->package.elements;
 
        /*
-        * Build an array of ACPI_OBJECTS in the buffer
-        * and move the free space past it
+        * Recursive implementation. Probably ok, since nested external packages
+        * as parameters should be very rare.
         */
-       free_space +=
-           external_object->package.count * sizeof(union acpi_object);
+       for (i = 0; i < external_object->package.count; i++) {
+               status =
+                   acpi_ut_copy_eobject_to_iobject(&external_object->package.
+                                                   elements[i],
+                                                   &package_elements[i]);
+               if (ACPI_FAILURE(status)) {
 
-       /* Call walk_package */
+                       /* Truncate package and delete it */
 
-}
+                       package_object->package.count = i;
+                       package_elements[i] = NULL;
+                       acpi_ut_remove_reference(package_object);
+                       return_ACPI_STATUS(status);
+               }
+       }
 
-#endif                         /* Future implementation */
+       *internal_object = package_object;
+       return_ACPI_STATUS(status);
+}
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_copy_eobject_to_iobject
  *
- * PARAMETERS:  *internal_object   - The external object to be converted
- *              *buffer_ptr     - Where the internal object is returned
+ * PARAMETERS:  external_object     - The external object to be converted
+ *              internal_object     - Where the internal object is returned
  *
- * RETURN:      Status          - the status of the call
+ * RETURN:      Status              - the status of the call
  *
  * DESCRIPTION: Converts an external object to an internal object.
  *
@@ -603,16 +603,10 @@ acpi_ut_copy_eobject_to_iobject(union acpi_object *external_object,
        ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject);
 
        if (external_object->type == ACPI_TYPE_PACKAGE) {
-               /*
-                * Packages as external input to control methods are not supported,
-                */
-               ACPI_ERROR((AE_INFO,
-                           "Packages as parameters not implemented!"));
-
-               return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
-       }
-
-       else {
+               status =
+                   acpi_ut_copy_epackage_to_ipackage(external_object,
+                                                     internal_object);
+       } else {
                /*
                 * Build a simple object (no nested objects)
                 */
@@ -803,33 +797,19 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type,
                 * Create and build the package object
                 */
                target_object =
-                   acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
+                   acpi_ut_create_package_object(source_object->package.count);
                if (!target_object) {
                        return (AE_NO_MEMORY);
                }
 
-               target_object->package.count = source_object->package.count;
                target_object->common.flags = source_object->common.flags;
 
-               /*
-                * Create the object array
-                */
-               target_object->package.elements =
-                   ACPI_ALLOCATE_ZEROED(((acpi_size) source_object->package.
-                                         count + 1) * sizeof(void *));
-               if (!target_object->package.elements) {
-                       status = AE_NO_MEMORY;
-                       goto error_exit;
-               }
+               /* Pass the new package object back to the package walk routine */
 
-               /*
-                * Pass the new package object back to the package walk routine
-                */
                state->pkg.this_target_obj = target_object;
 
-               /*
-                * Store the object pointer in the parent package object
-                */
+               /* Store the object pointer in the parent package object */
+
                *this_target_ptr = target_object;
                break;
 
index 13d5879cd98b92148acb215ac411a8280b862090..8ec6f8e481385d2908f286249903d44db35cf184 100644 (file)
@@ -59,10 +59,9 @@ acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc,
 /*
  * Strings supported by the _OSI predefined (internal) method.
  */
-static const char *acpi_interfaces_supported[] = {
+static char *acpi_interfaces_supported[] = {
        /* Operating System Vendor Strings */
 
-       "Linux",
        "Windows 2000",
        "Windows 2001",
        "Windows 2001 SP0",
@@ -156,6 +155,31 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state)
        return_ACPI_STATUS(AE_CTRL_TERMINATE);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_osi_invalidate
+ *
+ * PARAMETERS:  interface_string
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: invalidate string in pre-defiend _OSI string list
+ *
+ ******************************************************************************/
+
+acpi_status acpi_osi_invalidate(char *interface)
+{
+       int i;
+
+       for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) {
+               if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i])) {
+                       *acpi_interfaces_supported[i] = '\0';
+                       return AE_OK;
+               }
+       }
+       return AE_NOT_FOUND;
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_evaluate_object
index 4696124759e1546b16cde08d99d15bcc4515abb2..db0b9bac7945f7bd55b55a0561b37104630ca23b 100644 (file)
@@ -144,6 +144,48 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(char *module_name,
        return_PTR(object);
 }
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_create_package_object
+ *
+ * PARAMETERS:  Count               - Number of package elements
+ *
+ * RETURN:      Pointer to a new Package object, null on failure
+ *
+ * DESCRIPTION: Create a fully initialized package object
+ *
+ ******************************************************************************/
+
+union acpi_operand_object *acpi_ut_create_package_object(u32 count)
+{
+       union acpi_operand_object *package_desc;
+       union acpi_operand_object **package_elements;
+
+       ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count);
+
+       /* Create a new Package object */
+
+       package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE);
+       if (!package_desc) {
+               return_PTR(NULL);
+       }
+
+       /*
+        * Create the element array. Count+1 allows the array to be null
+        * terminated.
+        */
+       package_elements = ACPI_ALLOCATE_ZEROED((acpi_size)
+                                               (count + 1) * sizeof(void *));
+       if (!package_elements) {
+               ACPI_FREE(package_desc);
+               return_PTR(NULL);
+       }
+
+       package_desc->package.count = count;
+       package_desc->package.elements = package_elements;
+       return_PTR(package_desc);
+}
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_create_buffer_object
index e9a57806cd34ecc32c1ab9d9881efabbeb96bfbc..2d496918b3cda4593d383b36cce08f18e2535253 100644 (file)
@@ -61,7 +61,7 @@ ACPI_MODULE_NAME("utxface")
  *              called, so any early initialization belongs here.
  *
  ******************************************************************************/
-acpi_status acpi_initialize_subsystem(void)
+acpi_status __init acpi_initialize_subsystem(void)
 {
        acpi_status status;
 
@@ -108,8 +108,6 @@ acpi_status acpi_initialize_subsystem(void)
        return_ACPI_STATUS(status);
 }
 
-ACPI_EXPORT_SYMBOL(acpi_initialize_subsystem)
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_enable_subsystem
index b4a8d6030e480859b8c594ad68cd2e40686ae4c7..7d893a60f99420ffc9d8fe7a2b6b999dc99889b2 100644 (file)
@@ -8,6 +8,7 @@ menuconfig ATA
        depends on BLOCK
        depends on !(M32R || M68K) || BROKEN
        depends on !SUN4 || BROKEN
+       depends on !(SPARC64 && !PCI)
        select SCSI
        ---help---
          If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or
index 3ca9c610c110c3fda3f0aa7ee06fd107038a3de6..af625147df6274a0e18de69dfb90e393760fb88b 100644 (file)
@@ -3783,6 +3783,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { "FUJITSU MHT2060BH",  NULL,           ATA_HORKAGE_NONCQ },
        /* NCQ is broken */
        { "Maxtor 6L250S0",     "BANC1G10",     ATA_HORKAGE_NONCQ },
+       { "Maxtor 6B200M0",     "BANC1B10",     ATA_HORKAGE_NONCQ },
        /* NCQ hard hangs device under heavier load, needs hard power cycle */
        { "Maxtor 6B250S0",     "BANC1B70",     ATA_HORKAGE_NONCQ },
        /* Blacklist entries taken from Silicon Image 3124/3132
index 9c67df5ccfa432df69acf4c335ca0707724e7363..7f6d02ce1b5f53da024bddd9e1ef0976c593ad01 100644 (file)
@@ -1475,6 +1475,7 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp,
        struct FS_BPENTRY *qe, *ne;
        struct sk_buff *skb;
        int n = 0;
+       u32 qe_tmp;
 
        fs_dprintk (FS_DEBUG_QUEUE, "Topping off queue at %x (%d-%d/%d)\n", 
                    fp->offset, read_fs (dev, FP_CNT (fp->offset)), fp->n, 
@@ -1502,10 +1503,16 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp,
                ne->skb = skb;
                ne->fp = fp;
 
-               qe = (struct FS_BPENTRY *) (read_fs (dev, FP_EA(fp->offset)));
-               fs_dprintk (FS_DEBUG_QUEUE, "link at %p\n", qe);
-               if (qe) {
-                       qe = bus_to_virt ((long) qe);
+               /*
+                * FIXME: following code encodes and decodes
+                * machine pointers (could be 64-bit) into a
+                * 32-bit register.
+                */
+
+               qe_tmp = read_fs (dev, FP_EA(fp->offset));
+               fs_dprintk (FS_DEBUG_QUEUE, "link at %x\n", qe_tmp);
+               if (qe_tmp) {
+                       qe = bus_to_virt ((long) qe_tmp);
                        qe->next = virt_to_bus(ne);
                        qe->flags &= ~FP_FLAGS_EPI;
                } else
index 2e18a63ead36d735049d7297fedbc1c77b53d5db..ea4fe3e48f33c3213b9c0447a26fbeddb3d38148 100644 (file)
@@ -68,6 +68,10 @@ config CFAG12864B
        depends on X86
        depends on FB
        depends on KS0108
+       select FB_SYS_FILLRECT
+       select FB_SYS_COPYAREA
+       select FB_SYS_IMAGEBLIT
+       select FB_SYS_FOPS
        default n
        ---help---
          If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series,
index 66fafbb1d0871896ebf36d0d5c78debcc17a8f2b..307c190699e04193815004207549a5f7d8706284 100644 (file)
@@ -73,9 +73,11 @@ static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
 
 static struct fb_ops cfag12864bfb_ops = {
        .owner = THIS_MODULE,
-       .fb_fillrect = cfb_fillrect,
-       .fb_copyarea = cfb_copyarea,
-       .fb_imageblit = cfb_imageblit,
+       .fb_read = fb_sys_read,
+       .fb_write = fb_sys_write,
+       .fb_fillrect = sys_fillrect,
+       .fb_copyarea = sys_copyarea,
+       .fb_imageblit = sys_imageblit,
        .fb_mmap = cfag12864bfb_mmap,
 };
 
index de37d5f7456357867965e0881e262a1cdbab7cad..b33313be25477dc3689d9253c1792e4b46164dd9 100644 (file)
@@ -172,38 +172,49 @@ int drm_rmdraw(DRM_IOCTL_ARGS)
 
                bitfield_length = idx + 1;
 
-               if (idx != id / (8 * sizeof(*bitfield)))
-                       bitfield = drm_alloc(bitfield_length *
-                                            sizeof(*bitfield), DRM_MEM_BUFS);
+               bitfield = NULL;
 
-               if (!bitfield && bitfield_length) {
-                       bitfield = dev->drw_bitfield;
-                       bitfield_length = dev->drw_bitfield_length;
+               if (bitfield_length) {
+                       if (bitfield_length != dev->drw_bitfield_length)
+                               bitfield = drm_alloc(bitfield_length *
+                                                    sizeof(*bitfield),
+                                                    DRM_MEM_BUFS);
+
+                       if (!bitfield) {
+                               bitfield = dev->drw_bitfield;
+                               bitfield_length = dev->drw_bitfield_length;
+                       }
                }
        }
 
        if (bitfield != dev->drw_bitfield) {
                info_length = 8 * sizeof(*bitfield) * bitfield_length;
 
-               info = drm_alloc(info_length * sizeof(*info), DRM_MEM_BUFS);
+               if (info_length) {
+                       info = drm_alloc(info_length * sizeof(*info),
+                                        DRM_MEM_BUFS);
 
-               if (!info && info_length) {
-                       info = dev->drw_info;
-                       info_length = dev->drw_info_length;
-               }
+                       if (!info) {
+                               info = dev->drw_info;
+                               info_length = dev->drw_info_length;
+                       }
+               } else
+                       info = NULL;
 
                spin_lock_irqsave(&dev->drw_lock, irqflags);
 
-               memcpy(bitfield, dev->drw_bitfield, bitfield_length *
-                      sizeof(*bitfield));
+               if (bitfield)
+                       memcpy(bitfield, dev->drw_bitfield, bitfield_length *
+                              sizeof(*bitfield));
                drm_free(dev->drw_bitfield, sizeof(*bitfield) *
                         dev->drw_bitfield_length, DRM_MEM_BUFS);
                dev->drw_bitfield = bitfield;
                dev->drw_bitfield_length = bitfield_length;
 
                if (info != dev->drw_info) {
-                       memcpy(info, dev->drw_info, info_length *
-                              sizeof(*info));
+                       if (info)
+                               memcpy(info, dev->drw_info, info_length *
+                                      sizeof(*info));
                        drm_free(dev->drw_info, sizeof(*info) *
                                 dev->drw_info_length, DRM_MEM_BUFS);
                        dev->drw_info = info;
index 31cdde83713b4e44c576424edcafb113b7b9652d..177ccc07f96821d02a305f29d7a499405e109d7f 100644 (file)
        {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
        {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \
        {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \
+       {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
        {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
+       {0x1002, 0x5974, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
+       {0x1002, 0x5975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
        {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
        {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
        {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
        {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
        {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
        {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
+       {0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
+       {0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
+       {0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
+       {0x1002, 0x5a62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
        {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
        {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
        {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
index 78c1ae28f17cd65f1441609359aea708f7149394..b92062a239f1a8c0d92e60405af0eeccdfa59a85 100644 (file)
@@ -582,7 +582,7 @@ void i915_driver_irq_postinstall(drm_device_t * dev)
 {
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
 
-       dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED;
+       spin_lock_init(&dev_priv->swaps_lock);
        INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
        dev_priv->swaps_pending = 0;
 
index b3d4ccc33a47e777d1a391ae9a85bde2f450051e..154f42203b0569c4f53c306376c6720e73cfa33d 100644 (file)
@@ -1191,6 +1191,7 @@ static int job_control(struct tty_struct *tty, struct file *file)
                            is_current_pgrp_orphaned())
                                return -EIO;
                        kill_pgrp(task_pgrp(current), SIGTTIN, 1);
+                       set_thread_flag(TIF_SIGPENDING);
                        return -ERESTARTSYS;
                }
        }
index 75d2a46e106fedf09630958ca24c1bf2909a25ad..3752edc30c366c7940812fb25c2569c7f88d3b79 100644 (file)
@@ -1148,7 +1148,8 @@ int tty_check_change(struct tty_struct * tty)
                return 0;
        if (is_current_pgrp_orphaned())
                return -EIO;
-       (void) kill_pgrp(task_pgrp(current), SIGTTOU, 1);
+       kill_pgrp(task_pgrp(current), SIGTTOU, 1);
+       set_thread_flag(TIF_SIGPENDING);
        return -ERESTARTSYS;
 }
 
index 1cad32c62ed34493a220a703e0780400ad229f62..53f5538c0c05e69d056f7cbf8c48c57f1e821074 100644 (file)
@@ -115,6 +115,13 @@ config IXP4XX_WATCHDOG
 
          Say N if you are unsure.
 
+config KS8695_WATCHDOG
+       tristate "KS8695 watchdog"
+       depends on ARCH_KS8695
+       help
+         Watchdog timer embedded into KS8695 processor. This will reboot your
+         system when the timeout is reached.
+
 config S3C2410_WATCHDOG
        tristate "S3C2410 Watchdog"
        depends on ARCH_S3C2410
index 8bfc00cc7c2bc58a8b84ef9ac15ebb7c1df2dd60..d90f649038c2bc7d87626e274affb8942c740ce3 100644 (file)
@@ -29,6 +29,7 @@ obj-$(CONFIG_21285_WATCHDOG) += wdt285.o
 obj-$(CONFIG_977_WATCHDOG) += wdt977.o
 obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o
 obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o
+obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o
 obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
 obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o
 obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o
index fd955dbd588cb75b5be420e24a644ffcedb6040e..dc7548dcaf3539cb0ae656fc49009e6927908e9b 100644 (file)
@@ -205,7 +205,7 @@ static void __exit ixp2000_wdt_exit(void)
 module_init(ixp2000_wdt_init);
 module_exit(ixp2000_wdt_exit);
 
-MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net">);
+MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");
 MODULE_DESCRIPTION("IXP2000 Network Processor Watchdog");
 
 module_param(heartbeat, int, 0);
diff --git a/drivers/char/watchdog/ks8695_wdt.c b/drivers/char/watchdog/ks8695_wdt.c
new file mode 100644 (file)
index 0000000..7150fb9
--- /dev/null
@@ -0,0 +1,308 @@
+/*
+ * Watchdog driver for Kendin/Micrel KS8695.
+ *
+ * (C) 2007 Andrew Victor
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/miscdevice.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include <linux/watchdog.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+#include <asm/arch/regs-timer.h>
+
+
+#define WDT_DEFAULT_TIME       5       /* seconds */
+#define WDT_MAX_TIME           171     /* seconds */
+
+static int wdt_time = WDT_DEFAULT_TIME;
+static int nowayout = WATCHDOG_NOWAYOUT;
+
+module_param(wdt_time, int, 0);
+MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")");
+
+#ifdef CONFIG_WATCHDOG_NOWAYOUT
+module_param(nowayout, int, 0);
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
+#endif
+
+
+static unsigned long ks8695wdt_busy;
+
+/* ......................................................................... */
+
+/*
+ * Disable the watchdog.
+ */
+static void inline ks8695_wdt_stop(void)
+{
+       unsigned long tmcon;
+
+       /* disable timer0 */
+       tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
+       __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+}
+
+/*
+ * Enable and reset the watchdog.
+ */
+static void inline ks8695_wdt_start(void)
+{
+       unsigned long tmcon;
+       unsigned long tval = wdt_time * CLOCK_TICK_RATE;
+
+       /* disable timer0 */
+       tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
+       __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+
+       /* program timer0 */
+       __raw_writel(tval | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC);
+
+       /* re-enable timer0 */
+       tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
+       __raw_writel(tmcon | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+}
+
+/*
+ * Reload the watchdog timer.  (ie, pat the watchdog)
+ */
+static void inline ks8695_wdt_reload(void)
+{
+       unsigned long tmcon;
+
+       /* disable, then re-enable timer0 */
+       tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
+       __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+       __raw_writel(tmcon | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+}
+
+/*
+ * Change the watchdog time interval.
+ */
+static int ks8695_wdt_settimeout(int new_time)
+{
+       /*
+        * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz
+        *
+        * Since WDV is a 16-bit counter, the maximum period is
+        * 65536 / 0.256 = 256 seconds.
+        */
+       if ((new_time <= 0) || (new_time > WDT_MAX_TIME))
+               return -EINVAL;
+
+       /* Set new watchdog time. It will be used when ks8695_wdt_start() is called. */
+       wdt_time = new_time;
+       return 0;
+}
+
+/* ......................................................................... */
+
+/*
+ * Watchdog device is opened, and watchdog starts running.
+ */
+static int ks8695_wdt_open(struct inode *inode, struct file *file)
+{
+       if (test_and_set_bit(0, &ks8695wdt_busy))
+               return -EBUSY;
+
+       ks8695_wdt_start();
+       return nonseekable_open(inode, file);
+}
+
+/*
+ * Close the watchdog device.
+ * If CONFIG_WATCHDOG_NOWAYOUT is NOT defined then the watchdog is also
+ *  disabled.
+ */
+static int ks8695_wdt_close(struct inode *inode, struct file *file)
+{
+       if (!nowayout)
+               ks8695_wdt_stop();      /* Disable the watchdog when file is closed */
+
+       clear_bit(0, &ks8695wdt_busy);
+       return 0;
+}
+
+static struct watchdog_info ks8695_wdt_info = {
+       .identity       = "ks8695 watchdog",
+       .options        = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
+};
+
+/*
+ * Handle commands from user-space.
+ */
+static int ks8695_wdt_ioctl(struct inode *inode, struct file *file,
+               unsigned int cmd, unsigned long arg)
+{
+       void __user *argp = (void __user *)arg;
+       int __user *p = argp;
+       int new_value;
+
+       switch(cmd) {
+               case WDIOC_KEEPALIVE:
+                       ks8695_wdt_reload();    /* pat the watchdog */
+                       return 0;
+
+               case WDIOC_GETSUPPORT:
+                       return copy_to_user(argp, &ks8695_wdt_info, sizeof(ks8695_wdt_info)) ? -EFAULT : 0;
+
+               case WDIOC_SETTIMEOUT:
+                       if (get_user(new_value, p))
+                               return -EFAULT;
+
+                       if (ks8695_wdt_settimeout(new_value))
+                               return -EINVAL;
+
+                       /* Enable new time value */
+                       ks8695_wdt_start();
+
+                       /* Return current value */
+                       return put_user(wdt_time, p);
+
+               case WDIOC_GETTIMEOUT:
+                       return put_user(wdt_time, p);
+
+               case WDIOC_GETSTATUS:
+               case WDIOC_GETBOOTSTATUS:
+                       return put_user(0, p);
+
+               case WDIOC_SETOPTIONS:
+                       if (get_user(new_value, p))
+                               return -EFAULT;
+
+                       if (new_value & WDIOS_DISABLECARD)
+                               ks8695_wdt_stop();
+                       if (new_value & WDIOS_ENABLECARD)
+                               ks8695_wdt_start();
+                       return 0;
+
+               default:
+                       return -ENOTTY;
+       }
+}
+
+/*
+ * Pat the watchdog whenever device is written to.
+ */
+static ssize_t ks8695_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos)
+{
+       ks8695_wdt_reload();            /* pat the watchdog */
+       return len;
+}
+
+/* ......................................................................... */
+
+static const struct file_operations ks8695wdt_fops = {
+       .owner          = THIS_MODULE,
+       .llseek         = no_llseek,
+       .ioctl          = ks8695_wdt_ioctl,
+       .open           = ks8695_wdt_open,
+       .release        = ks8695_wdt_close,
+       .write          = ks8695_wdt_write,
+};
+
+static struct miscdevice ks8695wdt_miscdev = {
+       .minor          = WATCHDOG_MINOR,
+       .name           = "watchdog",
+       .fops           = &ks8695wdt_fops,
+};
+
+static int __init ks8695wdt_probe(struct platform_device *pdev)
+{
+       int res;
+
+       if (ks8695wdt_miscdev.parent)
+               return -EBUSY;
+       ks8695wdt_miscdev.parent = &pdev->dev;
+
+       res = misc_register(&ks8695wdt_miscdev);
+       if (res)
+               return res;
+
+       printk("KS8695 Watchdog Timer enabled (%d seconds%s)\n", wdt_time, nowayout ? ", nowayout" : "");
+       return 0;
+}
+
+static int __exit ks8695wdt_remove(struct platform_device *pdev)
+{
+       int res;
+
+       res = misc_deregister(&ks8695wdt_miscdev);
+       if (!res)
+               ks8695wdt_miscdev.parent = NULL;
+
+       return res;
+}
+
+static void ks8695wdt_shutdown(struct platform_device *pdev)
+{
+       ks8695_wdt_stop();
+}
+
+#ifdef CONFIG_PM
+
+static int ks8695wdt_suspend(struct platform_device *pdev, pm_message_t message)
+{
+       ks8695_wdt_stop();
+       return 0;
+}
+
+static int ks8695wdt_resume(struct platform_device *pdev)
+{
+       if (ks8695wdt_busy)
+               ks8695_wdt_start();
+       return 0;
+}
+
+#else
+#define ks8695wdt_suspend NULL
+#define ks8695wdt_resume       NULL
+#endif
+
+static struct platform_driver ks8695wdt_driver = {
+       .probe          = ks8695wdt_probe,
+       .remove         = __exit_p(ks8695wdt_remove),
+       .shutdown       = ks8695wdt_shutdown,
+       .suspend        = ks8695wdt_suspend,
+       .resume         = ks8695wdt_resume,
+       .driver         = {
+               .name   = "ks8695_wdt",
+               .owner  = THIS_MODULE,
+       },
+};
+
+static int __init ks8695_wdt_init(void)
+{
+       /* Check that the heartbeat value is within range; if not reset to the default */
+       if (ks8695_wdt_settimeout(wdt_time)) {
+               ks8695_wdt_settimeout(WDT_DEFAULT_TIME);
+               pr_info("ks8695_wdt: wdt_time value must be 1 <= wdt_time <= %i, using %d\n", wdt_time, WDT_MAX_TIME);
+       }
+
+       return platform_driver_register(&ks8695wdt_driver);
+}
+
+static void __exit ks8695_wdt_exit(void)
+{
+       platform_driver_unregister(&ks8695wdt_driver);
+}
+
+module_init(ks8695_wdt_init);
+module_exit(ks8695_wdt_exit);
+
+MODULE_AUTHOR("Andrew Victor");
+MODULE_DESCRIPTION("Watchdog driver for KS8695");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
index 636151a64add8405d22fe05405d23cbd67c99780..9eb1edacd825d3d4c4e5d345bfb9c869bef98aaa 100644 (file)
@@ -407,11 +407,6 @@ fw_card_add(struct fw_card *card,
        card->link_speed = link_speed;
        card->guid = guid;
 
-       /* Activate link_on bit and contender bit in our self ID packets.*/
-       if (card->driver->update_phy_reg(card, 4, 0,
-                                        PHY_LINK_ACTIVE | PHY_CONTENDER) < 0)
-               return -EIO;
-
        /*
         * The subsystem grabs a reference when the card is added and
         * drops it when the driver calls fw_core_remove_card.
index 3ab3585d36012608b8fa180b647033c74bc5ccc1..5d402d63799f377f165a05482e31e3150308935c 100644 (file)
@@ -677,12 +677,21 @@ static int ioctl_create_iso_context(struct client *client, void *buffer)
        return 0;
 }
 
+/* Macros for decoding the iso packet control header. */
+#define GET_PAYLOAD_LENGTH(v)  ((v) & 0xffff)
+#define GET_INTERRUPT(v)       (((v) >> 16) & 0x01)
+#define GET_SKIP(v)            (((v) >> 17) & 0x01)
+#define GET_TAG(v)             (((v) >> 18) & 0x02)
+#define GET_SY(v)              (((v) >> 20) & 0x04)
+#define GET_HEADER_LENGTH(v)   (((v) >> 24) & 0xff)
+
 static int ioctl_queue_iso(struct client *client, void *buffer)
 {
        struct fw_cdev_queue_iso *request = buffer;
        struct fw_cdev_iso_packet __user *p, *end, *next;
        struct fw_iso_context *ctx = client->iso_context;
        unsigned long payload, buffer_end, header_length;
+       u32 control;
        int count;
        struct {
                struct fw_iso_packet packet;
@@ -717,8 +726,14 @@ static int ioctl_queue_iso(struct client *client, void *buffer)
        end = (void __user *)p + request->size;
        count = 0;
        while (p < end) {
-               if (__copy_from_user(&u.packet, p, sizeof(*p)))
+               if (get_user(control, &p->control))
                        return -EFAULT;
+               u.packet.payload_length = GET_PAYLOAD_LENGTH(control);
+               u.packet.interrupt = GET_INTERRUPT(control);
+               u.packet.skip = GET_SKIP(control);
+               u.packet.tag = GET_TAG(control);
+               u.packet.sy = GET_SY(control);
+               u.packet.header_length = GET_HEADER_LENGTH(control);
 
                if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) {
                        header_length = u.packet.header_length;
index 0ba9d64ccf4c64d4c48e658f33b724c3504d557e..af1723eae4ba6d7868d521fd340de08fdd993a9b 100644 (file)
@@ -99,6 +99,7 @@ fw_unit(struct device *dev)
 #define CSR_DEPENDENT_INFO     0x14
 #define CSR_MODEL              0x17
 #define CSR_INSTANCE           0x18
+#define CSR_DIRECTORY_ID       0x20
 
 #define SBP2_COMMAND_SET_SPECIFIER     0x38
 #define SBP2_COMMAND_SET               0x39
index 2e4cfa57126d618254c9abf42f9f3b4bfc54718b..0d08bf9b78c21d8f1811a317e5145ae577e4cc98 100644 (file)
@@ -417,12 +417,21 @@ ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci, u32 regs)
        ctx->current_buffer = ab.next;
        ctx->pointer = ctx->current_buffer->data;
 
-       reg_write(ctx->ohci, COMMAND_PTR(ctx->regs),
-                 le32_to_cpu(ab.descriptor.branch_address));
+       return 0;
+}
+
+static void ar_context_run(struct ar_context *ctx)
+{
+       struct ar_buffer *ab = ctx->current_buffer;
+       dma_addr_t ab_bus;
+       size_t offset;
+
+       offset = offsetof(struct ar_buffer, data);
+       ab_bus = ab->descriptor.data_address - offset;
+
+       reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), ab_bus | 1);
        reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN);
        flush_writes(ctx->ohci);
-
-       return 0;
 }
 
 static void context_tasklet(unsigned long data)
@@ -1039,11 +1048,78 @@ static irqreturn_t irq_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
+static int software_reset(struct fw_ohci *ohci)
+{
+       int i;
+
+       reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset);
+
+       for (i = 0; i < OHCI_LOOP_COUNT; i++) {
+               if ((reg_read(ohci, OHCI1394_HCControlSet) &
+                    OHCI1394_HCControl_softReset) == 0)
+                       return 0;
+               msleep(1);
+       }
+
+       return -EBUSY;
+}
+
 static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
 {
        struct fw_ohci *ohci = fw_ohci(card);
        struct pci_dev *dev = to_pci_dev(card->device);
 
+       if (software_reset(ohci)) {
+               fw_error("Failed to reset ohci card.\n");
+               return -EBUSY;
+       }
+
+       /*
+        * Now enable LPS, which we need in order to start accessing
+        * most of the registers.  In fact, on some cards (ALI M5251),
+        * accessing registers in the SClk domain without LPS enabled
+        * will lock up the machine.  Wait 50msec to make sure we have
+        * full link enabled.
+        */
+       reg_write(ohci, OHCI1394_HCControlSet,
+                 OHCI1394_HCControl_LPS |
+                 OHCI1394_HCControl_postedWriteEnable);
+       flush_writes(ohci);
+       msleep(50);
+
+       reg_write(ohci, OHCI1394_HCControlClear,
+                 OHCI1394_HCControl_noByteSwapData);
+
+       reg_write(ohci, OHCI1394_LinkControlSet,
+                 OHCI1394_LinkControl_rcvSelfID |
+                 OHCI1394_LinkControl_cycleTimerEnable |
+                 OHCI1394_LinkControl_cycleMaster);
+
+       reg_write(ohci, OHCI1394_ATRetries,
+                 OHCI1394_MAX_AT_REQ_RETRIES |
+                 (OHCI1394_MAX_AT_RESP_RETRIES << 4) |
+                 (OHCI1394_MAX_PHYS_RESP_RETRIES << 8));
+
+       ar_context_run(&ohci->ar_request_ctx);
+       ar_context_run(&ohci->ar_response_ctx);
+
+       reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus);
+       reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
+       reg_write(ohci, OHCI1394_IntEventClear, ~0);
+       reg_write(ohci, OHCI1394_IntMaskClear, ~0);
+       reg_write(ohci, OHCI1394_IntMaskSet,
+                 OHCI1394_selfIDComplete |
+                 OHCI1394_RQPkt | OHCI1394_RSPkt |
+                 OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
+                 OHCI1394_isochRx | OHCI1394_isochTx |
+                 OHCI1394_masterIntEnable |
+                 OHCI1394_cycle64Seconds);
+
+       /* Activate link_on bit and contender bit in our self ID packets.*/
+       if (ohci_update_phy_reg(card, 4, 0,
+                               PHY_LINK_ACTIVE | PHY_CONTENDER) < 0)
+               return -EIO;
+
        /*
         * When the link is not yet enabled, the atomic config rom
         * update mechanism described below in ohci_set_config_rom()
@@ -1701,22 +1777,6 @@ static const struct fw_card_driver ohci_driver = {
        .stop_iso               = ohci_stop_iso,
 };
 
-static int software_reset(struct fw_ohci *ohci)
-{
-       int i;
-
-       reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset);
-
-       for (i = 0; i < OHCI_LOOP_COUNT; i++) {
-               if ((reg_read(ohci, OHCI1394_HCControlSet) &
-                    OHCI1394_HCControl_softReset) == 0)
-                       return 0;
-               msleep(1);
-       }
-
-       return -EBUSY;
-}
-
 static int __devinit
 pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
 {
@@ -1762,33 +1822,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
                goto fail_iomem;
        }
 
-       if (software_reset(ohci)) {
-               fw_error("Failed to reset ohci card.\n");
-               err = -EBUSY;
-               goto fail_registers;
-       }
-
-       /*
-        * Now enable LPS, which we need in order to start accessing
-        * most of the registers.  In fact, on some cards (ALI M5251),
-        * accessing registers in the SClk domain without LPS enabled
-        * will lock up the machine.  Wait 50msec to make sure we have
-        * full link enabled.
-        */
-       reg_write(ohci, OHCI1394_HCControlSet,
-                 OHCI1394_HCControl_LPS |
-                 OHCI1394_HCControl_postedWriteEnable);
-       flush_writes(ohci);
-       msleep(50);
-
-       reg_write(ohci, OHCI1394_HCControlClear,
-                 OHCI1394_HCControl_noByteSwapData);
-
-       reg_write(ohci, OHCI1394_LinkControlSet,
-                 OHCI1394_LinkControl_rcvSelfID |
-                 OHCI1394_LinkControl_cycleTimerEnable |
-                 OHCI1394_LinkControl_cycleMaster);
-
        ar_context_init(&ohci->ar_request_ctx, ohci,
                        OHCI1394_AsReqRcvContextControlSet);
 
@@ -1801,11 +1834,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
        context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE,
                     OHCI1394_AsRspTrContextControlSet, handle_at_packet);
 
-       reg_write(ohci, OHCI1394_ATRetries,
-                 OHCI1394_MAX_AT_REQ_RETRIES |
-                 (OHCI1394_MAX_AT_RESP_RETRIES << 4) |
-                 (OHCI1394_MAX_PHYS_RESP_RETRIES << 8));
-
        reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0);
        ohci->it_context_mask = reg_read(ohci, OHCI1394_IsoRecvIntMaskSet);
        reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, ~0);
@@ -1835,18 +1863,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
                goto fail_registers;
        }
 
-       reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus);
-       reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000);
-       reg_write(ohci, OHCI1394_IntEventClear, ~0);
-       reg_write(ohci, OHCI1394_IntMaskClear, ~0);
-       reg_write(ohci, OHCI1394_IntMaskSet,
-                 OHCI1394_selfIDComplete |
-                 OHCI1394_RQPkt | OHCI1394_RSPkt |
-                 OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
-                 OHCI1394_isochRx | OHCI1394_isochTx |
-                 OHCI1394_masterIntEnable |
-                 OHCI1394_cycle64Seconds);
-
        bus_options = reg_read(ohci, OHCI1394_BusOptions);
        max_receive = (bus_options >> 12) & 0xf;
        link_speed = bus_options & 0x7;
@@ -1908,6 +1924,45 @@ static void pci_remove(struct pci_dev *dev)
        fw_notify("Removed fw-ohci device.\n");
 }
 
+#ifdef CONFIG_PM
+static int pci_suspend(struct pci_dev *pdev, pm_message_t state)
+{
+       struct fw_ohci *ohci = pci_get_drvdata(pdev);
+       int err;
+
+       software_reset(ohci);
+       free_irq(pdev->irq, ohci);
+       err = pci_save_state(pdev);
+       if (err) {
+               fw_error("pci_save_state failed with %d", err);
+               return err;
+       }
+       err = pci_set_power_state(pdev, pci_choose_state(pdev, state));
+       if (err) {
+               fw_error("pci_set_power_state failed with %d", err);
+               return err;
+       }
+
+       return 0;
+}
+
+static int pci_resume(struct pci_dev *pdev)
+{
+       struct fw_ohci *ohci = pci_get_drvdata(pdev);
+       int err;
+
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
+       err = pci_enable_device(pdev);
+       if (err) {
+               fw_error("pci_enable_device failed with %d", err);
+               return err;
+       }
+
+       return ohci_enable(&ohci->card, ohci->config_rom, CONFIG_ROM_SIZE);
+}
+#endif
+
 static struct pci_device_id pci_table[] = {
        { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_FIREWIRE_OHCI, ~0) },
        { }
@@ -1920,6 +1975,10 @@ static struct pci_driver fw_ohci_pci_driver = {
        .id_table       = pci_table,
        .probe          = pci_probe,
        .remove         = pci_remove,
+#ifdef CONFIG_PM
+       .resume         = pci_resume,
+       .suspend        = pci_suspend,
+#endif
 };
 
 MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
index 68300414e5f44060ec8be59d1d0cf79a6d491fdc..a98d3915e26f33f926d8e0c383842cb5330018db 100644 (file)
@@ -1108,6 +1108,58 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd)
        return SUCCESS;
 }
 
+/*
+ * Format of /sys/bus/scsi/devices/.../ieee1394_id:
+ * u64 EUI-64 : u24 directory_ID : u16 LUN  (all printed in hexadecimal)
+ *
+ * This is the concatenation of target port identifier and logical unit
+ * identifier as per SAM-2...SAM-4 annex A.
+ */
+static ssize_t
+sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr,
+                           char *buf)
+{
+       struct scsi_device *sdev = to_scsi_device(dev);
+       struct sbp2_device *sd;
+       struct fw_unit *unit;
+       struct fw_device *device;
+       u32 directory_id;
+       struct fw_csr_iterator ci;
+       int key, value, lun;
+
+       if (!sdev)
+               return 0;
+       sd = (struct sbp2_device *)sdev->host->hostdata;
+       unit = sd->unit;
+       device = fw_device(unit->device.parent);
+
+       /* implicit directory ID */
+       directory_id = ((unit->directory - device->config_rom) * 4
+                       + CSR_CONFIG_ROM) & 0xffffff;
+
+       /* explicit directory ID, overrides implicit ID if present */
+       fw_csr_iterator_init(&ci, unit->directory);
+       while (fw_csr_iterator_next(&ci, &key, &value))
+               if (key == CSR_DIRECTORY_ID) {
+                       directory_id = value;
+                       break;
+               }
+
+       /* FIXME: Make this work for multi-lun devices. */
+       lun = 0;
+
+       return sprintf(buf, "%08x%08x:%06x:%04x\n",
+                       device->config_rom[3], device->config_rom[4],
+                       directory_id, lun);
+}
+
+static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL);
+
+static struct device_attribute *sbp2_scsi_sysfs_attrs[] = {
+       &dev_attr_ieee1394_id,
+       NULL
+};
+
 static struct scsi_host_template scsi_driver_template = {
        .module                 = THIS_MODULE,
        .name                   = "SBP-2 IEEE-1394",
@@ -1121,6 +1173,7 @@ static struct scsi_host_template scsi_driver_template = {
        .use_clustering         = ENABLE_CLUSTERING,
        .cmd_per_lun            = 1,
        .can_queue              = 1,
+       .sdev_attrs             = sbp2_scsi_sysfs_attrs,
 };
 
 MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
index 8a0a99b93641d46b10efd56b09341e619cb15615..28e7b91a4553ff3d33f5e830fb881a0e7c8f6886 100644 (file)
@@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = {
        .functionality  = i2c_pxa_functionality,
 };
 
-static struct pxa_i2c i2c_pxa = {
-       .lock   = __SPIN_LOCK_UNLOCKED(i2c_pxa.lock),
-       .adap   = {
-               .owner          = THIS_MODULE,
-               .algo           = &i2c_pxa_algorithm,
-               .name           = "pxa2xx-i2c.0",
-               .retries        = 5,
-       },
-};
-
 #define res_len(r)             ((r)->end - (r)->start + 1)
 static int i2c_pxa_probe(struct platform_device *dev)
 {
-       struct pxa_i2c *i2c = &i2c_pxa;
+       struct pxa_i2c *i2c;
        struct resource *res;
        struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
        int ret;
@@ -864,15 +854,20 @@ static int i2c_pxa_probe(struct platform_device *dev)
        if (!request_mem_region(res->start, res_len(res), res->name))
                return -ENOMEM;
 
-       i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
+       i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL);
        if (!i2c) {
                ret = -ENOMEM;
                goto emalloc;
        }
 
-       memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c));
+       i2c->adap.owner   = THIS_MODULE;
+       i2c->adap.algo    = &i2c_pxa_algorithm;
+       i2c->adap.retries = 5;
+
+       spin_lock_init(&i2c->lock);
        init_waitqueue_head(&i2c->wait);
-       i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10;
+
+       sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id);
 
        i2c->reg_base = ioremap(res->start, res_len(res));
        if (!i2c->reg_base) {
index 835937e385292d648ba3d2b131e906d66bbb5f09..81b3864d2ba785b51b25d597965a608ff7879fcb 100644 (file)
@@ -976,7 +976,8 @@ static struct unit_directory *nodemgr_process_unit_directory
 
        ud->ne = ne;
        ud->ignore_driver = ignore_drivers;
-       ud->address = ud_kv->offset + CSR1212_CONFIG_ROM_SPACE_BASE;
+       ud->address = ud_kv->offset + CSR1212_REGISTER_SPACE_BASE;
+       ud->directory_id = ud->address & 0xffffff;
        ud->ud_kv = ud_kv;
        ud->id = (*id)++;
 
@@ -1085,6 +1086,10 @@ static struct unit_directory *nodemgr_process_unit_directory
 
                        break;
 
+               case CSR1212_KV_ID_DIRECTORY_ID:
+                       ud->directory_id = kv->value.immediate;
+                       break;
+
                default:
                        break;
                }
index e7ac683c72c7f26b5777425f56a94d927a3ba89d..4530b29d941c37c0bc74debaeab810920057b363 100644 (file)
@@ -75,6 +75,7 @@ struct unit_directory {
        struct csr1212_keyval *model_name_kv;
        quadlet_t specifier_id;
        quadlet_t version;
+       quadlet_t directory_id;
 
        unsigned int id;
 
index 875eadd5e8f551bcc5c261d892a1d4c3d6b24f49..3f873cc7e247a7944d4ac27359600daf378fb1f7 100644 (file)
@@ -194,6 +194,27 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
        ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
        ", or a combination)");
 
+/*
+ * This influences the format of the sysfs attribute
+ * /sys/bus/scsi/devices/.../ieee1394_id.
+ *
+ * The default format is like in older kernels:  %016Lx:%d:%d
+ * It contains the target's EUI-64, a number given to the logical unit by
+ * the ieee1394 driver's nodemgr (starting at 0), and the LUN.
+ *
+ * The long format is:  %016Lx:%06x:%04x
+ * It contains the target's EUI-64, the unit directory's directory_ID as per
+ * IEEE 1212 clause 7.7.19, and the LUN.  This format comes closest to the
+ * format of SBP(-3) target port and logical unit identifier as per SAM (SCSI
+ * Architecture Model) rev.2 to 4 annex A.  Therefore and because it is
+ * independent of the implementation of the ieee1394 nodemgr, the longer format
+ * is recommended for future use.
+ */
+static int sbp2_long_sysfs_ieee1394_id;
+module_param_named(long_ieee1394_id, sbp2_long_sysfs_ieee1394_id, bool, 0644);
+MODULE_PARM_DESC(long_ieee1394_id, "8+3+2 bytes format of ieee1394_id in sysfs "
+                "(default = backwards-compatible = N, SAM-conforming = Y)");
+
 
 #define SBP2_INFO(fmt, args...)        HPSB_INFO("sbp2: "fmt, ## args)
 #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args)
@@ -2100,8 +2121,14 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
        if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0]))
                return 0;
 
-       return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)lu->ne->guid,
-                      lu->ud->id, ORB_SET_LUN(lu->lun));
+       if (sbp2_long_sysfs_ieee1394_id)
+               return sprintf(buf, "%016Lx:%06x:%04x\n",
+                               (unsigned long long)lu->ne->guid,
+                               lu->ud->directory_id, ORB_SET_LUN(lu->lun));
+       else
+               return sprintf(buf, "%016Lx:%d:%d\n",
+                               (unsigned long long)lu->ne->guid,
+                               lu->ud->id, ORB_SET_LUN(lu->lun));
 }
 
 MODULE_AUTHOR("Ben Collins <bcollins@debian.org>");
index b234729706be800789dced2c155629e2bb448d03..be6b93c20f606b9e477746e81688d7abe25bcdda 100644 (file)
@@ -699,9 +699,9 @@ static void evdev_disconnect(struct input_handle *handle)
        if (evdev->open) {
                input_flush_device(handle, NULL);
                input_close_device(handle);
-               wake_up_interruptible(&evdev->wait);
                list_for_each_entry(client, &evdev->client_list, node)
                        kill_fasync(&client->fasync, SIGIO, POLL_HUP);
+               wake_up_interruptible(&evdev->wait);
        } else
                evdev_free(evdev);
 }
index 06f0541b24daaaed730d448d7f5f68bfa2b05c40..10e3b7bc925fd7b68ca8e7bb418d39471caa776c 100644 (file)
@@ -594,9 +594,9 @@ static void joydev_disconnect(struct input_handle *handle)
 
        if (joydev->open) {
                input_close_device(handle);
-               wake_up_interruptible(&joydev->wait);
                list_for_each_entry(client, &joydev->client_list, node)
                        kill_fasync(&client->fasync, SIGIO, POLL_HUP);
+               wake_up_interruptible(&joydev->wait);
        } else
                joydev_free(joydev);
 }
index 86ad1027e12a1ceabeedc5df8911fdfd30fdbc12..b069ee18e35312078ec3cff1d6910d102dd851a7 100644 (file)
@@ -54,7 +54,7 @@ static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata;
 
 module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0);
 MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)");
-module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[0].nargs, 0);
+module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[1].nargs, 0);
 MODULE_PARM_DESC(dev2, "Describes second attached device (<parport#>,<type>)");
 module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0);
 MODULE_PARM_DESC(dev3, "Describes third attached device (<parport#>,<type>)");
index eb0167e9f0cbe66a591ba65c90dffadb5103daff..50e06e8dd05d764a2af87fe7aa8d5c5e6f52db94 100644 (file)
@@ -48,7 +48,7 @@ config MOUSE_PS2_ALPS
          If unsure, say Y.
 
 config MOUSE_PS2_LOGIPS2PP
-       bool "Logictech PS/2++ mouse protocol extension" if EMBEDDED
+       bool "Logitech PS/2++ mouse protocol extension" if EMBEDDED
        default y
        depends on MOUSE_PS2
        help
index 8675f95093935069718d6fe8cf49d8c80ac1fbd9..3f4866d8d18c85a8dae983273ba578e2e1df3d8f 100644 (file)
@@ -766,9 +766,9 @@ static void mousedev_disconnect(struct input_handle *handle)
 
        if (mousedev->open) {
                input_close_device(handle);
-               wake_up_interruptible(&mousedev->wait);
                list_for_each_entry(client, &mousedev->client_list, node)
                        kill_fasync(&client->fasync, SIGIO, POLL_HUP);
+               wake_up_interruptible(&mousedev->wait);
        } else
                mousedev_free(mousedev);
 }
index 559508795af1887df6ac98c028cd22ebd5eb5bed..d31ece8f68e93df7ea82f61c949f48a64326d28c 100644 (file)
@@ -170,7 +170,7 @@ static void ps2_close(struct serio *io)
 /*
  * Clear the input buffer.
  */
-static void __init ps2_clear_input(struct ps2if *ps2if)
+static void __devinit ps2_clear_input(struct ps2if *ps2if)
 {
        int maxread = 100;
 
@@ -228,7 +228,7 @@ static int __init ps2_test(struct ps2if *ps2if)
 /*
  * Add one device to this driver.
  */
-static int ps2_probe(struct sa1111_dev *dev)
+static int __devinit ps2_probe(struct sa1111_dev *dev)
 {
        struct ps2if *ps2if;
        struct serio *serio;
index 8238b13874c200f33ee5ff7534dc7264e9d81919..2db364898e15f434e852c304bbcb855e271de00b 100644 (file)
@@ -476,9 +476,9 @@ static void tsdev_disconnect(struct input_handle *handle)
 
        if (tsdev->open) {
                input_close_device(handle);
-               wake_up_interruptible(&tsdev->wait);
                list_for_each_entry(client, &tsdev->client_list, node)
                        kill_fasync(&client->fasync, SIGIO, POLL_HUP);
+               wake_up_interruptible(&tsdev->wait);
        } else
                tsdev_free(tsdev);
 }
index d42fe89cddf6987648eddd2200c8c01f33eda709..3e088c42b2227befb07699a8e0ae38e4a5169f0a 100644 (file)
@@ -26,9 +26,9 @@ menu "Old ISDN4Linux"
        depends on NET && ISDN
 
 config ISDN_I4L
-       tristate "Old ISDN4Linux (obsolete)"
+       tristate "Old ISDN4Linux (deprecated)"
        ---help---
-         This driver allows you to use an ISDN-card for networking
+         This driver allows you to use an ISDN adapter for networking
          connections and as dialin/out device.  The isdn-tty's have a built
          in AT-compatible modem emulator.  Network devices support autodial,
          channel-bundling, callback and caller-authentication without having
@@ -39,8 +39,9 @@ config ISDN_I4L
 
          ISDN support in the linux kernel is moving towards a new API,
          called CAPI (Common ISDN Application Programming Interface).
-         Therefore the old ISDN4Linux layer is becoming obsolete. It is 
-         still usable, though, if you select this option.
+         Therefore the old ISDN4Linux layer will eventually become obsolete.
+         It is still available, though, for use with adapters that are not
+         supported by the new CAPI subsystem yet.
 
 if ISDN_I4L
 source "drivers/isdn/i4l/Kconfig"
index 14298b8c835fedc6ea3334a461e481d64735a94a..d755d904e62c693fec2d5444e09e4c677eb5ff40 100644 (file)
@@ -99,7 +99,7 @@ static int DIVA_INIT_FUNCTION create_proc(void)
        return (0);
 }
 
-static void DIVA_EXIT_FUNCTION remove_proc(void)
+static void remove_proc(void)
 {
        remove_proc_entry(DRIVERLNAME, proc_net_eicon);
        remove_proc_entry("net/eicon", NULL);
index df61e510a28be7ca4b71c091a330d06713b3b160..46fc21a3f8ff232038298c3c8dc8e8720f954f3c 100644 (file)
@@ -231,7 +231,7 @@ int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask)
 /*
  * exit
  */
-void DIVA_EXIT_FUNCTION divasfunc_exit(void)
+void divasfunc_exit(void)
 {
        divasa_xdi_driver_unload();
        disconnect_didd();
index ea5f30d4a5a23377bd2527211081b6bd0ff3e278..4e5f87c1e71413bb3d15d65e5edf3ae011746b20 100644 (file)
@@ -2693,8 +2693,9 @@ isdn_tty_getdial(char *p, char *q,int cnt)
        int limit = ISDN_MSNLEN - 1;    /* MUST match the size of interface var to avoid
                                        buffer overflow */
 
-       while (strchr(" 0123456789,#.*WPTS-", *p) && *p && --cnt>0) {
+       while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt>0) {
                if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) ||
+                   ((*p == 'R') && first) ||
                    (*p == '*') || (*p == '#')) {
                        *q++ = *p;
                        limit--;
index e6e4d240b2a6aa945ae2e2155bcba1901b10de77..184238e2ece4679ce04f68f455033d93b1710af5 100644 (file)
@@ -639,7 +639,7 @@ static void free_vmcs(struct vmcs *vmcs)
        free_pages((unsigned long)vmcs, vmcs_descriptor.order);
 }
 
-static __exit void free_kvm_area(void)
+static void free_kvm_area(void)
 {
        int cpu;
 
index f44c94abd883f9b8731df64f1e0e37ce39766ee8..ee699a7d62148ba05efe4bb3b11ca31524f9b462 100644 (file)
@@ -114,7 +114,7 @@ config PMAC_SMU
 config PMAC_APM_EMU
        tristate "APM emulation"
        select APM_EMULATION
-       depends on ADB_PMU && PM
+       depends on ADB_PMU && PM && PPC32
 
 config PMAC_MEDIABAY
        bool "Support PowerBook hotswap media bay"
index 7772bd1d92b4be3af84623819e69947deb6e160c..38e815a2e87135227f16095607a2a588a38d6aab 100644 (file)
@@ -291,7 +291,7 @@ static void ucb1x00_ts_irq(int idx, void *id)
 
 static int ucb1x00_ts_open(struct input_dev *idev)
 {
-       struct ucb1x00_ts *ts = idev->private;
+       struct ucb1x00_ts *ts = input_get_drvdata(idev);
        int ret = 0;
 
        BUG_ON(ts->rtask);
@@ -328,7 +328,7 @@ static int ucb1x00_ts_open(struct input_dev *idev)
  */
 static void ucb1x00_ts_close(struct input_dev *idev)
 {
-       struct ucb1x00_ts *ts = idev->private;
+       struct ucb1x00_ts *ts = input_get_drvdata(idev);
 
        if (ts->rtask)
                kthread_stop(ts->rtask);
@@ -380,7 +380,6 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
        ts->idev = idev;
        ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC;
 
-       idev->private    = ts;
        idev->name       = "Touchscreen panel";
        idev->id.product = ts->ucb->id;
        idev->open       = ucb1x00_ts_open;
@@ -391,6 +390,8 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
        __set_bit(ABS_Y, idev->absbit);
        __set_bit(ABS_PRESSURE, idev->absbit);
 
+       input_set_drvdata(idev, ts);
+
        err = input_register_device(idev);
        if (err)
                goto fail;
index 6c36a55cb3d15101c509c1768abbe59ec4475ead..95c0b96e83f2110b751d775c2a53e66d718c6564 100644 (file)
@@ -740,7 +740,7 @@ static ssize_t hotkey_enable_store(struct device *dev,
 }
 
 static struct device_attribute dev_attr_hotkey_enable =
-       __ATTR(enable, S_IWUSR | S_IRUGO,
+       __ATTR(hotkey_enable, S_IWUSR | S_IRUGO,
                hotkey_enable_show, hotkey_enable_store);
 
 /* sysfs hotkey mask --------------------------------------------------- */
@@ -775,7 +775,7 @@ static ssize_t hotkey_mask_store(struct device *dev,
 }
 
 static struct device_attribute dev_attr_hotkey_mask =
-       __ATTR(mask, S_IWUSR | S_IRUGO,
+       __ATTR(hotkey_mask, S_IWUSR | S_IRUGO,
                hotkey_mask_show, hotkey_mask_store);
 
 /* sysfs hotkey bios_enabled ------------------------------------------- */
@@ -787,7 +787,7 @@ static ssize_t hotkey_bios_enabled_show(struct device *dev,
 }
 
 static struct device_attribute dev_attr_hotkey_bios_enabled =
-       __ATTR(bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL);
+       __ATTR(hotkey_bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL);
 
 /* sysfs hotkey bios_mask ---------------------------------------------- */
 static ssize_t hotkey_bios_mask_show(struct device *dev,
@@ -798,7 +798,7 @@ static ssize_t hotkey_bios_mask_show(struct device *dev,
 }
 
 static struct device_attribute dev_attr_hotkey_bios_mask =
-       __ATTR(bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL);
+       __ATTR(hotkey_bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL);
 
 /* --------------------------------------------------------------------- */
 
@@ -824,8 +824,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
                str_supported(tp_features.hotkey));
 
        if (tp_features.hotkey) {
-               hotkey_dev_attributes = create_attr_set(4,
-                                               TPACPI_HOTKEY_SYSFS_GROUP);
+               hotkey_dev_attributes = create_attr_set(4, NULL);
                if (!hotkey_dev_attributes)
                        return -ENOMEM;
                res = add_to_attr_set(hotkey_dev_attributes,
@@ -1050,7 +1049,7 @@ static ssize_t bluetooth_enable_store(struct device *dev,
 }
 
 static struct device_attribute dev_attr_bluetooth_enable =
-       __ATTR(enable, S_IWUSR | S_IRUGO,
+       __ATTR(bluetooth_enable, S_IWUSR | S_IRUGO,
                bluetooth_enable_show, bluetooth_enable_store);
 
 /* --------------------------------------------------------------------- */
@@ -1061,7 +1060,6 @@ static struct attribute *bluetooth_attributes[] = {
 };
 
 static const struct attribute_group bluetooth_attr_group = {
-       .name = TPACPI_BLUETH_SYSFS_GROUP,
        .attrs = bluetooth_attributes,
 };
 
@@ -1215,7 +1213,7 @@ static ssize_t wan_enable_store(struct device *dev,
 }
 
 static struct device_attribute dev_attr_wan_enable =
-       __ATTR(enable, S_IWUSR | S_IRUGO,
+       __ATTR(wwan_enable, S_IWUSR | S_IRUGO,
                wan_enable_show, wan_enable_store);
 
 /* --------------------------------------------------------------------- */
@@ -1226,7 +1224,6 @@ static struct attribute *wan_attributes[] = {
 };
 
 static const struct attribute_group wan_attr_group = {
-       .name = TPACPI_WAN_SYSFS_GROUP,
        .attrs = wan_attributes,
 };
 
index 440145a026174c90bfcf85a05bc434d5504a3c21..72d62f2dabb976069ef26dabb4be6abad030be57 100644 (file)
@@ -278,8 +278,6 @@ static int beep_write(char *buf);
  * Bluetooth subdriver
  */
 
-#define TPACPI_BLUETH_SYSFS_GROUP "bluetooth"
-
 enum {
        /* ACPI GBDC/SBDC bits */
        TP_ACPI_BLUETOOTH_HWPRESENT     = 0x01, /* Bluetooth hw available */
@@ -416,8 +414,6 @@ static int fan_write_cmd_watchdog(const char *cmd, int *rc);
  * Hotkey subdriver
  */
 
-#define TPACPI_HOTKEY_SYSFS_GROUP "hotkey"
-
 static int hotkey_orig_status;
 static int hotkey_orig_mask;
 
@@ -553,8 +549,6 @@ static int volume_write(char *buf);
  * Wan subdriver
  */
 
-#define TPACPI_WAN_SYSFS_GROUP "wwan"
-
 enum {
        /* ACPI GWAN/SWAN bits */
        TP_ACPI_WANCARD_HWPRESENT       = 0x01, /* Wan hw available */
index c08ad8f823d233657b9f076f8aee62b4135e0e3b..2d1b3df95c5bfbb138f5d0c509fe33345dc2a7b4 100644 (file)
@@ -343,7 +343,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
        if (!fm->addr)
                goto err_out_free;
 
-       rc = request_irq(dev->irq, tifm_7xx1_isr, SA_SHIRQ, DRIVER_NAME, fm);
+       rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm);
        if (rc)
                goto err_out_unmap;
 
index a4873ab84e6bcc9fd73ef1cf8c17353e9b474b25..e8f686f7a357bd0e06a408dfb1b668d9a71c0317 100644 (file)
@@ -650,7 +650,7 @@ MODULE_DESCRIPTION(PMC551_VERSION);
  */
 static int msize = 0;
 #if defined(CONFIG_MTD_PMC551_APERTURE_SIZE)
-static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE
+static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE;
 #else
 static int asize = 0;
 #endif
index fe94ae9ae1f22d4feb409100726a4d8dadca5cb7..e3744eb8eccba4a68f3780379911a1eff7df2ef5 100644 (file)
@@ -101,7 +101,7 @@ static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd,
        struct nand_chip *chip = mtd->priv;
 
        if (ctrl & NAND_CTRL_CHANGE) {
-               void __iomem *addr
+               void __iomem *addr;
                unsigned char bits;
 
                addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET;
index eb7d4d443deb1b7cdcc6480f9653db79a637e6dd..082073acf20fc51b6a252623bca2d7cc59ba456b 100644 (file)
@@ -81,7 +81,7 @@ __setup("ppchameleonevb_fio_pbase=", ppchameleonevb_fio_pbase);
  */
 static struct mtd_partition partition_info_hi[] = {
       { .name = "PPChameleon HI Nand Flash",
-       offset = 0,
+       .offset = 0,
        .size = 128 * 1024 * 1024
       }
 };
@@ -424,9 +424,9 @@ static void __exit ppchameleonevb_cleanup(void)
 
        /* Release iomaps */
        this = (struct nand_chip *) &ppchameleon_mtd[1];
-       iounmap((void *) this->IO_ADDR_R;
+       iounmap((void *) this->IO_ADDR_R);
        this = (struct nand_chip *) &ppchameleonevb_mtd[1];
-       iounmap((void *) this->IO_ADDR_R;
+       iounmap((void *) this->IO_ADDR_R);
 
        /* Free the MTD device structure */
        kfree (ppchameleon_mtd);
index e8c9f27817b08f9d36c60d6abacf4b6c800e85a1..a804965e654259a3f136e02d0a4aa961b286eef2 100644 (file)
@@ -435,20 +435,12 @@ static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
 
        spin_lock_irqsave(&cp->lock, flags);
        cp->vlgrp = grp;
-       cp->cpcmd |= RxVlanOn;
-       cpw16(CpCmd, cp->cpcmd);
-       spin_unlock_irqrestore(&cp->lock, flags);
-}
-
-static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct cp_private *cp = netdev_priv(dev);
-       unsigned long flags;
+       if (grp)
+               cp->cpcmd |= RxVlanOn;
+       else
+               cp->cpcmd &= ~RxVlanOn;
 
-       spin_lock_irqsave(&cp->lock, flags);
-       cp->cpcmd &= ~RxVlanOn;
        cpw16(CpCmd, cp->cpcmd);
-       vlan_group_set_device(cp->vlgrp, vid, NULL);
        spin_unlock_irqrestore(&cp->lock, flags);
 }
 #endif /* CP_VLAN_TAG_USED */
@@ -1944,7 +1936,6 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 #if CP_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = cp_vlan_rx_register;
-       dev->vlan_rx_kill_vid = cp_vlan_rx_kill_vid;
 #endif
 
        if (pci_using_dac)
index 1798a9f9fb2557c5afa1ce9d64d8f8ea4713cabe..7d57f4a25dc178218d380adb2c265081b9d513c4 100644 (file)
@@ -2280,6 +2280,7 @@ config GFAR_NAPI
 config UCC_GETH
        tristate "Freescale QE Gigabit Ethernet"
        depends on QUICC_ENGINE
+       select PHYLIB
        help
          This driver supports the Gigabit Ethernet mode of the QUICC Engine,
          which is available on some Freescale SOCs.
index 7122b7ba8d61f098e22bfb2fab4e6e527c1de629..04382f979c996ef9834061c21ffe25399ad879e8 100644 (file)
@@ -480,12 +480,10 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev,
 #if ACENIC_DO_VLAN
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = ace_vlan_rx_register;
-       dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid;
 #endif
-       if (1) {
-               dev->tx_timeout = &ace_watchdog;
-               dev->watchdog_timeo = 5*HZ;
-       }
+
+       dev->tx_timeout = &ace_watchdog;
+       dev->watchdog_timeo = 5*HZ;
 
        dev->open = &ace_open;
        dev->stop = &ace_close;
@@ -2283,19 +2281,6 @@ static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        ace_unmask_irq(dev);
        local_irq_restore(flags);
 }
-
-
-static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct ace_private *ap = netdev_priv(dev);
-       unsigned long flags;
-
-       local_irq_save(flags);
-       ace_mask_irq(dev);
-       vlan_group_set_device(ap->vlgrp, vid, NULL);
-       ace_unmask_irq(dev);
-       local_irq_restore(flags);
-}
 #endif /* ACENIC_DO_VLAN */
 
 
index 8ca8534d70bf33c56adac5130bd284808ab1a938..60ed1837fa8fd8435da2efa09c2c5c63dd619d28 100644 (file)
@@ -787,7 +787,6 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev);
 static int read_eeprom_byte(struct net_device *dev, unsigned long offset);
 #if ACENIC_DO_VLAN
 static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp);
-static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid);
 #endif
 
 #endif /* _ACENIC_H_ */
index 675fe918421b69ca171964e9e0f41581d2601a8b..a61b2f89fc336c3f7bc75a9f2dece28c37124586 100644 (file)
@@ -155,7 +155,7 @@ This function will write into PHY registers.
 */
 static int amd8111e_write_phy(struct amd8111e_priv* lp,int phy_id, int reg, u32 val)
 {
-       unsigned int repeat = REPEAT_CNT
+       unsigned int repeat = REPEAT_CNT;
        void __iomem *mmio = lp->mmio;
        unsigned int reg_val;
 
@@ -1728,15 +1728,8 @@ static void amd8111e_vlan_rx_register(struct net_device *dev, struct vlan_group
        lp->vlgrp = grp;
        spin_unlock_irq(&lp->lock);
 }
-
-static void amd8111e_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct amd8111e_priv *lp = netdev_priv(dev);
-       spin_lock_irq(&lp->lock);
-       vlan_group_set_device(lp->vlgrp, vid, NULL);
-       spin_unlock_irq(&lp->lock);
-}
 #endif
+
 static int amd8111e_enable_magicpkt(struct amd8111e_priv* lp)
 {
        writel( VAL1|MPPLBA, lp->mmio + CMD3);
@@ -1996,7 +1989,6 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
 #if AMD8111E_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX ;
        dev->vlan_rx_register =amd8111e_vlan_rx_register;
-       dev->vlan_rx_kill_vid = amd8111e_vlan_rx_kill_vid;
 #endif
 
        lp = netdev_priv(dev);
@@ -2049,7 +2041,6 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev,
 #if AMD8111E_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register =amd8111e_vlan_rx_register;
-       dev->vlan_rx_kill_vid = amd8111e_vlan_rx_kill_vid;
 #endif
        /* Probe the external PHY */
        amd8111e_probe_ext_phy(dev);
index 2007510c4eb6b97dd744a4487c8c3516997cefaf..e65080a5994a62010ec66fa79075997bb507e104 100644 (file)
@@ -615,7 +615,7 @@ typedef enum {
 #define SSTATE  2
 
 /* Assume contoller gets data 10 times the maximum processing time */
-#define  REPEAT_CNT                    10;
+#define  REPEAT_CNT                    10
 
 /* amd8111e decriptor flag definitions */
 typedef enum {
index 78cf00ff3d388d9f3eb899b69846de27daa04181..6862c11ff86408972ca124ab6813ee52fe497c0b 100644 (file)
@@ -1229,39 +1229,9 @@ static void atl1_vlan_rx_register(struct net_device *netdev,
        spin_unlock_irqrestore(&adapter->lock, flags);
 }
 
-/* FIXME: justify or remove -- CHS */
-static void atl1_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
-{
-       /* We don't do Vlan filtering */
-       return;
-}
-
-/* FIXME: this looks wrong too -- CHS */
-static void atl1_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
-{
-       struct atl1_adapter *adapter = netdev_priv(netdev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&adapter->lock, flags);
-       /* atl1_irq_disable(adapter); */
-       vlan_group_set_device(adapter->vlgrp, vid, NULL);
-       /* atl1_irq_enable(adapter); */
-       spin_unlock_irqrestore(&adapter->lock, flags);
-       /* We don't do Vlan filtering */
-       return;
-}
-
 static void atl1_restore_vlan(struct atl1_adapter *adapter)
 {
        atl1_vlan_rx_register(adapter->netdev, adapter->vlgrp);
-       if (adapter->vlgrp) {
-               u16 vid;
-               for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) {
-                       if (!vlan_group_get_device(adapter->vlgrp, vid))
-                               continue;
-                       atl1_vlan_rx_add_vid(adapter->netdev, vid);
-               }
-       }
 }
 
 static u16 tpd_avail(struct atl1_tpd_ring *tpd_ring)
@@ -2203,8 +2173,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
        netdev->poll_controller = atl1_poll_controller;
 #endif
        netdev->vlan_rx_register = atl1_vlan_rx_register;
-       netdev->vlan_rx_add_vid = atl1_vlan_rx_add_vid;
-       netdev->vlan_rx_kill_vid = atl1_vlan_rx_kill_vid;
+
        netdev->ethtool_ops = &atl1_ethtool_ops;
        adapter->bd_number = cards_found;
        adapter->pci_using_64 = pci_using_64;
index 88b33c6ddda8d0aaef1306251b63d7c0211c5e16..da7c3b0c533c5c55d937ee9dc2878d6be434cec7 100644 (file)
@@ -4786,19 +4786,6 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp)
 
        bnx2_netif_start(bp);
 }
-
-/* Called with rtnl_lock */
-static void
-bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
-{
-       struct bnx2 *bp = netdev_priv(dev);
-
-       bnx2_netif_stop(bp);
-       vlan_group_set_device(bp->vlgrp, vid, NULL);
-       bnx2_set_rx_mode(dev);
-
-       bnx2_netif_start(bp);
-}
 #endif
 
 /* Called with netif_tx_lock.
@@ -6453,7 +6440,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->watchdog_timeo = TX_TIMEOUT;
 #ifdef BCM_VLAN
        dev->vlan_rx_register = bnx2_vlan_rx_register;
-       dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid;
 #endif
        dev->poll = bnx2_poll;
        dev->ethtool_ops = &bnx2_ethtool_ops;
index 9fe3a38883ee7037fa834315bf4d651e04afa6f2..59b9943b077d4225c236a1a702fc5d9fbaa82f4b 100644 (file)
@@ -4920,7 +4920,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
        pci_cmd |= PCI_COMMAND_PARITY;
        pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
        if (pci_set_mwi(pdev))
-               printk(KERN_WARNING PFX "Could enable MWI for %s\n",
+               printk(KERN_WARNING PFX "Could not enable MWI for %s\n",
                       pci_name(pdev));
 
        /*
index 125c9b10586920bb244970606c85cfe21025277f..231ce43b97cfeb68817eabce4148feeaf8285449 100644 (file)
@@ -883,15 +883,6 @@ static void vlan_rx_register(struct net_device *dev,
        t1_set_vlan_accel(adapter, grp != NULL);
        spin_unlock_irq(&adapter->async_lock);
 }
-
-static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct adapter *adapter = dev->priv;
-
-       spin_lock_irq(&adapter->async_lock);
-       vlan_group_set_device(adapter->vlan_grp, vid, NULL);
-       spin_unlock_irq(&adapter->async_lock);
-}
 #endif
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
@@ -1099,7 +1090,6 @@ static int __devinit init_one(struct pci_dev *pdev,
                        netdev->features |=
                                NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
                        netdev->vlan_rx_register = vlan_rx_register;
-                       netdev->vlan_rx_kill_vid = vlan_rx_kill_vid;
 #endif
 
                        /* T204: disable TSO */
index 67b4b219d927884395857446ce1550548a53b6fd..1b20f4060e2d7a1fbdb00b9154d88103a4127625 100644 (file)
@@ -2067,11 +2067,6 @@ static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        t3_synchronize_rx(adapter, pi);
 }
 
-static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       /* nothing */
-}
-
 #ifdef CONFIG_NET_POLL_CONTROLLER
 static void cxgb_netpoll(struct net_device *dev)
 {
@@ -2409,7 +2404,6 @@ static int __devinit init_one(struct pci_dev *pdev,
 
                netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
                netdev->vlan_rx_register = vlan_rx_register;
-               netdev->vlan_rx_kill_vid = vlan_rx_kill_vid;
 
                netdev->open = cxgb_open;
                netdev->stop = cxgb_close;
index 571d82f8008c4e9fff3d0b7cff680143b5a9d31c..7df23dc28190c37fd5014480aade885053021ef4 100644 (file)
@@ -566,6 +566,7 @@ static int __devinit dfx_register(struct device *bdev)
                bp->base.mem = ioremap_nocache(bar_start, bar_len);
                if (!bp->base.mem) {
                        printk(KERN_ERR "%s: Cannot map MMIO\n", print_name);
+                       err = -ENOMEM;
                        goto err_out_region;
                }
        } else {
index cbc7febe9cdcdc1c1692aa1f857276e865549953..cf8af928a69cd4b9d157fb97cb6f6071dc421ba8 100644 (file)
@@ -1142,13 +1142,16 @@ e1000_probe(struct pci_dev *pdev,
            !e1000_check_mng_mode(&adapter->hw))
                e1000_get_hw_control(adapter);
 
-       strcpy(netdev->name, "eth%d");
-       if ((err = register_netdev(netdev)))
-               goto err_register;
-
        /* tell the stack to leave us alone until e1000_open() is called */
        netif_carrier_off(netdev);
        netif_stop_queue(netdev);
+#ifdef CONFIG_E1000_NAPI
+       netif_poll_disable(netdev);
+#endif
+
+       strcpy(netdev->name, "eth%d");
+       if ((err = register_netdev(netdev)))
+               goto err_register;
 
        DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n");
 
@@ -1325,7 +1328,10 @@ e1000_sw_init(struct e1000_adapter *adapter)
        spin_lock_init(&adapter->tx_queue_lock);
 #endif
 
-       atomic_set(&adapter->irq_sem, 1);
+       /* Explicitly disable IRQ since the NIC can be in any state. */
+       atomic_set(&adapter->irq_sem, 0);
+       e1000_irq_disable(adapter);
+
        spin_lock_init(&adapter->stats_lock);
 
        set_bit(__E1000_DOWN, &adapter->flags);
@@ -1431,6 +1437,10 @@ e1000_open(struct net_device *netdev)
        /* From here on the code is the same as e1000_up() */
        clear_bit(__E1000_DOWN, &adapter->flags);
 
+#ifdef CONFIG_E1000_NAPI
+       netif_poll_enable(netdev);
+#endif
+
        e1000_irq_enable(adapter);
 
        /* fire a link status change interrupt to start the watchdog */
index 602872dbe15fa4be022b2effd872a0deb447c6b3..e85a933a47625e68bee0704b17d2a5675ac7d492 100644 (file)
@@ -39,7 +39,7 @@
 #include <asm/io.h>
 
 #define DRV_NAME       "ehea"
-#define DRV_VERSION    "EHEA_0058"
+#define DRV_VERSION    "EHEA_0061"
 
 #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
        | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
index f6e0cb1ada1ff6a0b14fa07b0e574f18316bf0dc..152bb2016a2c94998e68c0094ab64d9425582dc7 100644 (file)
@@ -428,7 +428,7 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
                                }
                                skb_copy_to_linear_data(skb, ((char*)cqe) + 64,
                                               cqe->num_bytes_transfered - 4);
-                               ehea_fill_skb(dev, skb, cqe);
+                               ehea_fill_skb(port->netdev, skb, cqe);
                        } else if (rq == 2) {  /* RQ2 */
                                skb = get_skb_by_index(skb_arr_rq2,
                                                       skb_arr_rq2_len, cqe);
index 88efe9731babe983d6cc76983c3a93a5173498d5..e5502af5b8e21a2bf7e3cef3aa13b6e1f1f9c69b 100644 (file)
@@ -550,7 +550,7 @@ static int fec_enet_rx_common(struct net_device *dev, int *budget)
                                skbn = dev_alloc_skb(pkt_len + 2);
                                if (skbn != NULL) {
                                        skb_reserve(skbn, 2);   /* align IP header */
-                                       skb_copy_from_linear_data(skb
+                                       skb_copy_from_linear_data(skb,
                                                                  skbn->data,
                                                                  pkt_len);
                                        /* swap */
index 4154fd0007467481f39785865ae55c769dbbde9f..32788ca40d25c4cbc726d96451d181038128c003 100644 (file)
@@ -4605,12 +4605,7 @@ static void nv_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        writel(np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
 
        spin_unlock_irq(&np->lock);
-};
-
-static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       /* nothing to do */
-};
+}
 
 /* The mgmt unit and driver use a semaphore to access the phy during init */
 static int nv_mgmt_acquire_sema(struct net_device *dev)
@@ -4956,7 +4951,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
                np->vlanctl_bits = NVREG_VLANCONTROL_ENABLE;
                dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX;
                dev->vlan_rx_register = nv_vlan_rx_register;
-               dev->vlan_rx_kill_vid = nv_vlan_rx_kill_vid;
        }
 
        np->msi_flags = 0;
index f5b3cba23fc5e402068c2be8d3511fc9dac73147..6822bf14267b265ca8c3b0adc0801074b1f37728 100644 (file)
@@ -140,7 +140,6 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit);
 static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length);
 static void gfar_vlan_rx_register(struct net_device *netdev,
                                struct vlan_group *grp);
-static void gfar_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
 void gfar_halt(struct net_device *dev);
 void gfar_start(struct net_device *dev);
 static void gfar_clear_exact_match(struct net_device *dev);
@@ -284,7 +283,6 @@ static int gfar_probe(struct platform_device *pdev)
 
        if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) {
                dev->vlan_rx_register = gfar_vlan_rx_register;
-               dev->vlan_rx_kill_vid = gfar_vlan_rx_kill_vid;
 
                dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 
@@ -1133,20 +1131,6 @@ static void gfar_vlan_rx_register(struct net_device *dev,
        spin_unlock_irqrestore(&priv->rxlock, flags);
 }
 
-
-static void gfar_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
-{
-       struct gfar_private *priv = netdev_priv(dev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&priv->rxlock, flags);
-
-       vlan_group_set_device(priv->vlgrp, vid, NULL);
-
-       spin_unlock_irqrestore(&priv->rxlock, flags);
-}
-
-
 static int gfar_change_mtu(struct net_device *dev, int new_mtu)
 {
        int tempsize, tempval;
index 8118a6750b614ded8ca7ca0365014d7776022406..8caa591c56494f486461dd831a152bf09d229bb1 100644 (file)
@@ -3005,7 +3005,7 @@ static int __init hp100_isa_init(void)
        return cards > 0 ? 0 : -ENODEV;
 }
 
-static void __exit hp100_isa_cleanup(void)
+static void hp100_isa_cleanup(void)
 {
        int i;
 
index 5d14be7405a37e29c6a75ee73d9409f25f0d9aa3..b53b7ad999bcb58290b5f790b3afcb15b7eddbb0 100644 (file)
@@ -1472,6 +1472,7 @@ static const struct ethtool_ops myri10ge_ethtool_ops = {
        .set_sg = ethtool_op_set_sg,
        .get_tso = ethtool_op_get_tso,
        .set_tso = ethtool_op_set_tso,
+       .get_link = ethtool_op_get_link,
        .get_strings = myri10ge_get_strings,
        .get_stats_count = myri10ge_get_stats_count,
        .get_ethtool_stats = myri10ge_get_ethtool_stats,
index 2c5c6d20e6e91c8ca8609e67e2ec474e9b53e797..c61181f23bd58dce16d347240b39da5f04f3fb40 100644 (file)
@@ -654,8 +654,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
        if (adapter->portnum == 0)
                netxen_free_adapter_offload(adapter);
 
-       if (adapter->irq)
-               free_irq(adapter->irq, adapter);
        if(adapter->portnum == 0) {
                /* leave the hw in the same state as reboot */
                writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
index 3439f8c649f93e5281aed53ceb2a8b9067ff38c3..717d8e9b98332ab4a59256079005c3560cedb141 100644 (file)
@@ -506,17 +506,6 @@ static void ns83820_vlan_rx_register(struct net_device *ndev, struct vlan_group
        spin_unlock(&dev->tx_lock);
        spin_unlock_irq(&dev->misc_lock);
 }
-
-static void ns83820_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid)
-{
-       struct ns83820 *dev = PRIV(ndev);
-
-       spin_lock_irq(&dev->misc_lock);
-       spin_lock(&dev->tx_lock);
-       vlan_group_set_device(dev->vlgrp, vid, NULL);
-       spin_unlock(&dev->tx_lock);
-       spin_unlock_irq(&dev->misc_lock);
-}
 #endif
 
 /* Packet Receiver
@@ -2083,7 +2072,6 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_
        /* We also support hardware vlan acceleration */
        ndev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        ndev->vlan_rx_register = ns83820_vlan_rx_register;
-       ndev->vlan_rx_kill_vid = ns83820_vlan_rx_kill_vid;
 #endif
 
        if (using_dac) {
index d8766c0e825585c230171dcb57cc0a627a791c5f..585be044ebbbdac47d88b0bb76eeb7e932ea027a 100755 (executable)
@@ -4044,7 +4044,7 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev,
        if (pci_using_dac)
                ndev->features |= NETIF_F_HIGHDMA;
        if (qdev->device_id == QL3032_DEVICE_ID)
-               ndev->features |= (NETIF_F_HW_CSUM | NETIF_F_SG);
+               ndev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
 
        qdev->mem_map_registers =
            ioremap_nocache(pci_resource_start(pdev, 1),
index 45876a854f002975893d95265798797bb4bc7f1d..5ec7752caa4806c7a2adb10d898c11e04a39583f 100644 (file)
@@ -886,16 +886,6 @@ static void rtl8169_vlan_rx_register(struct net_device *dev,
        spin_unlock_irqrestore(&tp->lock, flags);
 }
 
-static void rtl8169_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct rtl8169_private *tp = netdev_priv(dev);
-       unsigned long flags;
-
-       spin_lock_irqsave(&tp->lock, flags);
-       vlan_group_set_device(tp->vlgrp, vid, NULL);
-       spin_unlock_irqrestore(&tp->lock, flags);
-}
-
 static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
                               struct sk_buff *skb)
 {
@@ -1671,7 +1661,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 #ifdef CONFIG_R8169_VLAN
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = rtl8169_vlan_rx_register;
-       dev->vlan_rx_kill_vid = rtl8169_vlan_rx_kill_vid;
 #endif
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
index e3e6d410d72cdeef0d27bf10de6dce155bb6f201..c6ba3dee8ae0f4a2a84a09018411360b5022eeee 100644 (file)
@@ -340,17 +340,6 @@ static void s2io_vlan_rx_register(struct net_device *dev,
 /* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */
 static int vlan_strip_flag;
 
-/* Unregister the vlan */
-static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid)
-{
-       struct s2io_nic *nic = dev->priv;
-       unsigned long flags;
-
-       spin_lock_irqsave(&nic->tx_lock, flags);
-       vlan_group_set_device(nic->vlgrp, vid, NULL);
-       spin_unlock_irqrestore(&nic->tx_lock, flags);
-}
-
 /*
  * Constants to be programmed into the Xena's registers, to configure
  * the XAUI.
@@ -7412,7 +7401,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre)
        SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = s2io_vlan_rx_register;
-       dev->vlan_rx_kill_vid = (void *)s2io_vlan_rx_kill_vid;
 
        /*
         * will use eth_mac_addr() for  dev->set_mac_address
index fe847800acdcd85ac2a962668d6a0b19eadd7415..75afc1f07ba0ab2b70d263738759cb30c9b52fa9 100644 (file)
@@ -1748,7 +1748,7 @@ char *addr_to_string(struct fddi_addr *addr)
 #endif
 
 #ifdef AM29K
-smt_ifconfig(int argc, char *argv[])
+int smt_ifconfig(int argc, char *argv[])
 {
        if (argc >= 2 && !strcmp(argv[0],"opt_bypass") &&
            !strcmp(argv[1],"yes")) {
index 832fd69a0e59b155f4b28fbf5d502ce363d087b8..fe01b961b597263dc20aad6b331b384c3830d549 100644 (file)
@@ -364,7 +364,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port)
                        /* for SFP-module set SIGDET polarity to low */
                        ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
                        ctrl |= PHY_M_FIB_SIGD_POL;
-                       gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
+                       gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
                }
 
                gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
@@ -658,7 +658,7 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
        const u8 *addr = hw->dev[port]->dev_addr;
 
        sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
-       sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR|GPC_ENA_PAUSE);
+       sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR);
 
        sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR);
 
@@ -1049,26 +1049,22 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp
        u16 port = sky2->port;
 
        netif_tx_lock_bh(dev);
+       netif_poll_disable(sky2->hw->dev[0]);
 
-       sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_ON);
-       sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_ON);
        sky2->vlgrp = grp;
+       if (grp) {
+               sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T),
+                            RX_VLAN_STRIP_ON);
+               sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T),
+                            TX_VLAN_TAG_ON);
+       } else {
+               sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T),
+                            RX_VLAN_STRIP_OFF);
+               sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T),
+                            TX_VLAN_TAG_OFF);
+       }
 
-       netif_tx_unlock_bh(dev);
-}
-
-static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct sky2_port *sky2 = netdev_priv(dev);
-       struct sky2_hw *hw = sky2->hw;
-       u16 port = sky2->port;
-
-       netif_tx_lock_bh(dev);
-
-       sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF);
-       sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF);
-       vlan_group_set_device(sky2->vlgrp, vid, NULL);
-
+       netif_poll_enable(sky2->hw->dev[0]);
        netif_tx_unlock_bh(dev);
 }
 #endif
@@ -1432,7 +1428,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev)
                tcpsum = offset << 16;          /* sum start */
                tcpsum |= offset + skb->csum_offset;    /* sum write */
 
-               ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
+               ctrl |= CALSUM | WR_SUM | INIT_SUM | LOCK_SUM;
                if (ip_hdr(skb)->protocol == IPPROTO_UDP)
                        ctrl |= UDPTCP;
 
@@ -3484,7 +3480,6 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
 #ifdef SKY2_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = sky2_vlan_rx_register;
-       dev->vlan_rx_kill_vid = sky2_vlan_rx_kill_vid;
 #endif
 
        /* read the mac address */
index 5efb5afc45baa091eee09138cdf1593cb3d4341c..b8c4a3b5eadf9812f7bede24ebeeb20f76a41e6b 100644 (file)
@@ -1149,7 +1149,7 @@ enum {
        PHY_M_IS_JABBER         = 1<<0, /* Jabber */
 
        PHY_M_DEF_MSK           = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE
-                                | PHY_M_IS_FIFO_ERROR,
+                                | PHY_M_IS_DUP_CHANGE,
        PHY_M_AN_MSK           = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL,
 };
 
@@ -1732,28 +1732,6 @@ enum {
 
 /*     GPHY_CTRL               32 bit  GPHY Control Reg (YUKON only) */
 enum {
-       GPC_SEL_BDT     = 1<<28, /* Select Bi-Dir. Transfer for MDC/MDIO */
-       GPC_INT_POL_HI  = 1<<27, /* IRQ Polarity is Active HIGH */
-       GPC_75_OHM      = 1<<26, /* Use 75 Ohm Termination instead of 50 */
-       GPC_DIS_FC      = 1<<25, /* Disable Automatic Fiber/Copper Detection */
-       GPC_DIS_SLEEP   = 1<<24, /* Disable Energy Detect */
-       GPC_HWCFG_M_3   = 1<<23, /* HWCFG_MODE[3] */
-       GPC_HWCFG_M_2   = 1<<22, /* HWCFG_MODE[2] */
-       GPC_HWCFG_M_1   = 1<<21, /* HWCFG_MODE[1] */
-       GPC_HWCFG_M_0   = 1<<20, /* HWCFG_MODE[0] */
-       GPC_ANEG_0      = 1<<19, /* ANEG[0] */
-       GPC_ENA_XC      = 1<<18, /* Enable MDI crossover */
-       GPC_DIS_125     = 1<<17, /* Disable 125 MHz clock */
-       GPC_ANEG_3      = 1<<16, /* ANEG[3] */
-       GPC_ANEG_2      = 1<<15, /* ANEG[2] */
-       GPC_ANEG_1      = 1<<14, /* ANEG[1] */
-       GPC_ENA_PAUSE   = 1<<13, /* Enable Pause (SYM_OR_REM) */
-       GPC_PHYADDR_4   = 1<<12, /* Bit 4 of Phy Addr */
-       GPC_PHYADDR_3   = 1<<11, /* Bit 3 of Phy Addr */
-       GPC_PHYADDR_2   = 1<<10, /* Bit 2 of Phy Addr */
-       GPC_PHYADDR_1   = 1<<9,  /* Bit 1 of Phy Addr */
-       GPC_PHYADDR_0   = 1<<8,  /* Bit 0 of Phy Addr */
-                                               /* Bits  7..2:  reserved */
        GPC_RST_CLR     = 1<<1, /* Clear GPHY Reset */
        GPC_RST_SET     = 1<<0, /* Set   GPHY Reset */
 };
index 111f23d05764b1544ee06f6f0e9d95a3bafee31f..506bffcbc6dc9f319eafc8d2804ae123ed1181d3 100644 (file)
@@ -281,17 +281,14 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg)
 
 #elif   defined(CONFIG_SUPERH)
 
-#if defined(CONFIG_SH_7780_SOLUTION_ENGINE) || defined(CONFIG_SH_7722_SOLUTION_ENGINE)
+#ifdef CONFIG_SOLUTION_ENGINE
 #define SMC_CAN_USE_8BIT       0
 #define SMC_CAN_USE_16BIT      1
 #define SMC_CAN_USE_32BIT      0
 #define SMC_IO_SHIFT           0
 #define SMC_NOWAIT             1
 
-#define SMC_inb(a, r)          (inw((a) + ((r)&~1)) >> (8*(r%2)))&0xff
 #define SMC_inw(a, r)          inw((a) + (r))
-#define SMC_outb(v, a, r)      outw(((inw((a)+((r)&~1))*(0xff<<8*(r%2)))) | ((v)<<(8*(r&2)))), (a) + ((r)&~1))
-
 #define SMC_outw(v, a, r)      outw(v, (a) + (r))
 #define SMC_insw(a, r, p, l)   insw((a) + (r), p, l)
 #define SMC_outsw(a, r, p, l)  outsw((a) + (r), p, l)
index ef84d7c757a080d8f26b3d2576f3d90a490b7052..b47ad1df2e0cd8c6cafe7d4e51a00cfa27945013 100644 (file)
@@ -1190,43 +1190,6 @@ spider_net_poll(struct net_device *netdev, int *budget)
        return 1;
 }
 
-/**
- * spider_net_vlan_rx_reg - initializes VLAN structures in the driver and card
- * @netdev: interface device structure
- * @grp: vlan_group structure that is registered (NULL on destroying interface)
- */
-static void
-spider_net_vlan_rx_reg(struct net_device *netdev, struct vlan_group *grp)
-{
-       /* further enhancement... yet to do */
-       return;
-}
-
-/**
- * spider_net_vlan_rx_add - adds VLAN id to the card filter
- * @netdev: interface device structure
- * @vid: VLAN id to add
- */
-static void
-spider_net_vlan_rx_add(struct net_device *netdev, uint16_t vid)
-{
-       /* further enhancement... yet to do */
-       /* add vid to card's VLAN filter table */
-       return;
-}
-
-/**
- * spider_net_vlan_rx_kill - removes VLAN id to the card filter
- * @netdev: interface device structure
- * @vid: VLAN id to remove
- */
-static void
-spider_net_vlan_rx_kill(struct net_device *netdev, uint16_t vid)
-{
-       /* further enhancement... yet to do */
-       /* remove vid from card's VLAN filter table */
-}
-
 /**
  * spider_net_get_stats - get interface statistics
  * @netdev: interface device structure
@@ -2177,9 +2140,6 @@ spider_net_setup_netdev_ops(struct net_device *netdev)
        netdev->poll = &spider_net_poll;
        netdev->weight = SPIDER_NET_NAPI_WEIGHT;
        /* HW VLAN */
-       netdev->vlan_rx_register = &spider_net_vlan_rx_reg;
-       netdev->vlan_rx_add_vid = &spider_net_vlan_rx_add;
-       netdev->vlan_rx_kill_vid = &spider_net_vlan_rx_kill;
 #ifdef CONFIG_NET_POLL_CONTROLLER
        /* poll controller */
        netdev->poll_controller = &spider_net_poll_controller;
index 923b9c725cc3f4e5cd75434914dbb4ce466c151f..2f3184184ad9b201c82d5c38260de72d4a5f2d6a 100644 (file)
@@ -64,8 +64,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.76"
-#define DRV_MODULE_RELDATE     "May 5, 2007"
+#define DRV_MODULE_VERSION     "3.77"
+#define DRV_MODULE_RELDATE     "May 31, 2007"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
@@ -9121,21 +9121,6 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        if (netif_running(dev))
                tg3_netif_start(tp);
 }
-
-static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct tg3 *tp = netdev_priv(dev);
-
-       if (netif_running(dev))
-               tg3_netif_stop(tp);
-
-       tg3_full_lock(tp, 0);
-       vlan_group_set_device(tp->vlgrp, vid, NULL);
-       tg3_full_unlock(tp);
-
-       if (netif_running(dev))
-               tg3_netif_start(tp);
-}
 #endif
 
 static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
@@ -10976,6 +10961,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
         * upon subsystem IDs.
         */
        if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 &&
            !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) {
                tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT |
                                  TG3_FLAG_USE_LINKCHG_REG);
@@ -11778,7 +11764,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
 #if TG3_VLAN_TAG_USED
        dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
        dev->vlan_rx_register = tg3_vlan_rx_register;
-       dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid;
 #endif
 
        tp = netdev_priv(dev);
index f72573594121340f217336024e9a1aff192c30db..15b2fb8aa49280008f1b38925340df4495c19cdd 100644 (file)
@@ -741,15 +741,6 @@ typhoon_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
        spin_unlock_bh(&tp->state_lock);
 }
 
-static void
-typhoon_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
-{
-       struct typhoon *tp = netdev_priv(dev);
-       spin_lock_bh(&tp->state_lock);
-       vlan_group_set_device(tp->vlgrp, vid, NULL);
-       spin_unlock_bh(&tp->state_lock);
-}
-
 static inline void
 typhoon_tso_fill(struct sk_buff *skb, struct transmit_ring *txRing,
                        u32 ring_dma)
@@ -2542,7 +2533,7 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        dev->get_stats          = typhoon_get_stats;
        dev->set_mac_address    = typhoon_set_mac_address;
        dev->vlan_rx_register   = typhoon_vlan_rx_register;
-       dev->vlan_rx_kill_vid   = typhoon_vlan_rx_kill_vid;
+
        SET_ETHTOOL_OPS(dev, &typhoon_ethtool_ops);
 
        /* We can handle scatter gather, up to 16 entries, and
index 246fac0e80010bf4537417f0093b6a8d682bffdd..3df3c60263d4ac07e50e4aa4029a0f03affdc101 100644 (file)
@@ -311,7 +311,7 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb,
        local_info_t *local;
        struct ieee80211_hdr_4addr *hdr;
        u16 fc;
-       int hdr_len, res;
+       int prefix_len, postfix_len, hdr_len, res;
 
        iface = netdev_priv(skb->dev);
        local = iface->local;
@@ -337,10 +337,13 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb,
        if (skb == NULL)
                return NULL;
 
-       if ((skb_headroom(skb) < crypt->ops->extra_mpdu_prefix_len ||
-            skb_tailroom(skb) < crypt->ops->extra_mpdu_postfix_len) &&
-           pskb_expand_head(skb, crypt->ops->extra_mpdu_prefix_len,
-                            crypt->ops->extra_mpdu_postfix_len, GFP_ATOMIC)) {
+       prefix_len = crypt->ops->extra_mpdu_prefix_len +
+               crypt->ops->extra_msdu_prefix_len;
+       postfix_len = crypt->ops->extra_mpdu_postfix_len +
+               crypt->ops->extra_msdu_postfix_len;
+       if ((skb_headroom(skb) < prefix_len ||
+            skb_tailroom(skb) < postfix_len) &&
+           pskb_expand_head(skb, prefix_len, postfix_len, GFP_ATOMIC)) {
                kfree_skb(skb);
                return NULL;
        }
index dd070cccf324a8effd3f1db02aca58a7f1d5ceb8..f49eb068c7d0ce232b9535d6d036bf64ae11222c 100644 (file)
@@ -378,9 +378,10 @@ islpci_eth_receive(islpci_private *priv)
        display_buffer((char *) skb->data, skb->len);
 #endif
        /* take care of monitor mode and spy monitoring. */
-       if (unlikely(priv->iw_mode == IW_MODE_MONITOR))
+       if (unlikely(priv->iw_mode == IW_MODE_MONITOR)) {
+               skb->dev = ndev;
                discard = islpci_monitor_rx(priv, &skb);
-       else {
+       else {
                if (unlikely(skb->data[2 * ETH_ALEN] == 0)) {
                        /* The packet has a rx_annex. Read it for spy monitoring, Then
                         * remove it, while keeping the 2 leading MAC addr.
index d9cbd586ae4bc282815a6b7aad16ddb3ecb523df..be1df85e5e2d5ae08b5a3f562cb462589495f409 100644 (file)
 #include <linux/pci.h>
 #include <linux/proc_fs.h>
 #include <linux/msi.h>
+#include <linux/smp.h>
 
 #include <asm/errno.h>
 #include <asm/io.h>
-#include <asm/smp.h>
 
 #include "pci.h"
 #include "msi.h"
@@ -333,7 +333,7 @@ static int msi_capability_init(struct pci_dev *dev)
                        msi_mask_bits_reg(pos, is_64bit_address(control)),
                        maskbits);
        }
-       list_add(&entry->list, &dev->msi_list);
+       list_add_tail(&entry->list, &dev->msi_list);
 
        /* Configure MSI capability structure */
        ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI);
@@ -404,7 +404,7 @@ static int msix_capability_init(struct pci_dev *dev,
                entry->dev = dev;
                entry->mask_base = base;
 
-               list_add(&entry->list, &dev->msi_list);
+               list_add_tail(&entry->list, &dev->msi_list);
        }
 
        ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
@@ -558,12 +558,12 @@ static int msi_free_irqs(struct pci_dev* dev)
 
        list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) {
                if (entry->msi_attrib.type == PCI_CAP_ID_MSIX) {
-                       if (list_is_last(&entry->list, &dev->msi_list))
-                               iounmap(entry->mask_base);
-
                        writel(1, entry->mask_base + entry->msi_attrib.entry_nr
                                  * PCI_MSIX_ENTRY_SIZE
                                  + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET);
+
+                       if (list_is_last(&entry->list, &dev->msi_list))
+                               iounmap(entry->mask_base);
                }
                list_del(&entry->list);
                kfree(entry);
index 6ccc2e95930a299074550ef9c050a42011c80c98..01d8f8a8843c5c064250f09af7396a1e3aa7cdd0 100644 (file)
@@ -1625,18 +1625,22 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA,  PCI_DEVICE_ID_NVIDIA_CK804_PCIE,
                        quirk_nvidia_ck804_pcie_aer_ext_cap);
 
 #ifdef CONFIG_PCI_MSI
-/* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely
- * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually
- * some other busses controlled by the chipset even if Linux is not aware of it.
- * Instead of setting the flag on all busses in the machine, simply disable MSI
- * globally.
+/* Some chipsets do not support MSI. We cannot easily rely on setting
+ * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually
+ * some other busses controlled by the chipset even if Linux is not
+ * aware of it.  Instead of setting the flag on all busses in the
+ * machine, simply disable MSI globally.
  */
-static void __init quirk_svw_msi(struct pci_dev *dev)
+static void __init quirk_disable_all_msi(struct pci_dev *dev)
 {
        pci_no_msi();
        printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n");
 }
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000_PCIX, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
 
 /* Disable MSI on chipsets that are known to not support it */
 static void __devinit quirk_disable_msi(struct pci_dev *dev)
@@ -1649,8 +1653,6 @@ static void __devinit quirk_disable_msi(struct pci_dev *dev)
        }
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi);
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_msi);
-DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_msi);
 
 /* Go through the list of Hypertransport capabilities and
  * return 1 if a HT MSI capability is found and enabled */
index b137a27472c7feefef492da45e7058cc3356c8bb..c13232435dc06322f824b1f4fd07d34bdce112bb 100644 (file)
@@ -403,10 +403,11 @@ const struct pci_device_id *pci_find_present(const struct pci_device_id *ids)
        while (ids->vendor || ids->subvendor || ids->class_mask) {
                list_for_each_entry(dev, &pci_devices, global_list) {
                        if ((found = pci_match_one_device(ids, dev)) != NULL)
-                               break;
+                               goto exit;
                }
                ids++;
        }
+exit:
        up_read(&pci_bus_sem);
        return found;
 }
index 948efc775a78355a44408f2c2e0f625b35efc625..eb6abd3f9221a896f1375ff855c2ac419491e630 100644 (file)
@@ -336,16 +336,21 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg)
                enable_irq_wake(board->det_pin);
                if (board->irq_pin)
                        enable_irq_wake(board->irq_pin);
-       } else {
-               disable_irq_wake(board->det_pin);
-               if (board->irq_pin)
-                       disable_irq_wake(board->irq_pin);
        }
        return 0;
 }
 
 static int at91_cf_resume(struct platform_device *pdev)
 {
+       struct at91_cf_socket   *cf = platform_get_drvdata(pdev);
+       struct at91_cf_data     *board = cf->board;
+
+       if (device_may_wakeup(&pdev->dev)) {
+               disable_irq_wake(board->det_pin);
+               if (board->irq_pin)
+                       disable_irq_wake(board->irq_pin);
+       }
+
        pcmcia_socket_dev_resume(&pdev->dev);
        return 0;
 }
index 6085261aa2c15b581a8c7dba2a7b2830a945db86..e24ea82dc35b83b1036a2b5cf15d9e54afd2ee96 100644 (file)
@@ -641,9 +641,16 @@ cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
         * drivers can't provide shutdown() methods to disable IRQs.
         * Or better yet, fix PNP to allow those methods...
         */
-       return cmos_do_probe(&pnp->dev,
-                       &pnp->res.port_resource[0],
-                       pnp->res.irq_resource[0].start);
+       if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0))
+               /* Some machines contain a PNP entry for the RTC, but
+                * don't define the IRQ. It should always be safe to
+                * hardcode it in these cases
+                */
+               return cmos_do_probe(&pnp->dev, &pnp->res.port_resource[0], 8);
+       else
+               return cmos_do_probe(&pnp->dev,
+                                    &pnp->res.port_resource[0],
+                                    pnp->res.irq_resource[0].start);
 }
 
 static void __exit cmos_pnp_remove(struct pnp_dev *pnp)
index a1dc8c466ec9ba895c6470bea0044c8937452f76..0c081a664ee8561d84048c50065c0fa654d91cb4 100644 (file)
@@ -14,9 +14,9 @@
 #include <linux/moduleparam.h>
 #include <linux/device.h>
 #include <linux/poll.h>
+#include <linux/mutex.h>
 
 #include <asm/uaccess.h>
-#include <asm/semaphore.h>
 #include <asm/atomic.h>
 #include <asm/ebcdic.h>
 
@@ -514,7 +514,7 @@ void dasd_eer_disable(struct dasd_device *device)
  * to transfer in a readbuffer, which is protected by the readbuffer_mutex.
  */
 static char readbuffer[PAGE_SIZE];
-static DECLARE_MUTEX(readbuffer_mutex);
+static DEFINE_MUTEX(readbuffer_mutex);
 
 static int dasd_eer_open(struct inode *inp, struct file *filp)
 {
@@ -579,7 +579,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf,
        struct eerbuffer *eerb;
 
        eerb = (struct eerbuffer *) filp->private_data;
-       if (down_interruptible(&readbuffer_mutex))
+       if (mutex_lock_interruptible(&readbuffer_mutex))
                return -ERESTARTSYS;
 
        spin_lock_irqsave(&bufferlock, flags);
@@ -588,7 +588,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf,
                                  /* has been deleted             */
                eerb->residual = 0;
                spin_unlock_irqrestore(&bufferlock, flags);
-               up(&readbuffer_mutex);
+               mutex_unlock(&readbuffer_mutex);
                return -EIO;
        } else if (eerb->residual > 0) {
                /* OK we still have a second half of a record to deliver */
@@ -602,7 +602,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf,
                        if (!tc) {
                                /* no data available */
                                spin_unlock_irqrestore(&bufferlock, flags);
-                               up(&readbuffer_mutex);
+                               mutex_unlock(&readbuffer_mutex);
                                if (filp->f_flags & O_NONBLOCK)
                                        return -EAGAIN;
                                rc = wait_event_interruptible(
@@ -610,7 +610,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf,
                                        eerb->head != eerb->tail);
                                if (rc)
                                        return rc;
-                               if (down_interruptible(&readbuffer_mutex))
+                               if (mutex_lock_interruptible(&readbuffer_mutex))
                                        return -ERESTARTSYS;
                                spin_lock_irqsave(&bufferlock, flags);
                        }
@@ -626,11 +626,11 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf,
        spin_unlock_irqrestore(&bufferlock, flags);
 
        if (copy_to_user(buf, readbuffer, effective_count)) {
-               up(&readbuffer_mutex);
+               mutex_unlock(&readbuffer_mutex);
                return -EFAULT;
        }
 
-       up(&readbuffer_mutex);
+       mutex_unlock(&readbuffer_mutex);
        return effective_count;
 }
 
index f6ef90ee3e7d83d06090ff594818d2f40fdd6c85..743944ad61ecb44be0ba47a9f60ebad97e159730 100644 (file)
@@ -487,7 +487,7 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */
 } __attribute__ ((packed));
 
 static struct diag210 raw3270_init_diag210;
-static DECLARE_MUTEX(raw3270_init_sem);
+static DEFINE_MUTEX(raw3270_init_mutex);
 
 static int
 raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq,
@@ -713,7 +713,7 @@ raw3270_size_device(struct raw3270 *rp)
 {
        int rc;
 
-       down(&raw3270_init_sem);
+       mutex_lock(&raw3270_init_mutex);
        rp->view = &raw3270_init_view;
        raw3270_init_view.dev = rp;
        if (MACHINE_IS_VM)
@@ -722,7 +722,7 @@ raw3270_size_device(struct raw3270 *rp)
                rc = __raw3270_size_device(rp);
        raw3270_init_view.dev = NULL;
        rp->view = NULL;
-       up(&raw3270_init_sem);
+       mutex_unlock(&raw3270_init_mutex);
        if (rc == 0) {  /* Found something. */
                /* Try to find a model. */
                rp->model = 0;
@@ -749,7 +749,7 @@ raw3270_reset_device(struct raw3270 *rp)
 {
        int rc;
 
-       down(&raw3270_init_sem);
+       mutex_lock(&raw3270_init_mutex);
        memset(&rp->init_request, 0, sizeof(rp->init_request));
        memset(&rp->init_data, 0, sizeof(rp->init_data));
        /* Store reset data stream to init_data/init_request */
@@ -764,7 +764,7 @@ raw3270_reset_device(struct raw3270 *rp)
        rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request);
        raw3270_init_view.dev = NULL;
        rp->view = NULL;
-       up(&raw3270_init_sem);
+       mutex_unlock(&raw3270_init_mutex);
        return rc;
 }
 
index a8b373f69cf0ef2d61ab1315b3b191f4276e39e9..6b264bdb5bfb1c09097f5133a44becedda7c3865 100644 (file)
@@ -296,30 +296,57 @@ static void ccw_device_unregister(struct ccw_device *cdev)
                device_del(&cdev->dev);
 }
 
+static void ccw_device_remove_orphan_cb(struct device *dev)
+{
+       struct ccw_device *cdev = to_ccwdev(dev);
+
+       ccw_device_unregister(cdev);
+       put_device(&cdev->dev);
+}
+
+static void ccw_device_remove_sch_cb(struct device *dev)
+{
+       struct subchannel *sch;
+
+       sch = to_subchannel(dev);
+       css_sch_device_unregister(sch);
+       /* Reset intparm to zeroes. */
+       sch->schib.pmcw.intparm = 0;
+       cio_modify(sch);
+       put_device(&sch->dev);
+}
+
 static void
 ccw_device_remove_disconnected(struct ccw_device *cdev)
 {
-       struct subchannel *sch;
        unsigned long flags;
+       int rc;
+
        /*
         * Forced offline in disconnected state means
         * 'throw away device'.
         */
        if (ccw_device_is_orphan(cdev)) {
-               /* Deregister ccw device. */
+               /*
+                * Deregister ccw device.
+                * Unfortunately, we cannot do this directly from the
+                * attribute method.
+                */
                spin_lock_irqsave(cdev->ccwlock, flags);
                cdev->private->state = DEV_STATE_NOT_OPER;
                spin_unlock_irqrestore(cdev->ccwlock, flags);
-               ccw_device_unregister(cdev);
-               put_device(&cdev->dev);
-               return ;
+               rc = device_schedule_callback(&cdev->dev,
+                                             ccw_device_remove_orphan_cb);
+               if (rc)
+                       dev_info(&cdev->dev, "Couldn't unregister orphan\n");
+               return;
        }
-       sch = to_subchannel(cdev->dev.parent);
-       css_sch_device_unregister(sch);
-       /* Reset intparm to zeroes. */
-       sch->schib.pmcw.intparm = 0;
-       cio_modify(sch);
-       put_device(&sch->dev);
+       /* Deregister subchannel, which will kill the ccw device. */
+       rc = device_schedule_callback(cdev->dev.parent,
+                                     ccw_device_remove_sch_cb);
+       if (rc)
+               dev_info(&cdev->dev,
+                        "Couldn't unregister disconnected device\n");
 }
 
 int
index 898ec3b2bebb5092c123030504c69aae89b89886..6bba809295772702bf3637bd6b263cb2a415a22b 100644 (file)
@@ -688,6 +688,12 @@ ccw_device_disband_done(struct ccw_device *cdev, int err)
                ccw_device_done(cdev, DEV_STATE_BOXED);
                break;
        default:
+               cdev->private->flags.donotify = 0;
+               if (get_device(&cdev->dev)) {
+                       PREPARE_WORK(&cdev->private->kick_work,
+                                    ccw_device_call_sch_unregister);
+                       queue_work(ccw_device_work, &cdev->private->kick_work);
+               }
                ccw_device_done(cdev, DEV_STATE_NOT_OPER);
                break;
        }
index 262f01e68592f4b359cef0d7c0743673cb237049..44e039865aa99714d4184e033a2d5bce65d94532 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/init.h>
 #include <linux/smp_lock.h>
 #include <linux/spinlock.h>
+#include <linux/mm.h>
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
index bb3cb33605417aa3f4b23dd4dc6216b744ebc2ad..88ea5a1fb606d8b8bb7c91c7c9bb2a4721e43bd9 100644 (file)
@@ -2625,7 +2625,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
 #ifdef REAL_DMA
 static void NCR5380_dma_complete(NCR5380_instance * instance) {
        NCR5380_local_declare();
-       struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata * instance->hostdata);
+       struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
        int transferred;
        NCR5380_setup(instance);
 
index 9ddc6e4a74b040d497620675f0cd5dfcf7256078..05f692bd0adc5543c236079d428bb0e48a503772 100644 (file)
@@ -5180,7 +5180,7 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
                        cur_lun = lun;
                        max_lun = lun;
                }
-               for (cur_lun <= max_lun; cur_lun++) {
+               for (;cur_lun <= max_lun; cur_lun++) {
                        struct ahd_tmode_lstate* lstate;
 
                        lstate = tstate->enabled_luns[cur_lun];
index 1a9a24b82636e42704ae910f97e46d212800ebd4..00d1255e4c12026cd3ff7104e3861e217a0649fe 100644 (file)
@@ -167,8 +167,9 @@ static void pl010_rx_chars(struct uart_amba_port *uap)
        ignore_char:
                status = readb(uap->port.membase + UART01x_FR);
        }
+       spin_unlock(&port->lock);
        tty_flip_buffer_push(tty);
-       return;
+       spin_lock(&port->lock);
 }
 
 static void pl010_tx_chars(struct uart_amba_port *uap)
index 44639e71372a7eb08c209562e95374fe5d0fb22e..954073c6ce3a4e5cccb7df1806575fc1778cbc2c 100644 (file)
@@ -153,8 +153,9 @@ static void pl011_rx_chars(struct uart_amba_port *uap)
        ignore_char:
                status = readw(uap->port.membase + UART01x_FR);
        }
+       spin_unlock(&uap->port.lock);
        tty_flip_buffer_push(tty);
-       return;
+       spin_lock(&uap->port.lock);
 }
 
 static void pl011_tx_chars(struct uart_amba_port *uap)
index 698763b28dddb10c56bae0cdfd540d2555f4d929..8721afe1ae4fa2906666e3857840fdb3709eabd7 100644 (file)
@@ -589,7 +589,7 @@ static int __init ks8695_console_setup(struct console *co, char *options)
        return uart_set_options(port, co, baud, parity, bits, flow);
 }
 
-extern struct uart_driver ks8695_reg;
+static struct uart_driver ks8695_reg;
 
 static struct console ks8695_console = {
        .name           = SERIAL_KS8695_DEVNAME,
index 1d8a2f6bb8ebada212ad8d9617825bd9b96958ab..8b2601de36306e085d9a55481b0b777248db4946 100644 (file)
@@ -113,16 +113,16 @@ static void atmel_spi_next_xfer(struct spi_master *master,
 
        len = as->remaining_bytes;
 
-       tx_dma = xfer->tx_dma;
-       rx_dma = xfer->rx_dma;
+       tx_dma = xfer->tx_dma + xfer->len - len;
+       rx_dma = xfer->rx_dma + xfer->len - len;
 
        /* use scratch buffer only when rx or tx data is unspecified */
-       if (rx_dma == INVALID_DMA_ADDRESS) {
+       if (!xfer->rx_buf) {
                rx_dma = as->buffer_dma;
                if (len > BUFFER_SIZE)
                        len = BUFFER_SIZE;
        }
-       if (tx_dma == INVALID_DMA_ADDRESS) {
+       if (!xfer->tx_buf) {
                tx_dma = as->buffer_dma;
                if (len > BUFFER_SIZE)
                        len = BUFFER_SIZE;
index c3219b29b5ac70b87190c36b195c4a6139dc385b..4831edbae2d589a0442021df9ee78aeaec10430f 100644 (file)
@@ -411,7 +411,7 @@ EXPORT_SYMBOL_GPL(spi_alloc_master);
  */
 int spi_register_master(struct spi_master *master)
 {
-       static atomic_t         dyn_bus_id = ATOMIC_INIT((1<<16) - 1);
+       static atomic_t         dyn_bus_id = ATOMIC_INIT((1<<15) - 1);
        struct device           *dev = master->cdev.dev;
        int                     status = -ENODEV;
        int                     dynamic = 0;
index 51daa212c6b799fd769ca82ef6f57bef96a933e3..656be4a5094a68cfd1d6d10b5fb936e2dbf7a1e0 100644 (file)
                                                        32.768 KHz Clock */
 
 /* SPI DMA Register Bit Fields & Masks */
-#define SPI_DMA_RHDMA  (0xF << 4)      /* RXFIFO Half Status */
+#define SPI_DMA_RHDMA  (0x1 << 4)      /* RXFIFO Half Status */
 #define SPI_DMA_RFDMA  (0x1 << 5)      /* RXFIFO Full Status */
 #define SPI_DMA_TEDMA  (0x1 << 6)      /* TXFIFO Empty Status */
 #define SPI_DMA_THDMA  (0x1 << 7)      /* TXFIFO Half Status */
@@ -1355,6 +1355,7 @@ static int setup(struct spi_device *spi)
                spi->bits_per_word,
                spi_speed_hz(SPI_CONTROL_DATARATE_MIN),
                spi->max_speed_hz);
+       return status;
 
 err_first_setup:
        kfree(chip);
index 6e1f1ea21b38ddae33dc1747f0acffd3826dd1ce..403dac787ebf0f98975802648455470b9d8edcac 100644 (file)
@@ -755,7 +755,7 @@ config FB_LEO
 
 config FB_IGA
        bool "IGA 168x display support"
-       depends on FB && SPARC32
+       depends on (FB = y) && SPARC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -765,7 +765,7 @@ config FB_IGA
 
 config FB_XVR500
        bool "Sun XVR-500 3DLABS Wildcat support"
-       depends on FB && PCI && SPARC64
+       depends on (FB = y) && PCI && SPARC64
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -778,7 +778,7 @@ config FB_XVR500
 
 config FB_XVR2500
        bool "Sun XVR-2500 3DLABS Wildcat support"
-       depends on FB && PCI && SPARC64
+       depends on (FB = y) && PCI && SPARC64
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
index ba6fede5c466f3c6eaa5742ac35ae0ebe99f8232..8a1b07c74394d35f12c62ab25129ca762c23e045 100644 (file)
@@ -1055,9 +1055,10 @@ err_enable_device:
 static void __devexit ark_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
-       struct arkfb_info *par = info->par;
 
        if (info) {
+               struct arkfb_info *par = info->par;
+
 #ifdef CONFIG_MTRR
                if (par->mtrr_reg >= 0) {
                        mtrr_del(par->mtrr_reg, 0, 0);
index 71f24e00fcd041c54212166f30db1c9e23283aa6..8e6ef4bc7a5c75027ae59c8b35b4c5c5acdaead0 100644 (file)
@@ -176,7 +176,6 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info);
 #endif
 extern void fbcon_set_bitops(struct fbcon_ops *ops);
 extern int  soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
-extern struct class *fb_class;
 
 #define FBCON_ATTRIBUTE_UNDERLINE 1
 #define FBCON_ATTRIBUTE_REVERSE   2
index bd30aba242d07643722ef8d58aa1870128a3bec3..731d7a5c5aa2abf960f1ae4e8534a06d703e7d58 100644 (file)
@@ -1286,34 +1286,36 @@ static int neofb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
        if (regno >= fb->cmap.len || regno > 255)
                return -EINVAL;
 
-       switch (fb->var.bits_per_pixel) {
-       case 8:
+       if (fb->var.bits_per_pixel <= 8) {
                outb(regno, 0x3c8);
 
                outb(red >> 10, 0x3c9);
                outb(green >> 10, 0x3c9);
                outb(blue >> 10, 0x3c9);
-               break;
-       case 16:
-               ((u32 *) fb->pseudo_palette)[regno] =
+       } else if (regno < 16) {
+               switch (fb->var.bits_per_pixel) {
+               case 16:
+                       ((u32 *) fb->pseudo_palette)[regno] =
                                ((red & 0xf800)) | ((green & 0xfc00) >> 5) |
                                ((blue & 0xf800) >> 11);
-               break;
-       case 24:
-               ((u32 *) fb->pseudo_palette)[regno] =
+                       break;
+               case 24:
+                       ((u32 *) fb->pseudo_palette)[regno] =
                                ((red & 0xff00) << 8) | ((green & 0xff00)) |
                                ((blue & 0xff00) >> 8);
-               break;
+                       break;
 #ifdef NO_32BIT_SUPPORT_YET
-       case 32:
-               ((u32 *) fb->pseudo_palette)[regno] =
+               case 32:
+                       ((u32 *) fb->pseudo_palette)[regno] =
                                ((transp & 0xff00) << 16) | ((red & 0xff00) << 8) |
                                ((green & 0xff00)) | ((blue & 0xff00) >> 8);
-               break;
+                       break;
 #endif
-       default:
-               return 1;
+               default:
+                       return 1;
+               }
        }
+
        return 0;
 }
 
index 616a0c08e30c2f3f014e982203a495b477246e88..b52e883f0a52823f9c258c4906f33a131b5ce0b3 100644 (file)
@@ -498,7 +498,7 @@ static int pm3fb_set_par(struct fb_info *info)
        else
                par->video |= PM3VideoControl_LINE_DOUBLE_OFF;
 
-       if (info->var.activate == FB_ACTIVATE_NOW)
+       if ((info->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
                par->video |= PM3VideoControl_ENABLE;
        else {
                par->video |= PM3VideoControl_DISABLE;
index 836a612af977f167e67ff1a0f92fe4708bc6788d..64779e70408f9e8a0d25c0973a5f39558b70471d 100644 (file)
@@ -132,7 +132,6 @@ static struct fb_info info;
 static struct xxx_par __initdata current_par;
 
 int xxxfb_init(void);
-int xxxfb_setup(char*);
 
 /**
  *     xxxfb_open - Optional function. Called when the framebuffer is
@@ -975,6 +974,21 @@ static struct platform_device xxxfb_device = {
        .name = "xxxfb",
 };
 
+#ifndef MODULE
+    /*
+     *  Setup
+     */
+
+/*
+ * Only necessary if your driver takes special options,
+ * otherwise we fall back on the generic fb_setup().
+ */
+int __init xxxfb_setup(char *options)
+{
+    /* Parse user speficied options (`video=xxxfb:') */
+}
+#endif /* MODULE */
+
 static int __init xxxfb_init(void)
 {
        int ret;
@@ -1006,21 +1020,6 @@ static void __exit xxxfb_exit(void)
 }
 #endif /* CONFIG_PCI */
 
-#ifdef MODULE
-    /*
-     *  Setup
-     */
-
-/* 
- * Only necessary if your driver takes special options,
- * otherwise we fall back on the generic fb_setup().
- */
-int __init xxxfb_setup(char *options)
-{
-    /* Parse user speficied options (`video=xxxfb:') */
-}
-#endif /* MODULE */
-
 /* ------------------------------------------------------------------------- */
 
 
index 5e9755e464a15fcacde5393247a01740d54cd4b7..30c0b948852b06b473a8e87705bcbd87f726fb70 100644 (file)
@@ -778,9 +778,10 @@ err_enable_device:
 static void __devexit vt8623_pci_remove(struct pci_dev *dev)
 {
        struct fb_info *info = pci_get_drvdata(dev);
-       struct vt8623fb_info *par = info->par;
 
        if (info) {
+               struct vt8623fb_info *par = info->par;
+
 #ifdef CONFIG_MTRR
                if (par->mtrr_reg >= 0) {
                        mtrr_del(par->mtrr_reg, 0, 0);
index 2dac3ad2c44b6c1110452208826dfac0186b901b..2c55dd94a1de573c9e4169a3cbb3c993dc6422b9 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/rxrpc.h>
 #include <linux/key.h>
 #include <linux/workqueue.h>
+#include <linux/sched.h>
+
 #include "afs.h"
 #include "afs_vl.h"
 
index 8a23483ca8d0c3668e171bbc53c7a629a2403876..3b64bb16c727784d0a5f6b6f7c12e0ac30aa4cd2 100644 (file)
 void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
                unsigned long *blockgrpp, ext4_grpblk_t *offsetp)
 {
-        struct ext4_super_block *es = EXT4_SB(sb)->s_es;
+       struct ext4_super_block *es = EXT4_SB(sb)->s_es;
        ext4_grpblk_t offset;
 
-        blocknr = blocknr - le32_to_cpu(es->s_first_data_block);
+       blocknr = blocknr - le32_to_cpu(es->s_first_data_block);
        offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb));
        if (offsetp)
                *offsetp = offset;
        if (blockgrpp)
-               *blockgrpp = blocknr;
+               *blockgrpp = blocknr;
 
 }
 
index a0f0c04e79b2bb47ca670fe7edd9875afb937d97..b9ce24129070bff5cee547a333139d9a4645d2c7 100644 (file)
@@ -374,7 +374,7 @@ ext4_ext_binsearch_idx(struct inode *inode, struct ext4_ext_path *path, int bloc
                                       le32_to_cpu(ix[-1].ei_block));
                        }
                        BUG_ON(k && le32_to_cpu(ix->ei_block)
-                                          <= le32_to_cpu(ix[-1].ei_block));
+                                          <= le32_to_cpu(ix[-1].ei_block));
                        if (block < le32_to_cpu(ix->ei_block))
                                break;
                        chix = ix;
@@ -423,8 +423,8 @@ ext4_ext_binsearch(struct inode *inode, struct ext4_ext_path *path, int block)
 
        path->p_ext = l - 1;
        ext_debug("  -> %d:%llu:%d ",
-                       le32_to_cpu(path->p_ext->ee_block),
-                       ext_pblock(path->p_ext),
+                       le32_to_cpu(path->p_ext->ee_block),
+                       ext_pblock(path->p_ext),
                        le16_to_cpu(path->p_ext->ee_len));
 
 #ifdef CHECK_BINSEARCH
@@ -435,7 +435,7 @@ ext4_ext_binsearch(struct inode *inode, struct ext4_ext_path *path, int block)
                chex = ex = EXT_FIRST_EXTENT(eh);
                for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ex++) {
                        BUG_ON(k && le32_to_cpu(ex->ee_block)
-                                         <= le32_to_cpu(ex[-1].ee_block));
+                                         <= le32_to_cpu(ex[-1].ee_block));
                        if (block < le32_to_cpu(ex->ee_block))
                                break;
                        chex = ex;
@@ -577,7 +577,7 @@ static int ext4_ext_insert_index(handle_t *handle, struct inode *inode,
        curp->p_hdr->eh_entries = cpu_to_le16(le16_to_cpu(curp->p_hdr->eh_entries)+1);
 
        BUG_ON(le16_to_cpu(curp->p_hdr->eh_entries)
-                            > le16_to_cpu(curp->p_hdr->eh_max));
+                            > le16_to_cpu(curp->p_hdr->eh_max));
        BUG_ON(ix > EXT_LAST_INDEX(curp->p_hdr));
 
        err = ext4_ext_dirty(handle, inode, curp);
@@ -621,12 +621,12 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
                border = path[depth].p_ext[1].ee_block;
                ext_debug("leaf will be split."
                                " next leaf starts at %d\n",
-                                 le32_to_cpu(border));
+                                 le32_to_cpu(border));
        } else {
                border = newext->ee_block;
                ext_debug("leaf will be added."
                                " next leaf starts at %d\n",
-                               le32_to_cpu(border));
+                               le32_to_cpu(border));
        }
 
        /*
@@ -684,9 +684,9 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
        while (path[depth].p_ext <=
                        EXT_MAX_EXTENT(path[depth].p_hdr)) {
                ext_debug("move %d:%llu:%d in new leaf %llu\n",
-                               le32_to_cpu(path[depth].p_ext->ee_block),
-                               ext_pblock(path[depth].p_ext),
-                               le16_to_cpu(path[depth].p_ext->ee_len),
+                               le32_to_cpu(path[depth].p_ext->ee_block),
+                               ext_pblock(path[depth].p_ext),
+                               le16_to_cpu(path[depth].p_ext->ee_len),
                                newblock);
                /*memmove(ex++, path[depth].p_ext++,
                                sizeof(struct ext4_extent));
@@ -765,9 +765,9 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
                                EXT_LAST_INDEX(path[i].p_hdr));
                while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) {
                        ext_debug("%d: move %d:%d in new index %llu\n", i,
-                                       le32_to_cpu(path[i].p_idx->ei_block),
-                                       idx_pblock(path[i].p_idx),
-                                       newblock);
+                                       le32_to_cpu(path[i].p_idx->ei_block),
+                                       idx_pblock(path[i].p_idx),
+                                       newblock);
                        /*memmove(++fidx, path[i].p_idx++,
                                        sizeof(struct ext4_extent_idx));
                        neh->eh_entries++;
@@ -1127,6 +1127,55 @@ ext4_can_extents_be_merged(struct inode *inode, struct ext4_extent *ex1,
        return 0;
 }
 
+/*
+ * check if a portion of the "newext" extent overlaps with an
+ * existing extent.
+ *
+ * If there is an overlap discovered, it updates the length of the newext
+ * such that there will be no overlap, and then returns 1.
+ * If there is no overlap found, it returns 0.
+ */
+unsigned int ext4_ext_check_overlap(struct inode *inode,
+                                   struct ext4_extent *newext,
+                                   struct ext4_ext_path *path)
+{
+       unsigned long b1, b2;
+       unsigned int depth, len1;
+       unsigned int ret = 0;
+
+       b1 = le32_to_cpu(newext->ee_block);
+       len1 = le16_to_cpu(newext->ee_len);
+       depth = ext_depth(inode);
+       if (!path[depth].p_ext)
+               goto out;
+       b2 = le32_to_cpu(path[depth].p_ext->ee_block);
+
+       /*
+        * get the next allocated block if the extent in the path
+        * is before the requested block(s) 
+        */
+       if (b2 < b1) {
+               b2 = ext4_ext_next_allocated_block(path);
+               if (b2 == EXT_MAX_BLOCK)
+                       goto out;
+       }
+
+       /* check for wrap through zero */
+       if (b1 + len1 < b1) {
+               len1 = EXT_MAX_BLOCK - b1;
+               newext->ee_len = cpu_to_le16(len1);
+               ret = 1;
+       }
+
+       /* check for overlap */
+       if (b1 + len1 > b2) {
+               newext->ee_len = cpu_to_le16(b2 - b1);
+               ret = 1;
+       }
+out:
+       return ret;
+}
+
 /*
  * ext4_ext_insert_extent:
  * tries to merge requsted extent into the existing extent or
@@ -1212,12 +1261,12 @@ has_space:
        if (!nearex) {
                /* there is no extent in this leaf, create first one */
                ext_debug("first extent in the leaf: %d:%llu:%d\n",
-                               le32_to_cpu(newext->ee_block),
-                               ext_pblock(newext),
-                               le16_to_cpu(newext->ee_len));
+                               le32_to_cpu(newext->ee_block),
+                               ext_pblock(newext),
+                               le16_to_cpu(newext->ee_len));
                path[depth].p_ext = EXT_FIRST_EXTENT(eh);
        } else if (le32_to_cpu(newext->ee_block)
-                          > le32_to_cpu(nearex->ee_block)) {
+                          > le32_to_cpu(nearex->ee_block)) {
 /*             BUG_ON(newext->ee_block == nearex->ee_block); */
                if (nearex != EXT_LAST_EXTENT(eh)) {
                        len = EXT_MAX_EXTENT(eh) - nearex;
@@ -1225,9 +1274,9 @@ has_space:
                        len = len < 0 ? 0 : len;
                        ext_debug("insert %d:%llu:%d after: nearest 0x%p, "
                                        "move %d from 0x%p to 0x%p\n",
-                                       le32_to_cpu(newext->ee_block),
-                                       ext_pblock(newext),
-                                       le16_to_cpu(newext->ee_len),
+                                       le32_to_cpu(newext->ee_block),
+                                       ext_pblock(newext),
+                                       le16_to_cpu(newext->ee_len),
                                        nearex, len, nearex + 1, nearex + 2);
                        memmove(nearex + 2, nearex + 1, len);
                }
@@ -1358,9 +1407,9 @@ int ext4_ext_walk_space(struct inode *inode, unsigned long block,
                        cbex.ec_start = 0;
                        cbex.ec_type = EXT4_EXT_CACHE_GAP;
                } else {
-                       cbex.ec_block = le32_to_cpu(ex->ee_block);
-                       cbex.ec_len = le16_to_cpu(ex->ee_len);
-                       cbex.ec_start = ext_pblock(ex);
+                       cbex.ec_block = le32_to_cpu(ex->ee_block);
+                       cbex.ec_len = le16_to_cpu(ex->ee_len);
+                       cbex.ec_start = ext_pblock(ex);
                        cbex.ec_type = EXT4_EXT_CACHE_EXTENT;
                }
 
@@ -1431,16 +1480,16 @@ ext4_ext_put_gap_in_cache(struct inode *inode, struct ext4_ext_path *path,
                len = le32_to_cpu(ex->ee_block) - block;
                ext_debug("cache gap(before): %lu [%lu:%lu]",
                                (unsigned long) block,
-                               (unsigned long) le32_to_cpu(ex->ee_block),
-                               (unsigned long) le16_to_cpu(ex->ee_len));
+                               (unsigned long) le32_to_cpu(ex->ee_block),
+                               (unsigned long) le16_to_cpu(ex->ee_len));
        } else if (block >= le32_to_cpu(ex->ee_block)
-                           + le16_to_cpu(ex->ee_len)) {
-               lblock = le32_to_cpu(ex->ee_block)
-                        + le16_to_cpu(ex->ee_len);
+                           + le16_to_cpu(ex->ee_len)) {
+               lblock = le32_to_cpu(ex->ee_block)
+                        + le16_to_cpu(ex->ee_len);
                len = ext4_ext_next_allocated_block(path);
                ext_debug("cache gap(after): [%lu:%lu] %lu",
-                               (unsigned long) le32_to_cpu(ex->ee_block),
-                               (unsigned long) le16_to_cpu(ex->ee_len),
+                               (unsigned long) le32_to_cpu(ex->ee_block),
+                               (unsigned long) le16_to_cpu(ex->ee_len),
                                (unsigned long) block);
                BUG_ON(len == lblock);
                len = len - lblock;
@@ -1468,9 +1517,9 @@ ext4_ext_in_cache(struct inode *inode, unsigned long block,
        BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
                        cex->ec_type != EXT4_EXT_CACHE_EXTENT);
        if (block >= cex->ec_block && block < cex->ec_block + cex->ec_len) {
-               ex->ee_block = cpu_to_le32(cex->ec_block);
+               ex->ee_block = cpu_to_le32(cex->ec_block);
                ext4_ext_store_pblock(ex, cex->ec_start);
-               ex->ee_len = cpu_to_le16(cex->ec_len);
+               ex->ee_len = cpu_to_le16(cex->ec_len);
                ext_debug("%lu cached by %lu:%lu:%llu\n",
                                (unsigned long) block,
                                (unsigned long) cex->ec_block,
@@ -1956,9 +2005,9 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
                        /* we should allocate requested block */
                } else if (goal == EXT4_EXT_CACHE_EXTENT) {
                        /* block is already allocated */
-                       newblock = iblock
-                                  - le32_to_cpu(newex.ee_block)
-                                  + ext_pblock(&newex);
+                       newblock = iblock
+                                  - le32_to_cpu(newex.ee_block)
+                                  + ext_pblock(&newex);
                        /* number of remaining blocks in the extent */
                        allocated = le16_to_cpu(newex.ee_len) -
                                        (iblock - le32_to_cpu(newex.ee_block));
@@ -1987,7 +2036,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
 
        ex = path[depth].p_ext;
        if (ex) {
-               unsigned long ee_block = le32_to_cpu(ex->ee_block);
+               unsigned long ee_block = le32_to_cpu(ex->ee_block);
                ext4_fsblk_t ee_start = ext_pblock(ex);
                unsigned short ee_len  = le16_to_cpu(ex->ee_len);
 
@@ -2000,7 +2049,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
                if (ee_len > EXT_MAX_LEN)
                        goto out2;
                /* if found extent covers block, simply return it */
-               if (iblock >= ee_block && iblock < ee_block + ee_len) {
+               if (iblock >= ee_block && iblock < ee_block + ee_len) {
                        newblock = iblock - ee_block + ee_start;
                        /* number of remaining blocks in the extent */
                        allocated = ee_len - (iblock - ee_block);
@@ -2031,7 +2080,15 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
 
        /* allocate new block */
        goal = ext4_ext_find_goal(inode, path, iblock);
-       allocated = max_blocks;
+
+       /* Check if we can really insert (iblock)::(iblock+max_blocks) extent */
+       newex.ee_block = cpu_to_le32(iblock);
+       newex.ee_len = cpu_to_le16(max_blocks);
+       err = ext4_ext_check_overlap(inode, &newex, path);
+       if (err)
+               allocated = le16_to_cpu(newex.ee_len);
+       else
+               allocated = max_blocks;
        newblock = ext4_new_blocks(handle, inode, goal, &allocated, &err);
        if (!newblock)
                goto out2;
@@ -2039,12 +2096,15 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
                        goal, newblock, allocated);
 
        /* try to insert new extent into found leaf and return */
-       newex.ee_block = cpu_to_le32(iblock);
        ext4_ext_store_pblock(&newex, newblock);
        newex.ee_len = cpu_to_le16(allocated);
        err = ext4_ext_insert_extent(handle, inode, path, &newex);
-       if (err)
+       if (err) {
+               /* free data blocks we just allocated */
+               ext4_free_blocks(handle, inode, ext_pblock(&newex),
+                                       le16_to_cpu(newex.ee_len));
                goto out2;
+       }
 
        if (extend_disksize && inode->i_size > EXT4_I(inode)->i_disksize)
                EXT4_I(inode)->i_disksize = inode->i_size;
@@ -2157,11 +2217,3 @@ int ext4_ext_writepage_trans_blocks(struct inode *inode, int num)
 
        return needed;
 }
-
-EXPORT_SYMBOL(ext4_mark_inode_dirty);
-EXPORT_SYMBOL(ext4_ext_invalidate_cache);
-EXPORT_SYMBOL(ext4_ext_insert_extent);
-EXPORT_SYMBOL(ext4_ext_walk_space);
-EXPORT_SYMBOL(ext4_ext_find_goal);
-EXPORT_SYMBOL(ext4_ext_calc_credits_for_insert);
-
index b34182b6ee4d1ea9cba530ea5dac87a787a8b7c1..0bcf62a750ffe29f788b5eb9d1c9b209ec8d3f54 100644 (file)
@@ -255,8 +255,8 @@ static int verify_chain(Indirect *from, Indirect *to)
  *     @inode: inode in question (we are only interested in its superblock)
  *     @i_block: block number to be parsed
  *     @offsets: array to store the offsets in
- *      @boundary: set this non-zero if the referred-to block is likely to be
- *             followed (on disk) by an indirect block.
+ *     @boundary: set this non-zero if the referred-to block is likely to be
+ *            followed (on disk) by an indirect block.
  *
  *     To store the locations of file's data ext4 uses a data structure common
  *     for UNIX filesystems - tree of pointers anchored in the inode, with
index 4ec57be5baf5df659a4f9c2d9330c8bfbe10c796..2811e5720ad019d18e9976ac8afc21e3c885768b 100644 (file)
@@ -46,7 +46,7 @@
  */
 #define NAMEI_RA_CHUNKS  2
 #define NAMEI_RA_BLOCKS  4
-#define NAMEI_RA_SIZE        (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
+#define NAMEI_RA_SIZE       (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS)
 #define NAMEI_RA_INDEX(c,b)  (((c) * NAMEI_RA_BLOCKS) + (b))
 
 static struct buffer_head *ext4_append(handle_t *handle,
@@ -241,7 +241,7 @@ static inline unsigned dx_node_limit (struct inode *dir)
 static void dx_show_index (char * label, struct dx_entry *entries)
 {
        int i, n = dx_get_count (entries);
-        printk("%s index ", label);
+       printk("%s index ", label);
        for (i = 0; i < n; i++) {
                printk("%x->%u ", i? dx_get_hash(entries + i) :
                                0, dx_get_block(entries + i));
index cb9afdd0e26e5f8f458329aaab3e04be6daf9a5c..175b68c609685fb06742caf6bed160ca7a98d68b 100644 (file)
@@ -1985,7 +1985,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb,
 
        if (bd_claim(bdev, sb)) {
                printk(KERN_ERR
-                       "EXT4: failed to claim external journal device.\n");
+                       "EXT4: failed to claim external journal device.\n");
                blkdev_put(bdev);
                return NULL;
        }
index 479c1038ed4a4f7d3354e5939f6eae6a910e1d4f..8c90cbc903fa812e562984dab11ccc4e9212f2d2 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/fs.h>
 #include <linux/security.h>
 #include <linux/module.h>
+#include <linux/kallsyms.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -20,6 +21,7 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
                unsigned long arg)
 {
        int error = -ENOTTY;
+       void *f;
 
        if (!filp->f_op)
                goto out;
@@ -29,10 +31,16 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
                if (error == -ENOIOCTLCMD)
                        error = -EINVAL;
                goto out;
-       } else if (filp->f_op->ioctl) {
+       } else if ((f = filp->f_op->ioctl)) {
                lock_kernel();
-               error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
-                                         filp, cmd, arg);
+               if (!filp->f_op->ioctl) {
+                       printk("%s: ioctl %p disappeared\n", __FUNCTION__, f);
+                       print_symbol("symbol: %s\n", (unsigned long)f);
+                       dump_stack();
+               } else {
+                       error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
+                                                 filp, cmd, arg);
+               }
                unlock_kernel();
        }
 
index 0c542ec92d5b43201e7e53f3cd6d4fbe01dd67f5..00eee87510fe5b5438aa21556298cdebfc294804 100644 (file)
@@ -168,7 +168,7 @@ static inline struct nfs_direct_req *nfs_direct_req_alloc(void)
        return dreq;
 }
 
-static void nfs_direct_req_release(struct kref *kref)
+static void nfs_direct_req_free(struct kref *kref)
 {
        struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
 
@@ -177,6 +177,11 @@ static void nfs_direct_req_release(struct kref *kref)
        kmem_cache_free(nfs_direct_cachep, dreq);
 }
 
+static void nfs_direct_req_release(struct nfs_direct_req *dreq)
+{
+       kref_put(&dreq->kref, nfs_direct_req_free);
+}
+
 /*
  * Collects and returns the final error value/byte-count.
  */
@@ -196,7 +201,6 @@ static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
                result = dreq->count;
 
 out:
-       kref_put(&dreq->kref, nfs_direct_req_release);
        return (ssize_t) result;
 }
 
@@ -214,7 +218,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq)
        }
        complete_all(&dreq->completion);
 
-       kref_put(&dreq->kref, nfs_direct_req_release);
+       nfs_direct_req_release(dreq);
 }
 
 /*
@@ -369,6 +373,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size
        if (!result)
                result = nfs_direct_wait(dreq);
        rpc_clnt_sigunmask(clnt, &oldset);
+       nfs_direct_req_release(dreq);
 
        return result;
 }
@@ -716,6 +721,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz
        if (!result)
                result = nfs_direct_wait(dreq);
        rpc_clnt_sigunmask(clnt, &oldset);
+       nfs_direct_req_release(dreq);
 
        return result;
 }
index 074791ce4ab27fda0ae007f491662ac5ec95b2a7..b532a730cec2378072a20304fb85d07ed0d529f3 100644 (file)
@@ -140,7 +140,7 @@ static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na)
                if (!ni->name)
                        return -ENOMEM;
                memcpy(ni->name, na->name, i);
-               ni->name[i] = 0;
+               ni->name[na->name_len] = 0;
        }
        return 0;
 }
index 3b481d557edbd01df82c18d5cbef6386fa862bf1..9345a46ffb325f3dda57a0aeb048e3428475ad0c 100644 (file)
@@ -179,7 +179,7 @@ static int ramfs_nommu_resize(struct inode *inode, loff_t newsize, loff_t size)
                        return ret;
        }
 
-       ret = vmtruncate(inode, size);
+       ret = vmtruncate(inode, newsize);
 
        return ret;
 }
index c8461551e108bda5a48448ae5b0945286842a1ab..1f0129405cf47e636220a59ccd1e4f040940057d 100644 (file)
@@ -460,8 +460,8 @@ static struct buffer_head * inode_getblk(struct inode * inode, sector_t block,
        kernel_long_ad laarr[EXTENT_MERGE_SIZE];
        struct extent_position prev_epos, cur_epos, next_epos;
        int count = 0, startnum = 0, endnum = 0;
-       uint32_t elen = 0;
-       kernel_lb_addr eloc;
+       uint32_t elen = 0, tmpelen;
+       kernel_lb_addr eloc, tmpeloc;
        int c = 1;
        loff_t lbcount = 0, b_off = 0;
        uint32_t newblocknum, newblock;
@@ -520,8 +520,12 @@ static struct buffer_head * inode_getblk(struct inode * inode, sector_t block,
 
        b_off -= lbcount;
        offset = b_off >> inode->i_sb->s_blocksize_bits;
-       /* Move into indirect extent if we are at a pointer to it */
-       udf_next_aext(inode, &prev_epos, &eloc, &elen, 0);
+       /*
+        * Move prev_epos and cur_epos into indirect extent if we are at
+        * the pointer to it
+        */
+       udf_next_aext(inode, &prev_epos, &tmpeloc, &tmpelen, 0);
+       udf_next_aext(inode, &cur_epos, &tmpeloc, &tmpelen, 0);
 
        /* if the extent is allocated and recorded, return the block
        if the extent is not a multiple of the blocksize, round up */
index 3a743d854c17bf9408b8114d0b44ead19fe18b1e..6658afb41cc7564ffeced0d42e0b35b0421baf0e 100644 (file)
@@ -1351,7 +1351,7 @@ udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
 
        for (i=0; i<UDF_SB_NUMPARTS(sb); i++)
        {
-               switch UDF_SB_PARTTYPE(sb, i)
+               switch (UDF_SB_PARTTYPE(sb, i))
                {
                        case UDF_VIRTUAL_MAP15:
                        case UDF_VIRTUAL_MAP20:
index 4475588e973a4aa922144c80b39df5948b5199ef..7361861e3aacde605a400771af549b77e9b457e5 100644 (file)
@@ -701,7 +701,7 @@ xfs_is_delayed_page(
                        else if (buffer_delay(bh))
                                acceptable = (type == IOMAP_DELAY);
                        else if (buffer_dirty(bh) && buffer_mapped(bh))
-                               acceptable = (type == 0);
+                               acceptable = (type == IOMAP_NEW);
                        else
                                break;
                } while ((bh = bh->b_this_page) != head);
@@ -810,7 +810,7 @@ xfs_convert_page(
                        page_dirty--;
                        count++;
                } else {
-                       type = 0;
+                       type = IOMAP_NEW;
                        if (buffer_mapped(bh) && all_bh && startio) {
                                lock_buffer(bh);
                                xfs_add_to_ioend(inode, bh, offset,
@@ -968,8 +968,8 @@ xfs_page_state_convert(
 
        bh = head = page_buffers(page);
        offset = page_offset(page);
-       flags = -1;
-       type = IOMAP_READ;
+       flags = BMAPI_READ;
+       type = IOMAP_NEW;
 
        /* TODO: cleanup count and page_dirty */
 
@@ -999,14 +999,14 @@ xfs_page_state_convert(
                 *
                 * Third case, an unmapped buffer was found, and we are
                 * in a path where we need to write the whole page out.
-                */
+                */
                if (buffer_unwritten(bh) || buffer_delay(bh) ||
                    ((buffer_uptodate(bh) || PageUptodate(page)) &&
                     !buffer_mapped(bh) && (unmapped || startio))) {
-                       /*
+                       /*
                         * Make sure we don't use a read-only iomap
                         */
-                       if (flags == BMAPI_READ)
+                       if (flags == BMAPI_READ)
                                iomap_valid = 0;
 
                        if (buffer_unwritten(bh)) {
@@ -1055,7 +1055,7 @@ xfs_page_state_convert(
                         * That means it must already have extents allocated
                         * underneath it. Map the extent by reading it.
                         */
-                       if (!iomap_valid || type != IOMAP_READ) {
+                       if (!iomap_valid || flags != BMAPI_READ) {
                                flags = BMAPI_READ;
                                size = xfs_probe_cluster(inode, page, bh,
                                                                head, 1);
@@ -1066,7 +1066,15 @@ xfs_page_state_convert(
                                iomap_valid = xfs_iomap_valid(&iomap, offset);
                        }
 
-                       type = IOMAP_READ;
+                       /*
+                        * We set the type to IOMAP_NEW in case we are doing a
+                        * small write at EOF that is extending the file but
+                        * without needing an allocation. We need to update the
+                        * file size on I/O completion in this case so it is
+                        * the same case as having just allocated a new extent
+                        * that we are writing into for the first time.
+                        */
+                       type = IOMAP_NEW;
                        if (!test_and_set_bit(BH_Lock, &bh->b_state)) {
                                ASSERT(buffer_mapped(bh));
                                if (iomap_valid)
index b62cd36ff324777ec675173055db9eafbbaae019..e2fcee2b340d8e4134a7320c80eb92aaef4f611b 100644 (file)
@@ -13,7 +13,7 @@
 
 extern int pxm_to_node(int);
 extern int node_to_pxm(int);
-extern int __cpuinit acpi_map_pxm_to_node(int);
+extern int acpi_map_pxm_to_node(int);
 extern void __cpuinit acpi_unmap_pxm_to_node(int);
 
 #endif                         /* CONFIG_ACPI_NUMA */
index 5e07db0d46e9997752161028ed0e4e4dc26e2219..ca882b8e7d108e9d069ae053dd384e459bcec9a4 100644 (file)
@@ -78,7 +78,7 @@ struct acpi_signal_fatal_info {
 /*
  * OSL Initialization and shutdown primitives
  */
-acpi_status acpi_os_initialize(void);
+acpi_status __initdata acpi_os_initialize(void);
 
 acpi_status acpi_os_terminate(void);
 
@@ -236,6 +236,7 @@ acpi_os_derive_pci_id(acpi_handle rhandle,
  * Miscellaneous
  */
 acpi_status acpi_os_validate_interface(char *interface);
+acpi_status acpi_osi_invalidate(char* interface);
 
 acpi_status
 acpi_os_validate_address(u8 space_id,
index e08f7df85a4fdc2974e2c7e8ff7ba777e032f4dc..b5cca5daa348802e25426990f9e290db9d3621f9 100644 (file)
@@ -55,7 +55,7 @@ acpi_status
 acpi_initialize_tables(struct acpi_table_desc *initial_storage,
                       u32 initial_table_count, u8 allow_resize);
 
-acpi_status acpi_initialize_subsystem(void);
+acpi_status __init acpi_initialize_subsystem(void);
 
 acpi_status acpi_enable_subsystem(u32 flags);
 
index 15a838862cd4c33a6646f5dd6e1ef6ae1e34aa4f..a87ef1c8d46bbaacf43b75361b9062e048a3c47a 100644 (file)
@@ -390,6 +390,8 @@ void acpi_ut_delete_object_desc(union acpi_operand_object *object);
 
 u8 acpi_ut_valid_internal_object(void *object);
 
+union acpi_operand_object *acpi_ut_create_package_object(u32 count);
+
 union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size);
 
 union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size);
index 4b6ef7f21b9396e779e3cb86400d578ad3590e9e..3a0cbeb03fa17e01698796ab5edf48fe3af62ab7 100644 (file)
@@ -313,32 +313,29 @@ static inline int ffs(int word)
  * fls: find last bit set.
  */
 #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-static inline int fls(int word)
+static inline int fls64(unsigned long word)
 {
-       return 64 - __kernel_ctlz(word & 0xffffffff);
+       return 64 - __kernel_ctlz(word);
 }
 #else
-#include <asm-generic/bitops/fls.h>
-#endif
-#include <asm-generic/bitops/fls64.h>
+extern const unsigned char __flsm1_tab[256];
 
-/* Compute powers of two for the given integer.  */
-static inline long floor_log2(unsigned long word)
+static inline int fls64(unsigned long x)
 {
-#if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67)
-       return 63 - __kernel_ctlz(word);
-#else
-       long bit;
-       for (bit = -1; word ; bit++)
-               word >>= 1;
-       return bit;
-#endif
+       unsigned long t, a, r;
+
+       t = __kernel_cmpbge (x, 0x0101010101010101);
+       a = __flsm1_tab[t];
+       t = __kernel_extbl (x, a);
+       r = a*8 + __flsm1_tab[t] + (x != 0);
+
+       return r;
 }
+#endif
 
-static inline long ceil_log2(unsigned long word)
+static inline int fls(int x)
 {
-       long bit = floor_log2(word);
-       return bit + (word > (1UL << bit));
+       return fls64((unsigned int) x);
 }
 
 /*
@@ -353,9 +350,20 @@ static inline unsigned long hweight64(unsigned long w)
        return __kernel_ctpop(w);
 }
 
-#define hweight32(x)   (unsigned int) hweight64((x) & 0xfffffffful)
-#define hweight16(x)   (unsigned int) hweight64((x) & 0xfffful)
-#define hweight8(x)    (unsigned int) hweight64((x) & 0xfful)
+static inline unsigned int hweight32(unsigned int w)
+{
+       return hweight64(w);
+}
+
+static inline unsigned int hweight16(unsigned int w)
+{
+       return hweight64(w & 0xffff);
+}
+
+static inline unsigned int hweight8(unsigned int w)
+{
+       return hweight64(w & 0xff);
+}
 #else
 #include <asm-generic/bitops/hweight.h>
 #endif
index 457c34b6eb09337bc87421aeb0edfe0b35edd2e7..90e6b5d6c2143d8ab23e13b596803e52fec1411f 100644 (file)
@@ -437,9 +437,15 @@ static inline void t2_outl(u32 b, unsigned long addr)
 
 static DEFINE_SPINLOCK(t2_hae_lock);
 
+/*
+ * NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
+ *       they may be called directly, rather than through the
+ *       ioreadNN/iowriteNN routines.
+ */
+
 __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long result, msb;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -453,7 +459,7 @@ __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr)
 
 __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long result, msb;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -471,7 +477,7 @@ __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr)
  */
 __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long result, msb;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -485,7 +491,7 @@ __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr)
 
 __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long r0, r1, work, msb;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -501,7 +507,7 @@ __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr)
 
 __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long msb, w;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -515,7 +521,7 @@ __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr)
 
 __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long msb, w;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -533,7 +539,7 @@ __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
  */
 __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long msb;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -546,7 +552,7 @@ __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr)
 
 __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long) xaddr;
+       unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
        unsigned long msb, work;
        unsigned long flags;
        spin_lock_irqsave(&t2_hae_lock, flags);
@@ -587,14 +593,14 @@ __EXTERN_INLINE int t2_is_mmio(const volatile void __iomem *addr)
 __EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr)                \
 {                                                                      \
        if (t2_is_mmio(xaddr))                                          \
-               return t2_read##OS(xaddr - T2_DENSE_MEM);               \
+               return t2_read##OS(xaddr);                              \
        else                                                            \
                return t2_in##OS((unsigned long)xaddr - T2_IO);         \
 }                                                                      \
 __EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr)      \
 {                                                                      \
        if (t2_is_mmio(xaddr))                                          \
-               t2_write##OS(b, xaddr - T2_DENSE_MEM);                  \
+               t2_write##OS(b, xaddr);                                 \
        else                                                            \
                t2_out##OS(b, (unsigned long)xaddr - T2_IO);            \
 }
index a64ccbff7d98ac3e0c94a50576df2e57e4a0f34d..a17f6f33b68ec6f339199ed4371307cf20999d2d 100644 (file)
@@ -380,12 +380,7 @@ struct el_PRIVATEER_envdata_mcheck {
 /*
  * Memory functions.  all accesses are done through linear space.
  */
-
-__EXTERN_INLINE void __iomem *titan_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + TITAN_IO_BIAS);
-}
-
+extern void __iomem *titan_ioportmap(unsigned long addr);
 extern void __iomem *titan_ioremap(unsigned long addr, unsigned long size);
 extern void titan_iounmap(volatile void __iomem *addr);
 
index 44e635d2c5712dab7112e9cbd1aeda4e33033115..58d4fe48742c49c09b03657c97d6269d7e930d02 100644 (file)
@@ -2,6 +2,7 @@
 #define __ALPHA_TSUNAMI__H__
 
 #include <linux/types.h>
+#include <linux/pci.h>
 #include <asm/compiler.h>
 
 /*
@@ -302,18 +303,8 @@ struct el_TSUNAMI_sysdata_mcheck {
 /*
  * Memory functions.  all accesses are done through linear space.
  */
-
-__EXTERN_INLINE void __iomem *tsunami_ioportmap(unsigned long addr)
-{
-       return (void __iomem *)(addr + TSUNAMI_IO_BIAS);
-}
-
-__EXTERN_INLINE void __iomem *tsunami_ioremap(unsigned long addr, 
-                                             unsigned long size)
-{
-       return (void __iomem *)(addr + TSUNAMI_MEM_BIAS);
-}
-
+extern void __iomem *tsunami_ioportmap(unsigned long addr);
+extern void __iomem *tsunami_ioremap(unsigned long addr, unsigned long size);
 __EXTERN_INLINE int tsunami_is_ioaddr(unsigned long addr)
 {
        return addr >= TSUNAMI_BASE;
index 12af803d445a00444f7af2f85606a13f5f3e3d84..cd562f544ba2deb9c1c77d0ec3fe36b0a939f16e 100644 (file)
@@ -295,7 +295,7 @@ __EXTERN_INLINE int wildfire_is_ioaddr(unsigned long addr)
 
 __EXTERN_INLINE int wildfire_is_mmio(const volatile void __iomem *xaddr)
 {
-       unsigned long addr = (unsigned long)addr;
+       unsigned long addr = (unsigned long)xaddr;
        return (addr & 0x100000000UL) == 0;
 }
 
index f4defc2bd3fb246e225717c527e7c7e5c855ee4a..48a22e3e6f32166570aac056e27d65159181302b 100644 (file)
@@ -76,12 +76,14 @@ register struct thread_info *__current_thread_info __asm__("$8");
 #define TIF_UAC_NOFIX          7
 #define TIF_UAC_SIGBUS         8
 #define TIF_MEMDIE             9
+#define TIF_RESTORE_SIGMASK    10      /* restore signal mask in do_signal */
 
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
+#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
 
 /* Work to do on interrupt/exception return.  */
 #define _TIF_WORK_MASK         (_TIF_NOTIFY_RESUME     \
index e58a427012dd3c762eb9a233756d32835babe43f..29bf2fdc91c0eefe194b5123774e88eb29c4f8b6 100644 (file)
 #define __NR_osf_memcntl       260     /* not implemented */
 #define __NR_osf_fdatasync     261     /* not implemented */
 
+/*
+ * Ignore legacy syscalls that we don't use.
+ */
+#define __IGNORE_alarm
+#define __IGNORE_creat
+#define __IGNORE_getegid
+#define __IGNORE_geteuid
+#define __IGNORE_getgid
+#define __IGNORE_getpid
+#define __IGNORE_getppid
+#define __IGNORE_getuid
+#define __IGNORE_pause
+#define __IGNORE_time
+#define __IGNORE_utime
 
 /*
  * Linux-specific system calls begin at 300
 #define __NR_inotify_init              444
 #define __NR_inotify_add_watch         445
 #define __NR_inotify_rm_watch          446
+#define __NR_fdatasync                 447
+#define __NR_kexec_load                        448
+#define __NR_migrate_pages             449
+#define __NR_openat                    450
+#define __NR_mkdirat                   451
+#define __NR_mknodat                   452
+#define __NR_fchownat                  453
+#define __NR_futimesat                 454
+#define __NR_fstatat64                 455
+#define __NR_unlinkat                  456
+#define __NR_renameat                  457
+#define __NR_linkat                    458
+#define __NR_symlinkat                 459
+#define __NR_readlinkat                        460
+#define __NR_fchmodat                  461
+#define __NR_faccessat                 462
+#define __NR_pselect6                  463
+#define __NR_ppoll                     464
+#define __NR_unshare                   465
+#define __NR_set_robust_list           466
+#define __NR_get_robust_list           467
+#define __NR_splice                    468
+#define __NR_sync_file_range           469
+#define __NR_tee                       470
+#define __NR_vmsplice                  471
+#define __NR_move_pages                        472
+#define __NR_getcpu                    473
+#define __NR_epoll_pwait               474
+#define __NR_utimensat                 475
+#define __NR_signalfd                  476
+#define __NR_timerfd                   477
+#define __NR_eventfd                   478
 
 #ifdef __KERNEL__
 
-#define NR_SYSCALLS                    447
+#define NR_SYSCALLS                    479
 
 #define __ARCH_WANT_IPC_PARSE_VERSION
 #define __ARCH_WANT_OLD_READDIR
index ed06f59b544d4c7c84ef7ccdb20ab56fa1444554..e8df1e7aae6b39155c6cdf625e2549aef6d97627 100644 (file)
@@ -46,6 +46,37 @@ extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count);
 #define vga_readb(a)   readb((u8 __iomem *)(a))
 #define vga_writeb(v,a)        writeb(v, (u8 __iomem *)(a))
 
+#ifdef CONFIG_VGA_HOSE
+#include <linux/ioport.h>
+#include <linux/pci.h>
+
+extern struct pci_controller *pci_vga_hose;
+
+# define __is_port_vga(a)       \
+       (((a) >= 0x3b0) && ((a) < 0x3e0) && \
+        ((a) != 0x3b3) && ((a) != 0x3d3))
+
+# define __is_mem_vga(a) \
+       (((a) >= 0xa0000) && ((a) <= 0xc0000))
+
+# define FIXUP_IOADDR_VGA(a) do {                       \
+       if (pci_vga_hose && __is_port_vga(a))     \
+               (a) += pci_vga_hose->io_space->start;     \
+ } while(0)
+
+# define FIXUP_MEMADDR_VGA(a) do {                       \
+       if (pci_vga_hose && __is_mem_vga(a))     \
+               (a) += pci_vga_hose->mem_space->start; \
+ } while(0)
+
+#else /* CONFIG_VGA_HOSE */
+# define pci_vga_hose 0
+# define __is_port_vga(a) 0
+# define __is_mem_vga(a) 0
+# define FIXUP_IOADDR_VGA(a)
+# define FIXUP_MEMADDR_VGA(a)
+#endif /* CONFIG_VGA_HOSE */
+
 #define VGA_MAP_MEM(x,s)       ((unsigned long) ioremap(x, s))
 
 #endif
index 84467a5190d093d6ebc0bacd857102c2e36cb289..131e0a1d0df395f3d7740167e54b0b9419e5ad4d 100644 (file)
@@ -10,7 +10,7 @@
  * based on ixdp425.h:
  *     Copyright 2004 (c) MontaVista, Software, Inc.
  *
- * This file is licensed under  the terms of the GNU General Public
+ * This file is licensed under the terms of the GNU General Public
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
 #define NAS100D_PCI_INTD_PIN   8
 #define NAS100D_PCI_INTE_PIN   7
 
-/* GPIO */
-
-#define NAS100D_GPIO0           0
-#define NAS100D_GPIO1           1
-#define NAS100D_GPIO2           2
-#define NAS100D_GPIO3           3
-#define NAS100D_GPIO4           4
-#define NAS100D_GPIO5           5
-#define NAS100D_GPIO6           6
-#define NAS100D_GPIO7           7
-#define NAS100D_GPIO8           8
-#define NAS100D_GPIO9           9
-#define NAS100D_GPIO10          10
-#define NAS100D_GPIO11          11
-#define NAS100D_GPIO12          12
-#define NAS100D_GPIO13          13
-#define NAS100D_GPIO14          14
-#define NAS100D_GPIO15          15
-
-
 /* Buttons */
 
-#define NAS100D_PB_GPIO         NAS100D_GPIO14
-#define NAS100D_RB_GPIO         NAS100D_GPIO4
-#define NAS100D_PO_GPIO         NAS100D_GPIO12   /* power off */
+#define NAS100D_PB_GPIO         14
+#define NAS100D_RB_GPIO         4
+#define NAS100D_PO_GPIO         12   /* power off */
 
 #define NAS100D_PB_IRQ          IRQ_IXP4XX_GPIO14
 #define NAS100D_RB_IRQ          IRQ_IXP4XX_GPIO4
index 6b437f7c99550e8e56ba5f575ac3814a7efb9c8e..850fdc5b45da21eda6f6a3ad9d03a7a06b9d738a 100644 (file)
@@ -9,7 +9,7 @@
  * based on ixdp425.h:
  *     Copyright 2004 (c) MontaVista, Software, Inc.
  *
- * This file is licensed under  the terms of the GNU General Public
+ * This file is licensed under the terms of the GNU General Public
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
 #define NSLU2_PCI_INTC_PIN     9
 #define NSLU2_PCI_INTD_PIN     8
 
-
 /* NSLU2 Timer */
 #define NSLU2_FREQ 66000000
-#define NSLU2_CLOCK_TICK_RATE (((NSLU2_FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ)
-#define NSLU2_CLOCK_TICKS_PER_USEC ((NSLU2_CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC)
-
-/* GPIO */
-
-#define NSLU2_GPIO0            0
-#define NSLU2_GPIO1            1
-#define NSLU2_GPIO2            2
-#define NSLU2_GPIO3            3
-#define NSLU2_GPIO4            4
-#define NSLU2_GPIO5            5
-#define NSLU2_GPIO6            6
-#define NSLU2_GPIO7            7
-#define NSLU2_GPIO8            8
-#define NSLU2_GPIO9            9
-#define NSLU2_GPIO10           10
-#define NSLU2_GPIO11           11
-#define NSLU2_GPIO12           12
-#define NSLU2_GPIO13           13
-#define NSLU2_GPIO14           14
-#define NSLU2_GPIO15           15
 
 /* Buttons */
 
-#define NSLU2_PB_GPIO          NSLU2_GPIO5
-#define NSLU2_PO_GPIO          NSLU2_GPIO8     /* power off */
-#define NSLU2_RB_GPIO          NSLU2_GPIO12
+#define NSLU2_PB_GPIO          5
+#define NSLU2_PO_GPIO          8       /* power off */
+#define NSLU2_RB_GPIO          12
 
 #define NSLU2_PB_IRQ           IRQ_IXP4XX_GPIO5
 #define NSLU2_RB_IRQ           IRQ_IXP4XX_GPIO12
 
 /* LEDs */
 
-#define NSLU2_LED_RED          NSLU2_GPIO0
-#define NSLU2_LED_GRN          NSLU2_GPIO1
+#define NSLU2_LED_RED_GPIO     0
+#define NSLU2_LED_GRN_GPIO     1
 
-#define NSLU2_LED_RED_BM       (1L << NSLU2_LED_RED)
-#define NSLU2_LED_GRN_BM       (1L << NSLU2_LED_GRN)
+#define NSLU2_LED_RED_BM       (1L << NSLU2_LED_RED_GPIO)
+#define NSLU2_LED_GRN_BM       (1L << NSLU2_LED_GRN_GPIO)
 
-#define NSLU2_LED_DISK1                NSLU2_GPIO3
-#define NSLU2_LED_DISK2                NSLU2_GPIO2
+#define NSLU2_LED_DISK1_GPIO   3
+#define NSLU2_LED_DISK2_GPIO   2
 
-#define NSLU2_LED_DISK1_BM     (1L << NSLU2_GPIO2)
-#define NSLU2_LED_DISK2_BM     (1L << NSLU2_GPIO3)
+#define NSLU2_LED_DISK1_BM     (1L << NSLU2_LED_DISK1_GPIO)
+#define NSLU2_LED_DISK2_BM     (1L << NSLU2_LED_DISK2_GPIO)
 
 
index ab194e5f66537cac410c457483282b410d7b6acb..2a44d3d6798078ab29853869e179bd54790f21cd 100644 (file)
@@ -113,6 +113,7 @@ extern unsigned long ixp4xx_timer_freq;
 extern void ixp4xx_map_io(void);
 extern void ixp4xx_init_irq(void);
 extern void ixp4xx_sys_init(void);
+extern void ixp4xx_timer_init(void);
 extern struct sys_timer ixp4xx_timer;
 extern void ixp4xx_pci_preinit(void);
 struct pci_sys_data;
index 4505aefbad17175308ac8a31049eb269058cb258..19e77f038042ec0b64644e25136c326d57ff5b1d 100644 (file)
 #define S3C2440_PA_AC97           (0x5B000000)
 #define S3C2440_SZ_AC97           SZ_1M
 
+/* S3C2443 High-speed SD/MMC */
+#define S3C2443_PA_HSMMC   (0x4A800000)
+#define S3C2443_SZ_HSMMC   (256)
+
 /* ISA style IO, for each machine to sort out mappings for, if it
  * implements it. We reserve two 16M regions for ISA.
  */
index 02131a5a1d3af14f9a4dd7cf3ff8db5265a0bc97..0362332faaf02cf324107c3d3cf3d517222bd1de 100644 (file)
@@ -98,5 +98,9 @@
 #define S3C2440_GPJ12_OUTP      (0x01 << 24)
 #define S3C2440_GPJ12_CAMRESET  (0x02 << 24)
 
+#define S3C2443_GPJ13          S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 13)
+#define S3C2443_GPJ14          S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 14)
+#define S3C2443_GPJ15          S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 15)
+
 #endif /* __ASM_ARCH_REGS_GPIOJ_H */
 
diff --git a/include/asm-arm/arch-s3c2410/regs-s3c2412.h b/include/asm-arm/arch-s3c2410/regs-s3c2412.h
new file mode 100644 (file)
index 0000000..8ca6a3b
--- /dev/null
@@ -0,0 +1,21 @@
+/* linux/include/asm-arm/arch-s3c2410/regs-s3c2412.h
+ *
+ * Copyright 2007 Simtec Electronics
+ *     http://armlinux.simtec.co.uk/
+ *     Ben Dooks <ben@simtec.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * S3C2412 specific register definitions
+*/
+
+#ifndef __ASM_ARCH_REGS_S3C2412_H
+#define __ASM_ARCH_REGS_S3C2412_H "s3c2412"
+
+#define S3C2412_SWRST          (S3C24XX_VA_CLKPWR + 0x30)
+#define S3C2412_SWRST_RESET    (0x533C2412)
+
+#endif /* __ASM_ARCH_REGS_S3C2412_H */
+
index bb9a7aa10c12ebc8e58abaaa19b95fb926dfe8ca..a91d8a1523cff6964febe47a5c362274de23fcb7 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index fd2f9bf4dcc68decea8bede1a8ebeee36552f02f..c59fad18e73b0dae6530014e5f23168520abfba5 100644 (file)
@@ -49,7 +49,7 @@ struct machine_desc {
  */
 #define MACHINE_START(_type,_name)                     \
 static const struct machine_desc __mach_desc_##_type   \
- __attribute_used__                                    \
+ __used                                                        \
  __attribute__((__section__(".arch.info.init"))) = {   \
        .nr             = MACH_TYPE_##_type,            \
        .name           = _name,
index e5407392afcad0413c0df46030f51e2c93c4fd5b..7bbf105463f1adf8fd9cdaf68283cc87f3cb8c97 100644 (file)
@@ -185,7 +185,7 @@ struct tagtable {
 
 #ifdef __KERNEL__
 
-#define __tag __attribute_used__ __attribute__((__section__(".taglist.init")))
+#define __tag __used __attribute__((__section__(".taglist.init")))
 #define __tagtable(tag, fn) \
 static struct tagtable __tagtable_##fn __tag = { tag, fn }
 
@@ -218,7 +218,7 @@ struct early_params {
 };
 
 #define __early_param(name,fn)                                 \
-static struct early_params __early_##fn __attribute_used__     \
+static struct early_params __early_##fn __used                 \
 __attribute__((__section__(".early_param.init"))) = { name, fn }
 
 #endif  /*  __KERNEL__  */
index a3f4fe1742d0ac84abb7a3dc9c2996579ab3e123..f784d11f40b5e630f50bf573c8139d16e0cf473d 100644 (file)
@@ -15,6 +15,17 @@ struct termios {
        cc_t c_cc[NCCS];                /* control characters */
 };
 
+struct termios2 {
+       tcflag_t c_iflag;               /* input mode flags */
+       tcflag_t c_oflag;               /* output mode flags */
+       tcflag_t c_cflag;               /* control mode flags */
+       tcflag_t c_lflag;               /* local mode flags */
+       cc_t c_line;                    /* line discipline */
+       cc_t c_cc[NCCS];                /* control characters */
+       speed_t c_ispeed;               /* input speed */
+       speed_t c_ospeed;               /* output speed */
+};
+
 struct ktermios {
        tcflag_t c_iflag;               /* input mode flags */
        tcflag_t c_oflag;               /* output mode flags */
@@ -128,6 +139,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define    BOTHER 0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -143,10 +155,12 @@ struct ktermios {
 #define  B3000000 0010015
 #define  B3500000 0010016
 #define  B4000000 0010017
-#define CIBAUD   002003600000  /* input baud rate (not used) */
+#define CIBAUD   002003600000          /* input baud rate */
 #define CMSPAR    010000000000         /* mark or space (stick) parity */
 #define CRTSCTS          020000000000          /* flow control */
 
+#define IBSHIFT           16
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index 329c324c4040c9c3fcb0a1302465a4ed88d49209..293e3f1bc3f22c3c41e0ffd62d77ce9f9c66da70 100644 (file)
@@ -82,8 +82,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index ccd0de010e81bb515d3aec39acb8abcf04ffadbd..71be4fded7e20f1b069f2dbe7ad3c6a5d63456ca 100644 (file)
 # define v6wbi_always_flags    (-1UL)
 #endif
 
+#ifdef CONFIG_CPU_TLB_V7
+# define v7wbi_possible_flags  v6wbi_tlb_flags
+# define v7wbi_always_flags    v6wbi_tlb_flags
+# ifdef _TLB
+#  define MULTI_TLB 1
+# else
+#  define _TLB v7wbi
+# endif
+#else
+# define v7wbi_possible_flags  0
+# define v7wbi_always_flags    (-1UL)
+#endif
+
 #ifndef _TLB
 #error Unknown TLB model
 #endif
index 10fd07c7666264b5f39c0387f66bf4d3200d94b7..e8256230647558a0841483c30cc1af8c20986217 100644 (file)
@@ -173,7 +173,7 @@ struct tagtable {
        int (*parse)(const struct tag *);
 };
 
-#define __tag __attribute_used__ __attribute__((__section__(".taglist")))
+#define __tag __used __attribute__((__section__(".taglist")))
 #define __tagtable(tag, fn) \
 static struct tagtable __tagtable_##fn __tag = { tag, fn }
 
index 8307b1bb337a055d123c1d6fa4fc2c48d9815604..84155eb67f1d3c7907c4453548e683c2c4ea8952 100644 (file)
@@ -14,8 +14,8 @@
        *(.data)                                                        \
        *(.data.init.refok)
 
-#define RODATA                                                         \
-       . = ALIGN(4096);                                                \
+#define RO_DATA(align)                                                 \
+       . = ALIGN((align));                                             \
        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
                VMLINUX_SYMBOL(__start_rodata) = .;                     \
                *(.rodata) *(.rodata.*)                                 \
                VMLINUX_SYMBOL(__end_rodata) = .;                       \
        }                                                               \
                                                                        \
-       . = ALIGN(4096);
+       . = ALIGN((align));
+
+/* RODATA provided for backward compatibility.
+ * All archs are supposed to use RO_DATA() */
+#define RODATA RO_DATA(4096)
 
 #define SECURITY_INIT                                                  \
        .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
index 99b664aa20837e3f1d674800bc9377932267802e..49fc886a623278249302edf3c169c883526e8313 100644 (file)
@@ -78,7 +78,7 @@ struct thread_struct {
 do {                                                           \
        set_fs(USER_DS);           /* reads from user space */  \
        (_regs)->pc = (_pc);                                    \
-       (_regs)->ccr &= 0x00;      /* clear kernel flag */      \
+       (_regs)->ccr = 0x00;       /* clear all flags */        \
        (_regs)->er5 = current->mm->start_data; /* GOT base */  \
        wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3); \
 } while(0)
diff --git a/include/asm-m68k/mmzone.h b/include/asm-m68k/mmzone.h
new file mode 100644 (file)
index 0000000..e1f1ec7
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _ASM_M68K_MMZONE_H_
+#define _ASM_M68K_MMZONE_H_
+
+extern pg_data_t pg_data_map[];
+
+#define NODE_DATA(nid)         (&pg_data_map[nid])
+#define NODE_MEM_MAP(nid)      (NODE_DATA(nid)->node_mem_map)
+
+#endif /* _ASM_M68K_MMZONE_H_ */
index c6d75af2d8d34ba5489085fb688b6099aa42fa05..382d20a6fc188409973b3cdeb74057d276b4aefd 100644 (file)
@@ -1,7 +1,39 @@
 #ifndef _ASM_M68K_MODULE_H
 #define _ASM_M68K_MODULE_H
-struct mod_arch_specific { };
+
+struct mod_arch_specific {
+       struct m68k_fixup_info *fixup_start, *fixup_end;
+};
+
+#define MODULE_ARCH_INIT {                             \
+       .fixup_start            = __start_fixup,        \
+       .fixup_end              = __stop_fixup,         \
+}
+
 #define Elf_Shdr Elf32_Shdr
 #define Elf_Sym Elf32_Sym
 #define Elf_Ehdr Elf32_Ehdr
+
+
+enum m68k_fixup_type {
+       m68k_fixup_memoffset,
+       m68k_fixup_vnode_shift,
+};
+
+struct m68k_fixup_info {
+       enum m68k_fixup_type type;
+       void *addr;
+};
+
+#define m68k_fixup(type, addr)                 \
+       "       .section \".m68k_fixup\",\"aw\"\n"      \
+       "       .long " #type "," #addr "\n"    \
+       "       .previous\n"
+
+extern struct m68k_fixup_info __start_fixup[], __stop_fixup[];
+
+struct module;
+extern void module_fixup(struct module *mod, struct m68k_fixup_info *start,
+                        struct m68k_fixup_info *end);
+
 #endif /* _ASM_M68K_MODULE_H */
index 61e4406ed96affcb989ef23e2ded6b6c9ea50d5a..b5b78c01eb6c900f427a2e46fbd77039198dfde3 100644 (file)
@@ -130,7 +130,7 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
 #define pte_present(pte)       (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE))
 #define pte_clear(mm,addr,ptep)                ({ pte_val(*(ptep)) = 0; })
 
-#define pte_page(pte)          (mem_map + ((unsigned long)(__va(pte_val(pte)) - PAGE_OFFSET) >> PAGE_SHIFT))
+#define pte_page(pte)          virt_to_page(__va(pte_val(pte)))
 #define pte_pfn(pte)           (pte_val(pte) >> PAGE_SHIFT)
 #define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
 
@@ -143,7 +143,7 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
        while (--__i >= 0)                      \
                *__ptr++ = 0;                   \
 })
-#define pmd_page(pmd)          (mem_map + ((unsigned long)(__va(pmd_val(pmd)) - PAGE_OFFSET) >> PAGE_SHIFT))
+#define pmd_page(pmd)          virt_to_page(__va(pmd_val(pmd)))
 
 
 #define pgd_none(pgd)          (!pgd_val(pgd))
@@ -223,10 +223,10 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmdp, unsigned long address)
        return (pte_t *)__pmd_page(*pmdp) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1));
 }
 
-#define pte_offset_map(pmdp,address) ((pte_t *)kmap(pmd_page(*pmdp)) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
+#define pte_offset_map(pmdp,address) ((pte_t *)__pmd_page(*pmdp) + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
 #define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address)
-#define pte_unmap(pte) kunmap(pte)
-#define pte_unmap_nested(pte) kunmap(pte)
+#define pte_unmap(pte)         ((void)0)
+#define pte_unmap_nested(pte)  ((void)0)
 
 /*
  * Allocate and free page tables. The xxx_kernel() versions are
index fcc165ddd09e11e789a76c04208faef6b93937ee..9e6d0d6debdb39e5617902ed6231047edc0bb743 100644 (file)
@@ -27,6 +27,8 @@
 
 #ifndef __ASSEMBLY__
 
+#include <asm/module.h>
+
 #define get_user_page(vaddr)           __get_free_page(GFP_KERNEL)
 #define free_user_page(page, addr)     free_page(addr)
 
@@ -114,18 +116,33 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 
 #ifndef __ASSEMBLY__
 
+extern unsigned long m68k_memoffset;
+
 #ifndef CONFIG_SUN3
 
 #define WANT_PAGE_VIRTUAL
-#ifdef CONFIG_SINGLE_MEMORY_CHUNK
-extern unsigned long m68k_memoffset;
 
-#define __pa(vaddr)            ((unsigned long)(vaddr)+m68k_memoffset)
-#define __va(paddr)            ((void *)((unsigned long)(paddr)-m68k_memoffset))
-#else
-#define __pa(vaddr)            virt_to_phys((void *)(vaddr))
-#define __va(paddr)            phys_to_virt((unsigned long)(paddr))
-#endif
+static inline unsigned long ___pa(void *vaddr)
+{
+       unsigned long paddr;
+       asm (
+               "1:     addl #0,%0\n"
+               m68k_fixup(%c2, 1b+2)
+               : "=r" (paddr)
+               : "0" (vaddr), "i" (m68k_fixup_memoffset));
+       return paddr;
+}
+#define __pa(vaddr)    ___pa((void *)(vaddr))
+static inline void *__va(unsigned long paddr)
+{
+       void *vaddr;
+       asm (
+               "1:     subl #0,%0\n"
+               m68k_fixup(%c2, 1b+2)
+               : "=r" (vaddr)
+               : "0" (paddr), "i" (m68k_fixup_memoffset));
+       return vaddr;
+}
 
 #else  /* !CONFIG_SUN3 */
 /* This #define is a horrible hack to suppress lots of warnings. --m */
@@ -161,11 +178,47 @@ static inline void *__va(unsigned long x)
 #define virt_to_pfn(kaddr)     (__pa(kaddr) >> PAGE_SHIFT)
 #define pfn_to_virt(pfn)       __va((pfn) << PAGE_SHIFT)
 
-#define virt_to_page(kaddr)    (mem_map + (((unsigned long)(kaddr)-PAGE_OFFSET) >> PAGE_SHIFT))
-#define page_to_virt(page)     ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
+extern int m68k_virt_to_node_shift;
+
+#ifdef CONFIG_SINGLE_MEMORY_CHUNK
+#define __virt_to_node(addr)   (&pg_data_map[0])
+#else
+extern struct pglist_data *pg_data_table[];
+
+static inline __attribute_const__ int __virt_to_node_shift(void)
+{
+       int shift;
+
+       asm (
+               "1:     moveq   #0,%0\n"
+               m68k_fixup(%c1, 1b)
+               : "=d" (shift)
+               : "i" (m68k_fixup_vnode_shift));
+       return shift;
+}
+
+#define __virt_to_node(addr)   (pg_data_table[(unsigned long)(addr) >> __virt_to_node_shift()])
+#endif
 
-#define pfn_to_page(pfn)       virt_to_page(pfn_to_virt(pfn))
-#define page_to_pfn(page)      virt_to_pfn(page_to_virt(page))
+#define virt_to_page(addr) ({                                          \
+       pfn_to_page(virt_to_pfn(addr));                                 \
+})
+#define page_to_virt(page) ({                                          \
+       pfn_to_virt(page_to_pfn(page));                                 \
+})
+
+#define pfn_to_page(pfn) ({                                            \
+       unsigned long __pfn = (pfn);                                    \
+       struct pglist_data *pgdat;                                      \
+       pgdat = __virt_to_node((unsigned long)pfn_to_virt(__pfn));      \
+       pgdat->node_mem_map + (__pfn - pgdat->node_start_pfn);          \
+})
+#define page_to_pfn(_page) ({                                          \
+       struct page *__p = (_page);                                     \
+       struct pglist_data *pgdat;                                      \
+       pgdat = &pg_data_map[page_to_nid(__p)];                         \
+       ((__p) - pgdat->node_mem_map) + pgdat->node_start_pfn;          \
+})
 
 #define virt_addr_valid(kaddr) ((void *)(kaddr) >= (void *)PAGE_OFFSET && (void *)(kaddr) < high_memory)
 #define pfn_valid(pfn)         virt_addr_valid(pfn_to_virt(pfn))
index a9cfb4b99d88b206c43d145694d588d6dc99524b..4cb1a57ab763f103b20fe0aeb0c3c9dc3b7c62be 100644 (file)
@@ -8,11 +8,12 @@
 #include <asm/virtconvert.h>
 
 
-
 #ifdef CONFIG_SUN3
 #include <asm/sun3_pgalloc.h>
 #else
 #include <asm/motorola_pgalloc.h>
 #endif
 
+extern void m68k_setup_node(int node);
+
 #endif /* M68K_PGALLOC_H */
index 555b87a1f7e3220ff562c60ab0409b4273e90568..778a4c538eb2ed03da163506d93573622bb1a4ab 100644 (file)
@@ -107,22 +107,7 @@ extern void *empty_zero_page;
 /* 64-bit machines, beware!  SRB. */
 #define SIZEOF_PTR_LOG2                               2
 
-/*
- * Check if the addr/len goes up to the end of a physical
- * memory chunk.  Used for DMA functions.
- */
-#ifdef CONFIG_SINGLE_MEMORY_CHUNK
-/*
- * It makes no sense to consider whether we cross a memory boundary if
- * we support just one physical chunk of memory.
- */
-static inline int mm_end_of_chunk(unsigned long addr, int len)
-{
-       return 0;
-}
-#else
-int mm_end_of_chunk (unsigned long addr, int len);
-#endif
+#define mm_end_of_chunk(addr, len)     0
 
 extern void kernel_set_cachemode(void *addr, unsigned long size, int cmode);
 
index 5156a28a18d82a722fb9b92879d6c5c413cfeb90..b9e62c1e7ae3d91bdc0b804046524313b595cef1 100644 (file)
@@ -132,8 +132,8 @@ static inline void pte_clear (struct mm_struct *mm, unsigned long addr, pte_t *p
 #define pfn_pte(pfn, pgprot) \
 ({ pte_t __pte; pte_val(__pte) = pfn | pgprot_val(pgprot); __pte; })
 
-#define pte_page(pte)          (mem_map+((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT))
-#define pmd_page(pmd)          (mem_map+((__pmd_page(pmd) - PAGE_OFFSET) >> PAGE_SHIFT))
+#define pte_page(pte)          virt_to_page(__pte_page(pte))
+#define pmd_page(pmd)          virt_to_page(__pmd_page(pmd))
 
 
 static inline int pmd_none2 (pmd_t *pmd) { return !pmd_val (*pmd); }
index 83a87c9b1a16fa399f1dfa4126315b84f861421c..dea32fbc7e51c1c5bc995a1aa69ab57f6b1cf6f5 100644 (file)
@@ -8,56 +8,35 @@
 #ifdef __KERNEL__
 
 #include <linux/compiler.h>
+#include <linux/mmzone.h>
 #include <asm/setup.h>
 #include <asm/page.h>
 
-#ifdef CONFIG_AMIGA
-#include <asm/amigahw.h>
-#endif
-
 /*
  * Change virtual addresses to physical addresses and vv.
  */
-#ifndef CONFIG_SUN3
-extern unsigned long mm_vtop(unsigned long addr) __attribute_const__;
-extern unsigned long mm_ptov(unsigned long addr) __attribute_const__;
-#else
-static inline unsigned long mm_vtop(unsigned long vaddr)
-{
-       return __pa(vaddr);
-}
-
-static inline unsigned long mm_ptov(unsigned long paddr)
-{
-       return (unsigned long)__va(paddr);
-}
-#endif
-
-#ifdef CONFIG_SINGLE_MEMORY_CHUNK
-static inline unsigned long virt_to_phys(void *vaddr)
-{
-       return (unsigned long)vaddr - PAGE_OFFSET + m68k_memory[0].addr;
-}
-
-static inline void * phys_to_virt(unsigned long paddr)
-{
-       return (void *)(paddr - m68k_memory[0].addr + PAGE_OFFSET);
-}
-#else
 static inline unsigned long virt_to_phys(void *address)
 {
-       return mm_vtop((unsigned long)address);
+       return __pa(address);
 }
 
 static inline void *phys_to_virt(unsigned long address)
 {
-       return (void *) mm_ptov(address);
+       return __va(address);
 }
-#endif
 
 /* Permanent address of a page. */
-#define __page_address(page)   (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT))
-#define page_to_phys(page)     virt_to_phys((void *)__page_address(page))
+#ifdef CONFIG_SINGLE_MEMORY_CHUNK
+#define page_to_phys(page) \
+       __pa(PAGE_OFFSET + (((page) - pg_data_map[0].node_mem_map) << PAGE_SHIFT))
+#else
+#define page_to_phys(_page) ({                                         \
+       struct page *__page = _page;                                    \
+       struct pglist_data *pgdat;                                      \
+       pgdat = pg_data_table[page_to_nid(__page)];                     \
+       page_to_pfn(__page) << PAGE_SHIFT;                              \
+})
+#endif
 
 /*
  * IO bus memory addresses are 1:1 with the physical address,
index d9a3a8ca58a108ed0781e17ed9d80903a5176f7b..94d0294341d65a90006669e2a9bfd7851ab37452 100644 (file)
@@ -90,7 +90,8 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
 static inline struct page *pte_alloc_one(struct mm_struct *mm,
                                         unsigned long address)
 {
-       return virt_to_page(pte_alloc_one_kernel(mm, address));
+       pte_t *pte = pte_alloc_one_kernel(mm, address);
+       return pte ? virt_to_page(pte) : NULL;
 }
 
 static inline void pte_free_kernel(pte_t *pte)
index 0a17682663d8f308411b26e8ba28eb91e1c8fe96..66714042e4383399a597ec5867a14e46e52ee1bc 100644 (file)
@@ -38,6 +38,15 @@ extern void pte_free_finish(void);
 
 static inline void tlb_flush(struct mmu_gather *tlb)
 {
+       struct ppc64_tlb_batch *tlbbatch = &__get_cpu_var(ppc64_tlb_batch);
+
+       /* If there's a TLB batch pending, then we must flush it because the
+        * pages are going to be freed and we really don't want to have a CPU
+        * access a freed page because it has a stale TLB
+        */
+       if (tlbbatch->index)
+               __flush_tlb_pending(tlbbatch);
+
        pte_free_finish();
 }
 
index 86564e7a26aef3efe8fc827168df191997cbde47..39f41fcd509d78dbc02123bf8ff23fd769f09354 100644 (file)
@@ -24,6 +24,9 @@
 #define FRQMR1                 0xffc80014
 #else
 #define FRQCR                  0xffc00000
+#define FRQCR_PSTBY            0x0200
+#define FRQCR_PLLEN            0x0400
+#define FRQCR_CKOEN            0x0800
 #endif
 #define MIN_DIVISOR_NR         0
 #define MAX_DIVISOR_NR         3
index faf3051cd4290fd942c0c67d00fe3035607694dc..6034d4a29e73151434597f0ee1fd35d855c0738f 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/spinlock.h>
 #include <linux/wait.h>
+#include <linux/sched.h>
 #include <linux/sysdev.h>
 #include <asm/cpu/dma.h>
 
index a0e55b09e4fd773b30d9acf30e2e89ed60f72340..aa80930ce8e4ccbc089132c8645309eedd9f7b1e 100644 (file)
@@ -116,13 +116,13 @@ void __raw_readsl(unsigned long addr, void *data, int longlen);
  * redefined by userlevel programs.
  */
 #ifdef __readb
-# define readb(a)      ({ unsigned long r_ = __raw_readb(a); mb(); r_; })
+# define readb(a)      ({ unsigned int r_ = __raw_readb(a); mb(); r_; })
 #endif
 #ifdef __raw_readw
-# define readw(a)      ({ unsigned long r_ = __raw_readw(a); mb(); r_; })
+# define readw(a)      ({ unsigned int r_ = __raw_readw(a); mb(); r_; })
 #endif
 #ifdef __raw_readl
-# define readl(a)      ({ unsigned long r_ = __raw_readl(a); mb(); r_; })
+# define readl(a)      ({ unsigned int r_ = __raw_readl(a); mb(); r_; })
 #endif
 
 #ifdef __raw_writeb
index 71ecddf70db382f7153b6f6888eec216056914b9..caa7b93f1bce4f2276e142fff92b081f92425855 100644 (file)
@@ -15,7 +15,7 @@
 
 #ifdef CONFIG_SMP
 
-#include <asm/spinlock.h>
+#include <linux/spinlock.h>
 #include <asm/atomic.h>
 #include <asm/current.h>
 
index 2586eef07d57214ec977f50b818d61c1c0fff9ed..92f6e2008b2e00963a4fc6a7da2bea95d7b82594 100644 (file)
@@ -11,6 +11,7 @@
 #define __ASM_SH_SPINLOCK_H
 
 #include <asm/atomic.h>
+#include <asm/spinlock_types.h>
 
 /*
  * Your basic SMP spinlocks, allowing only a single CPU anywhere
@@ -42,7 +43,7 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock)
 
 static inline void __raw_spin_unlock(raw_spinlock_t *lock)
 {
-       assert_spin_locked(lock);
+       //assert_spin_locked(lock);
 
        lock->lock = 0;
 }
@@ -88,6 +89,11 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw)
        __raw_spin_unlock(&rw->lock);
 }
 
+static inline int __raw_write_can_lock(raw_rwlock_t *rw)
+{
+       return (atomic_read(&rw->counter) == RW_LOCK_BIAS);
+}
+
 static inline int __raw_read_trylock(raw_rwlock_t *lock)
 {
        atomic_t *count = (atomic_t*)lock;
index 8c41b6c3aac87adc4fbd73d5320b95e7592c6b18..5c58134f2c4e35a31a402f69c3368e2a9033c326 100644 (file)
@@ -9,7 +9,9 @@ typedef struct {
        volatile unsigned long lock;
 } raw_spinlock_t;
 
-#define __SPIN_LOCK_UNLOCKED           { 0 }
+#define __RAW_SPIN_LOCK_UNLOCKED       { 1 }
+
+#include <asm/atomic.h>
 
 typedef struct {
        raw_spinlock_t lock;
index 5cdb1ff0483826494afc24786bb17307c22a375b..4a43075a0619c5b5ccca6bdb4fc2516b39ed269e 100644 (file)
@@ -1097,6 +1097,80 @@ extern unsigned long sun4v_mach_set_soft_state(unsigned long soft_state,
  */
 #define HV_FAST_MACH_GET_SOFT_STATE    0x71
 
+/* svc_send()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_SVC_SEND
+ * ARG0:       service ID
+ * ARG1:       buffer real address
+ * ARG2:       buffer size
+ * RET0:       STATUS
+ * RET1:       sent_bytes
+ *
+ * Be careful, all output registers are clobbered by this operation,
+ * so for example it is not possible to save away a value in %o4
+ * across the trap.
+ */
+#define HV_FAST_SVC_SEND               0x80
+
+/* svc_recv()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_SVC_RECV
+ * ARG0:       service ID
+ * ARG1:       buffer real address
+ * ARG2:       buffer size
+ * RET0:       STATUS
+ * RET1:       recv_bytes
+ *
+ * Be careful, all output registers are clobbered by this operation,
+ * so for example it is not possible to save away a value in %o4
+ * across the trap.
+ */
+#define HV_FAST_SVC_RECV               0x81
+
+/* svc_getstatus()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_SVC_GETSTATUS
+ * ARG0:       service ID
+ * RET0:       STATUS
+ * RET1:       status bits
+ */
+#define HV_FAST_SVC_GETSTATUS          0x82
+
+/* svc_setstatus()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_SVC_SETSTATUS
+ * ARG0:       service ID
+ * ARG1:       bits to set
+ * RET0:       STATUS
+ */
+#define HV_FAST_SVC_SETSTATUS          0x83
+
+/* svc_clrstatus()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_SVC_CLRSTATUS
+ * ARG0:       service ID
+ * ARG1:       bits to clear
+ * RET0:       STATUS
+ */
+#define HV_FAST_SVC_CLRSTATUS          0x84
+
+#ifndef __ASSEMBLY__
+extern unsigned long sun4v_svc_send(unsigned long svc_id,
+                                   unsigned long buffer,
+                                   unsigned long buffer_size,
+                                   unsigned long *sent_bytes);
+extern unsigned long sun4v_svc_recv(unsigned long svc_id,
+                                   unsigned long buffer,
+                                   unsigned long buffer_size,
+                                   unsigned long *recv_bytes);
+extern unsigned long sun4v_svc_getstatus(unsigned long svc_id,
+                                        unsigned long *status_bits);
+extern unsigned long sun4v_svc_setstatus(unsigned long svc_id,
+                                        unsigned long status_bits);
+extern unsigned long sun4v_svc_clrstatus(unsigned long svc_id,
+                                        unsigned long status_bits);
+#endif
+
 /* Trap trace services.
  *
  * The hypervisor provides a trap tracing capability for privileged
@@ -2724,6 +2798,100 @@ struct hv_mmu_statistics {
  */
 #define HV_FAST_MMUSTAT_INFO           0x103
 
+/* NCS crypto services  */
+
+/* ncs_request() sub-function numbers */
+#define HV_NCS_QCONF                   0x01
+#define HV_NCS_QTAIL_UPDATE            0x02
+
+#ifndef __ASSEMBLY__
+struct hv_ncs_queue_entry {
+       /* MAU Control Register */
+       unsigned long   mau_control;
+#define MAU_CONTROL_INV_PARITY 0x0000000000002000
+#define MAU_CONTROL_STRAND     0x0000000000001800
+#define MAU_CONTROL_BUSY       0x0000000000000400
+#define MAU_CONTROL_INT                0x0000000000000200
+#define MAU_CONTROL_OP         0x00000000000001c0
+#define MAU_CONTROL_OP_SHIFT   6
+#define MAU_OP_LOAD_MA_MEMORY  0x0
+#define MAU_OP_STORE_MA_MEMORY 0x1
+#define MAU_OP_MODULAR_MULT    0x2
+#define MAU_OP_MODULAR_REDUCE  0x3
+#define MAU_OP_MODULAR_EXP_LOOP        0x4
+#define MAU_CONTROL_LEN                0x000000000000003f
+#define MAU_CONTROL_LEN_SHIFT  0
+
+       /* Real address of bytes to load or store bytes
+        * into/out-of the MAU.
+        */
+       unsigned long   mau_mpa;
+
+       /* Modular Arithmetic MA Offset Register.  */
+       unsigned long   mau_ma;
+
+       /* Modular Arithmetic N Prime Register.  */
+       unsigned long   mau_np;
+};
+
+struct hv_ncs_qconf_arg {
+       unsigned long   mid;      /* MAU ID, 1 per core on Niagara */
+       unsigned long   base;     /* Real address base of queue */
+       unsigned long   end;      /* Real address end of queue */
+       unsigned long   num_ents; /* Number of entries in queue */
+};
+
+struct hv_ncs_qtail_update_arg {
+       unsigned long   mid;      /* MAU ID, 1 per core on Niagara */
+       unsigned long   tail;     /* New tail index to use */
+       unsigned long   syncflag; /* only SYNCFLAG_SYNC is implemented */
+#define HV_NCS_SYNCFLAG_SYNC   0x00
+#define HV_NCS_SYNCFLAG_ASYNC  0x01
+};
+#endif
+
+/* ncs_request()
+ * TRAP:       HV_FAST_TRAP
+ * FUNCTION:   HV_FAST_NCS_REQUEST
+ * ARG0:       NCS sub-function
+ * ARG1:       sub-function argument real address
+ * ARG2:       size in bytes of sub-function argument
+ * RET0:       status
+ *
+ * The MAU chip of the Niagara processor is not directly accessible
+ * to privileged code, instead it is programmed indirectly via this
+ * hypervisor API.
+ *
+ * The interfaces defines a queue of MAU operations to perform.
+ * Privileged code registers a queue with the hypervisor by invoking
+ * this HVAPI with the HV_NCS_QCONF sub-function, which defines the
+ * base, end, and number of entries of the queue.  Each queue entry
+ * contains a MAU register struct block.
+ *
+ * The privileged code then proceeds to add entries to the queue and
+ * then invoke the HV_NCS_QTAIL_UPDATE sub-function.  Since only
+ * synchronous operations are supported by the current hypervisor,
+ * HV_NCS_QTAIL_UPDATE will run all the pending queue entries to
+ * completion and return HV_EOK, or return an error code.
+ *
+ * The real address of the sub-function argument must be aligned on at
+ * least an 8-byte boundary.
+ *
+ * The tail argument of HV_NCS_QTAIL_UPDATE is an index, not a byte
+ * offset, into the queue and must be less than or equal the 'num_ents'
+ * argument given in the HV_NCS_QCONF call.
+ */
+#define HV_FAST_NCS_REQUEST            0x110
+
+#ifndef __ASSEMBLY__
+extern unsigned long sun4v_ncs_request(unsigned long request,
+                                      unsigned long arg_ra,
+                                      unsigned long arg_size);
+#endif
+
+#define HV_FAST_FIRE_GET_PERFREG       0x120
+#define HV_FAST_FIRE_SET_PERFREG       0x121
+
 /* Function numbers for HV_CORE_TRAP.  */
 #define HV_CORE_SET_VER                        0x00
 #define HV_CORE_PUTCHAR                        0x01
index e1013156c25ed21214223950c60b9bd5a253df80..f317c270d4bfe9acbefdf3a567f8313480ad4e0e 100644 (file)
@@ -62,6 +62,8 @@ header-y += fadvise.h
 header-y += fd.h
 header-y += fdreg.h
 header-y += fib_rules.h
+header-y += firewire-cdev.h
+header-y += firewire-constants.h
 header-y += fuse.h
 header-y += genetlink.h
 header-y += gen_stats.h
index 0365ec9fc0c9248422801fe71b232d1188a12972..c83534ee1e796c46b2cc47c129ad3924cedbeb20 100644 (file)
@@ -59,6 +59,7 @@ extern void *__alloc_bootmem_core(struct bootmem_data *bdata,
                                  unsigned long align,
                                  unsigned long goal,
                                  unsigned long limit);
+extern void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size);
 
 #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE
 extern void reserve_bootmem(unsigned long addr, unsigned long size);
index d90b80f9b28c7c0402b71a8fa19b2cc8d9e5efd8..46685832ed99106bc6e4084f739abadceae0d549 100644 (file)
@@ -5,7 +5,12 @@
 
 #ifdef __KERNEL__
 
-/* Should never be seen by user programs */
+/*
+ * These should never be seen by user programs.  To return one of ERESTART*
+ * codes, signal_pending() MUST be set.  Note that ptrace can observe these
+ * at syscall exit tracing, but they will never be left for the debugged user
+ * process to see.
+ */
 #define ERESTARTSYS    512
 #define ERESTARTNOINTR 513
 #define ERESTARTNOHAND 514     /* restart if no handler.. */
index 54c576d414c32b83d993942188e66b4171962f85..de1f9f78625a3279bf5ddb580d57cc1003eef152 100644 (file)
@@ -32,9 +32,9 @@
 /*
  * Define EXT4_RESERVATION to reserve data blocks for expanding files
  */
-#define EXT4_DEFAULT_RESERVE_BLOCKS     8
+#define EXT4_DEFAULT_RESERVE_BLOCKS    8
 /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
-#define EXT4_MAX_RESERVE_BLOCKS         1027
+#define EXT4_MAX_RESERVE_BLOCKS                1027
 #define EXT4_RESERVE_WINDOW_NOT_ALLOCATED 0
 /*
  * Always enable hashed directories
@@ -204,12 +204,12 @@ struct ext4_group_desc
 
 /* Used to pass group descriptor data when online resize is done */
 struct ext4_new_group_input {
-       __u32 group;            /* Group number for this data */
-       __u64 block_bitmap;     /* Absolute block number of block bitmap */
-       __u64 inode_bitmap;     /* Absolute block number of inode bitmap */
-       __u64 inode_table;      /* Absolute block number of inode table start */
-       __u32 blocks_count;     /* Total number of blocks in this group */
-       __u16 reserved_blocks;  /* Number of reserved blocks in this group */
+       __u32 group;            /* Group number for this data */
+       __u64 block_bitmap;     /* Absolute block number of block bitmap */
+       __u64 inode_bitmap;     /* Absolute block number of inode bitmap */
+       __u64 inode_table;      /* Absolute block number of inode table start */
+       __u32 blocks_count;     /* Total number of blocks in this group */
+       __u16 reserved_blocks;  /* Number of reserved blocks in this group */
        __u16 unused;
 };
 
@@ -310,7 +310,7 @@ struct ext4_inode {
                        __u8    l_i_frag;       /* Fragment number */
                        __u8    l_i_fsize;      /* Fragment size */
                        __le16  l_i_file_acl_high;
-                       __le16  l_i_uid_high;   /* these 2 fields    */
+                       __le16  l_i_uid_high;   /* these 2 fields */
                        __le16  l_i_gid_high;   /* were reserved2[0] */
                        __u32   l_i_reserved2;
                } linux2;
@@ -513,7 +513,14 @@ struct ext4_super_block {
 /*150*/        __le32  s_blocks_count_hi;      /* Blocks count */
        __le32  s_r_blocks_count_hi;    /* Reserved blocks count */
        __le32  s_free_blocks_count_hi; /* Free blocks count */
-       __u32   s_reserved[169];        /* Padding to the end of the block */
+       __u16   s_min_extra_isize;      /* All inodes have at least # bytes */
+       __u16   s_want_extra_isize;     /* New inodes should reserve # bytes */
+       __u32   s_flags;                /* Miscellaneous flags */
+       __u16   s_raid_stride;          /* RAID stride */
+       __u16   s_mmp_interval;         /* # seconds to wait in MMP checking */
+       __u64   s_mmp_block;            /* Block for multi-mount protection */
+       __u32   s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
+       __u32   s_reserved[163];        /* Padding to the end of the block */
 };
 
 #ifdef __KERNEL__
@@ -780,9 +787,9 @@ void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
  * Ok, these declarations are also in <linux/kernel.h> but none of the
  * ext4 source programs needs to include it so they are duplicated here.
  */
-# define NORET_TYPE    /**/
-# define ATTRIB_NORET  __attribute__((noreturn))
-# define NORET_AND     noreturn,
+# define NORET_TYPE    /**/
+# define ATTRIB_NORET  __attribute__((noreturn))
+# define NORET_AND     noreturn,
 
 /* balloc.c */
 extern unsigned int ext4_block_group(struct super_block *sb,
index 7eb1d73fc5d1634ee535f777d7d5576b784e9180..acfe59740b032d1a5adcfebaa69ca491c048cafa 100644 (file)
@@ -151,8 +151,8 @@ typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *,
        ((struct ext4_extent_idx *) (((char *) (__hdr__)) +     \
                                     sizeof(struct ext4_extent_header)))
 #define EXT_HAS_FREE_INDEX(__path__) \
-        (le16_to_cpu((__path__)->p_hdr->eh_entries) \
-                                    < le16_to_cpu((__path__)->p_hdr->eh_max))
+       (le16_to_cpu((__path__)->p_hdr->eh_entries) \
+                                    < le16_to_cpu((__path__)->p_hdr->eh_max))
 #define EXT_LAST_EXTENT(__hdr__) \
        (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
 #define EXT_LAST_INDEX(__hdr__) \
@@ -190,6 +190,7 @@ ext4_ext_invalidate_cache(struct inode *inode)
 
 extern int ext4_extent_tree_init(handle_t *, struct inode *);
 extern int ext4_ext_calc_credits_for_insert(struct inode *, struct ext4_ext_path *);
+extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *);
 extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *);
 extern int ext4_ext_walk_space(struct inode *, unsigned long, unsigned long, ext_prepare_callback, void *);
 extern struct ext4_ext_path * ext4_ext_find_extent(struct inode *, int, struct ext4_ext_path *);
index d5b177e5b3958338d13bfc46a9d8fcc1e338a9ee..9de4944069955a46e0183fbfe0a00adf04163270 100644 (file)
@@ -41,14 +41,14 @@ struct ext4_reserve_window_node {
 
 struct ext4_block_alloc_info {
        /* information about reservation window */
-       struct ext4_reserve_window_node rsv_window_node;
+       struct ext4_reserve_window_node rsv_window_node;
        /*
         * was i_next_alloc_block in ext4_inode_info
         * is the logical (file-relative) number of the
         * most-recently-allocated block in this file.
         * We use this for detecting linearly ascending allocation requests.
         */
-       __u32                   last_alloc_logical_block;
+       __u32 last_alloc_logical_block;
        /*
         * Was i_next_alloc_goal in ext4_inode_info
         * is the *physical* companion to i_next_alloc_block.
@@ -56,7 +56,7 @@ struct ext4_block_alloc_info {
         * allocated to this file.  This give us the goal (target) for the next
         * allocation when we detect linearly ascending requests.
         */
-       ext4_fsblk_t            last_alloc_physical_block;
+       ext4_fsblk_t last_alloc_physical_block;
 };
 
 #define rsv_start rsv_window._rsv_start
index c654d0e9ce3313d6f345eeac6ebd72279240d238..66226824ab68b4bd106525c820d8803934c054ed 100644 (file)
@@ -942,6 +942,7 @@ extern int fb_new_modelist(struct fb_info *info);
 
 extern struct fb_info *registered_fb[FB_MAX];
 extern int num_registered_fb;
+extern struct class *fb_class;
 
 static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
                                           u8 *src, u32 s_pitch, u32 height)
index d4455eb2ae3566251c26680cc8394c17441c6c04..efbe1fda1a22f0c769f9e103d39317568d597de2 100644 (file)
@@ -198,13 +198,15 @@ struct fw_cdev_create_iso_context {
        __u32 handle;
 };
 
+#define FW_CDEV_ISO_PAYLOAD_LENGTH(v)  (v)
+#define FW_CDEV_ISO_INTERRUPT          (1 << 16)
+#define FW_CDEV_ISO_SKIP               (1 << 17)
+#define FW_CDEV_ISO_TAG(v)             ((v) << 18)
+#define FW_CDEV_ISO_SY(v)              ((v) << 20)
+#define FW_CDEV_ISO_HEADER_LENGTH(v)   ((v) << 24)
+
 struct fw_cdev_iso_packet {
-       __u16 payload_length;   /* Length of indirect payload. */
-       __u32 interrupt : 1;    /* Generate interrupt on this packet */
-       __u32 skip : 1;         /* Set to not send packet at all. */
-       __u32 tag : 2;
-       __u32 sy : 4;
-       __u32 header_length : 8;        /* Length of immediate header. */
+       __u32 control;
        __u32 header[0];
 };
 
index 09ea01a8a99cf8ac4404bcb811862a66e7a97e83..648bd1f0912d3cbbba77b9276d34309f1f1700d5 100644 (file)
@@ -209,9 +209,8 @@ enum {
        DEVCONF_RTR_PROBE_INTERVAL,
        DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
        DEVCONF_PROXY_NDP,
-       __DEVCONF_OPTIMISTIC_DAD,
-       DEVCONF_ACCEPT_SOURCE_ROUTE,
        DEVCONF_OPTIMISTIC_DAD,
+       DEVCONF_ACCEPT_SOURCE_ROUTE,
        DEVCONF_MAX
 };
 
index f671cd2f133fd55377f925d59ff224b343993dec..3a70f553b28f853bede95f0b0437dfe1a161d88a 100644 (file)
@@ -910,6 +910,17 @@ static inline int netif_rx_reschedule(struct net_device *dev, int undo)
        return 0;
 }
 
+/* same as netif_rx_complete, except that local_irq_save(flags)
+ * has already been issued
+ */
+static inline void __netif_rx_complete(struct net_device *dev)
+{
+       BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state));
+       list_del(&dev->poll_list);
+       smp_mb__before_clear_bit();
+       clear_bit(__LINK_STATE_RX_SCHED, &dev->state);
+}
+
 /* Remove interface from poll list: it must be in the poll list
  * on current cpu. This primitive is called by dev->poll(), when
  * it completes the work. The device cannot be out of poll list at this
@@ -920,10 +931,7 @@ static inline void netif_rx_complete(struct net_device *dev)
        unsigned long flags;
 
        local_irq_save(flags);
-       BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state));
-       list_del(&dev->poll_list);
-       smp_mb__before_clear_bit();
-       clear_bit(__LINK_STATE_RX_SCHED, &dev->state);
+       __netif_rx_complete(dev);
        local_irq_restore(flags);
 }
 
@@ -940,17 +948,6 @@ static inline void netif_poll_enable(struct net_device *dev)
        clear_bit(__LINK_STATE_RX_SCHED, &dev->state);
 }
 
-/* same as netif_rx_complete, except that local_irq_save(flags)
- * has already been issued
- */
-static inline void __netif_rx_complete(struct net_device *dev)
-{
-       BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state));
-       list_del(&dev->poll_list);
-       smp_mb__before_clear_bit();
-       clear_bit(__LINK_STATE_RX_SCHED, &dev->state);
-}
-
 static inline void netif_tx_lock(struct net_device *dev)
 {
        spin_lock(&dev->_xmit_lock);
index 4712e269d8d3cd836d4d084b7f06bb9272bcf1bc..6a115cffea34b51ba2e6aef8e52f2013a6edd97a 100644 (file)
 #define PCI_DEVICE_ID_VIA_P4M890       0x0327
 #define PCI_DEVICE_ID_VIA_VT3324       0x0324
 #define PCI_DEVICE_ID_VIA_VT3336       0x0336
+#define PCI_DEVICE_ID_VIA_VT3351       0x0351
 #define PCI_DEVICE_ID_VIA_8371_0       0x0391
 #define PCI_DEVICE_ID_VIA_8501_0       0x0501
 #define PCI_DEVICE_ID_VIA_82C561       0x0561
 #define PCI_DEVICE_ID_SERVERWORKS_LE     0x0009
 #define PCI_DEVICE_ID_SERVERWORKS_GCNB_LE 0x0017
 #define PCI_DEVICE_ID_SERVERWORKS_EPB    0x0103
+#define PCI_DEVICE_ID_SERVERWORKS_HT1000_PCIX  0x0104
 #define PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE  0x0132
 #define PCI_DEVICE_ID_SERVERWORKS_OSB4   0x0200
 #define PCI_DEVICE_ID_SERVERWORKS_CSB5   0x0201
 #define PCI_DEVICE_ID_INTEL_ICH8_5     0x283e
 #define PCI_DEVICE_ID_INTEL_ICH8_6     0x2850
 #define PCI_DEVICE_ID_INTEL_ICH9_0     0x2910
-#define PCI_DEVICE_ID_INTEL_ICH9_1     0x2911
+#define PCI_DEVICE_ID_INTEL_ICH9_1     0x2917
 #define PCI_DEVICE_ID_INTEL_ICH9_2     0x2912
 #define PCI_DEVICE_ID_INTEL_ICH9_3     0x2913
 #define PCI_DEVICE_ID_INTEL_ICH9_4     0x2914
-#define PCI_DEVICE_ID_INTEL_ICH9_5     0x2915
+#define PCI_DEVICE_ID_INTEL_ICH9_5     0x2919
 #define PCI_DEVICE_ID_INTEL_ICH9_6     0x2930
 #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340
 #define PCI_DEVICE_ID_INTEL_82830_HB   0x3575
index a3ac4c8968312b1173903ccd7caa890c56ae01bc..7f2c99d66e9d697203a72ec4f965459495f4bb63 100644 (file)
 #include <linux/sched.h>
 #include <linux/tty.h>
 #include <linux/mutex.h>
+#include <linux/sysrq.h>
 
 struct uart_port;
 struct uart_info;
index c0398f5a8cb98667d77f979ac863ed2a7822ad10..65f49fd7deff1620c3f6fdc9102c717f8f2dedae 100644 (file)
@@ -62,13 +62,11 @@ struct unix_skb_parms {
 #define UNIXCREDS(skb) (&UNIXCB((skb)).creds)
 #define UNIXSID(skb)   (&UNIXCB((skb)).secid)
 
-#define unix_state_rlock(s)    spin_lock(&unix_sk(s)->lock)
-#define unix_state_runlock(s)  spin_unlock(&unix_sk(s)->lock)
-#define unix_state_wlock(s)    spin_lock(&unix_sk(s)->lock)
-#define unix_state_wlock_nested(s) \
+#define unix_state_lock(s)     spin_lock(&unix_sk(s)->lock)
+#define unix_state_unlock(s)   spin_unlock(&unix_sk(s)->lock)
+#define unix_state_lock_nested(s) \
                                spin_lock_nested(&unix_sk(s)->lock, \
                                SINGLE_DEPTH_NESTING)
-#define unix_state_wunlock(s)  spin_unlock(&unix_sk(s)->lock)
 
 #ifdef __KERNEL__
 /* The AF_UNIX socket */
index 689b886038da88da7b4268c377606a96293932d9..dfeb8b13024f8827febf8cedbcee48666106d4b3 100644 (file)
@@ -218,13 +218,13 @@ struct sock {
        atomic_t                sk_rmem_alloc;
        atomic_t                sk_wmem_alloc;
        atomic_t                sk_omem_alloc;
+       int                     sk_sndbuf;
        struct sk_buff_head     sk_receive_queue;
        struct sk_buff_head     sk_write_queue;
        struct sk_buff_head     sk_async_wait_queue;
        int                     sk_wmem_queued;
        int                     sk_forward_alloc;
        gfp_t                   sk_allocation;
-       int                     sk_sndbuf;
        int                     sk_route_caps;
        int                     sk_gso_type;
        int                     sk_rcvlowat;
index e22b4f0305a339ce402b1e959ee0a64665fe2b1e..a8af9ae0017719bb7071ef5b34faa2c3f751a7b3 100644 (file)
@@ -254,6 +254,12 @@ static inline int between(__u32 seq1, __u32 seq2, __u32 seq3)
        return seq3 - seq2 >= seq1 - seq2;
 }
 
+static inline int tcp_too_many_orphans(struct sock *sk, int num)
+{
+       return (num > sysctl_tcp_max_orphans) ||
+               (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
+                atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]);
+}
 
 extern struct proto tcp_prot;
 
index 39ef925d39dd5dd8dce802e4e35ee668338d7d6c..90185e8b335e61b1baad56a27607e02cdc604601 100644 (file)
@@ -237,7 +237,6 @@ extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
 extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
 extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c);
 extern void km_state_notify(struct xfrm_state *x, struct km_event *c);
-#define XFRM_ACQ_EXPIRES       30
 
 struct xfrm_tmpl;
 extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
index 50ee4fd420fa3b0ec19d7155c9e8e663360253b4..8e5b2f0f594625f5a360489d6558373549b43343 100644 (file)
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated by alsa/ksync script.  */
-#define CONFIG_SND_VERSION "1.0.14rc4"
-#define CONFIG_SND_DATE " (Wed May 16 09:45:46 2007 UTC)"
+#define CONFIG_SND_VERSION "1.0.14"
+#define CONFIG_SND_DATE " (Thu May 31 09:03:25 2007 UTC)"
index 338a9b489fbc34fc2ca2ceeecd19f44f2889dd21..27478948b318968a052e4b9fad9a27dd881ca67f 100644 (file)
@@ -144,20 +144,21 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
        struct timespec ts;
        ktime_t t, *tp = NULL;
        int val2 = 0;
+       int cmd = op & FUTEX_CMD_MASK;
 
-       if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) {
+       if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) {
                if (get_compat_timespec(&ts, utime))
                        return -EFAULT;
                if (!timespec_valid(&ts))
                        return -EINVAL;
 
                t = timespec_to_ktime(ts);
-               if (op == FUTEX_WAIT)
+               if (cmd == FUTEX_WAIT)
                        t = ktime_add(ktime_get(), t);
                tp = &t;
        }
-       if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE
-           || op == FUTEX_CMP_REQUEUE_PI)
+       if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE
+           || cmd == FUTEX_CMP_REQUEUE_PI)
                val2 = (int) (unsigned long) utime;
 
        return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);
index f1bda23140b2a60d0be17fade305d3ec3afae431..fed54418626c10727662a79d0e505ee302e0bcbf 100644 (file)
@@ -257,7 +257,8 @@ const char *kallsyms_lookup(unsigned long addr,
                pos = get_symbol_pos(addr, symbolsize, offset);
                /* Grab name */
                kallsyms_expand_symbol(get_symbol_offset(pos), namebuf);
-               *modname = NULL;
+               if (modname)
+                       *modname = NULL;
                return namebuf;
        }
 
index 868f1bceb07ff60bfb87ec2be8d5729a70ece0bd..321693724ad743a74d81c2b3add00f3d4ee21237 100644 (file)
@@ -117,21 +117,6 @@ static struct entry entries[MAX_ENTRIES];
 
 static atomic_t overflow_count;
 
-static void reset_entries(void)
-{
-       nr_entries = 0;
-       memset(entries, 0, sizeof(entries));
-       atomic_set(&overflow_count, 0);
-}
-
-static struct entry *alloc_entry(void)
-{
-       if (nr_entries >= MAX_ENTRIES)
-               return NULL;
-
-       return entries + nr_entries++;
-}
-
 /*
  * The entries are in a hash-table, for fast lookup:
  */
@@ -149,6 +134,22 @@ static struct entry *alloc_entry(void)
 
 static struct entry *tstat_hash_table[TSTAT_HASH_SIZE] __read_mostly;
 
+static void reset_entries(void)
+{
+       nr_entries = 0;
+       memset(entries, 0, sizeof(entries));
+       memset(tstat_hash_table, 0, sizeof(tstat_hash_table));
+       atomic_set(&overflow_count, 0);
+}
+
+static struct entry *alloc_entry(void)
+{
+       if (nr_entries >= MAX_ENTRIES)
+               return NULL;
+
+       return entries + nr_entries++;
+}
+
 static int match_entries(struct entry *entry1, struct entry *entry2)
 {
        return entry1->timer       == entry2->timer       &&
@@ -202,12 +203,15 @@ static struct entry *tstat_lookup(struct entry *entry, char *comm)
        if (curr) {
                *curr = *entry;
                curr->count = 0;
+               curr->next = NULL;
                memcpy(curr->comm, comm, TASK_COMM_LEN);
+
+               smp_mb(); /* Ensure that curr is initialized before insert */
+
                if (prev)
                        prev->next = curr;
                else
                        *head = curr;
-               curr->next = NULL;
        }
  out_unlock:
        spin_unlock(&table_lock);
@@ -232,10 +236,15 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
        /*
         * It doesnt matter which lock we take:
         */
-       spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id());
+       spinlock_t *lock;
        struct entry *entry, input;
        unsigned long flags;
 
+       if (likely(!active))
+               return;
+
+       lock = &per_cpu(lookup_lock, raw_smp_processor_id());
+
        input.timer = timer;
        input.start_func = startf;
        input.expire_func = timerf;
@@ -360,6 +369,7 @@ static ssize_t tstats_write(struct file *file, const char __user *buf,
                if (!active) {
                        reset_entries();
                        time_start = ktime_get();
+                       smp_mb();
                        active = 1;
                }
                break;
index 1ba77ca7d1658e18080bad7c714974ad01b6f5ad..da95e10cfd7094e8996ab08bb38c1f1bd5d4d6f9 100644 (file)
@@ -126,7 +126,10 @@ config TIMER_STATS
          reprogrammed. The statistics can be read from /proc/timer_stats.
          The statistics collection is started by writing 1 to /proc/timer_stats,
          writing 0 stops it. This feature is useful to collect information
-         about timer usage patterns in kernel and userspace.
+         about timer usage patterns in kernel and userspace. This feature
+         is lightweight if enabled in the kernel config but not activated
+         (it defaults to deactivated on bootup and will only be activated
+         if some application like powertop activates it explicitly).
 
 config DEBUG_SLAB
        bool "Debug slab memory allocations"
index 84279127fcd3ab935f922b4c7e1156bb205d9964..df9d554bea3081ec75b45e828326e015b62c0338 100644 (file)
@@ -65,7 +65,7 @@ static int __add_zone(struct zone *zone, unsigned long phys_start_pfn)
        int zone_type;
 
        zone_type = zone - pgdat->node_zones;
-       if (!populated_zone(zone)) {
+       if (!zone->wait_table) {
                int ret = 0;
                ret = init_currently_empty_zone(zone, phys_start_pfn,
                                                nr_pages, MEMMAP_HOTPLUG);
index d8970623c566ba8066831a67c8d3a29c57b4eac4..bd8e33582d25555af55c93d258a842c173a8072c 100644 (file)
@@ -2689,7 +2689,7 @@ static void __init_refok alloc_node_mem_map(struct pglist_data *pgdat)
                        map = alloc_bootmem_node(pgdat, size);
                pgdat->node_mem_map = map + (pgdat->node_start_pfn - start);
        }
-#ifdef CONFIG_FLATMEM
+#ifndef CONFIG_NEED_MULTIPLE_NODES
        /*
         * With no DISCONTIG, the global mem_map is just set as node 0's
         */
index 3e5aefcb4075d9e474b55e2ad124e8601f53cd17..51663a3c3c243c1afeaba27e21b7333808bc1cff 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2435,6 +2435,7 @@ void __init kmem_cache_init(void)
         */
        create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node",
                sizeof(struct kmem_cache_node), GFP_KERNEL);
+       kmalloc_caches[0].refcount = -1;
 #endif
 
        /* Able to allocate the per node structures */
@@ -2482,6 +2483,12 @@ static int slab_unmergeable(struct kmem_cache *s)
        if (s->ctor)
                return 1;
 
+       /*
+        * We may have set a slab to be unmergeable during bootstrap.
+        */
+       if (s->refcount < 0)
+               return 1;
+
        return 0;
 }
 
@@ -2600,6 +2607,19 @@ static void for_all_slabs(void (*func)(struct kmem_cache *, int), int cpu)
        up_read(&slub_lock);
 }
 
+/*
+ * Version of __flush_cpu_slab for the case that interrupts
+ * are enabled.
+ */
+static void cpu_slab_flush(struct kmem_cache *s, int cpu)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       __flush_cpu_slab(s, cpu);
+       local_irq_restore(flags);
+}
+
 /*
  * Use the cpu notifier to insure that the cpu slabs are flushed when
  * necessary.
@@ -2614,7 +2634,7 @@ static int __cpuinit slab_cpuup_callback(struct notifier_block *nfb,
        case CPU_UP_CANCELED_FROZEN:
        case CPU_DEAD:
        case CPU_DEAD_FROZEN:
-               for_all_slabs(__flush_cpu_slab, cpu);
+               for_all_slabs(cpu_slab_flush, cpu);
                break;
        default:
                break;
index 1302f8348d51c8dbc10d104c333eeea3e01a6f1a..545e4d3afcdff14877204b270bf6e671c33d5509 100644 (file)
@@ -209,6 +209,12 @@ static int __meminit sparse_init_one_section(struct mem_section *ms,
        return 1;
 }
 
+__attribute__((weak))
+void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size)
+{
+       return NULL;
+}
+
 static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum)
 {
        struct page *map;
@@ -219,6 +225,11 @@ static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum)
        if (map)
                return map;
 
+       map = alloc_bootmem_high_node(NODE_DATA(nid),
+                       sizeof(struct page) * PAGES_PER_SECTION);
+       if (map)
+               return map;
+
        map = alloc_bootmem_node(NODE_DATA(nid),
                        sizeof(struct page) * PAGES_PER_SECTION);
        if (map)
index bd93c45778d4eaf2d9e3534620da43a088217b10..de78c9dd713bbfb0bb0942bea0f98bd5ffb6179a 100644 (file)
@@ -240,10 +240,8 @@ static int unregister_vlan_dev(struct net_device *real_dev,
                         * interlock with HW accelerating devices or SW vlan
                         * input packet processing.
                         */
-                       if (real_dev->features &
-                           (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER)) {
+                       if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
                                real_dev->vlan_rx_kill_vid(real_dev, vlan_id);
-                       }
 
                        vlan_group_set_device(grp, vlan_id, NULL);
                        synchronize_net();
@@ -409,16 +407,14 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
        }
 
        if ((real_dev->features & NETIF_F_HW_VLAN_RX) &&
-           (real_dev->vlan_rx_register == NULL ||
-            real_dev->vlan_rx_kill_vid == NULL)) {
+           !real_dev->vlan_rx_register) {
                printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
                        __FUNCTION__, real_dev->name);
                goto out_put_dev;
        }
 
        if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) &&
-           (real_dev->vlan_rx_add_vid == NULL ||
-            real_dev->vlan_rx_kill_vid == NULL)) {
+           (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) {
                printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n",
                        __FUNCTION__, real_dev->name);
                goto out_put_dev;
@@ -740,8 +736,7 @@ static int vlan_ioctl_handler(void __user *arg)
        case SET_VLAN_NAME_TYPE_CMD:
                if (!capable(CAP_NET_ADMIN))
                        return -EPERM;
-               if ((args.u.name_type >= 0) &&
-                   (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) {
+               if (args.u.name_type < VLAN_NAME_TYPE_HIGHEST) {
                        vlan_name_type = args.u.name_type;
                        err = 0;
                } else {
index 91b017016d5bcbdd240770f9528706439b91a5f7..3fc697293819524823ee8bb4d9918493f12db6e0 100644 (file)
@@ -121,6 +121,7 @@ void br_fdb_cleanup(unsigned long _data)
 {
        struct net_bridge *br = (struct net_bridge *)_data;
        unsigned long delay = hold_time(br);
+       unsigned long next_timer = jiffies + br->forward_delay;
        int i;
 
        spin_lock_bh(&br->hash_lock);
@@ -129,14 +130,21 @@ void br_fdb_cleanup(unsigned long _data)
                struct hlist_node *h, *n;
 
                hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) {
-                       if (!f->is_static &&
-                           time_before_eq(f->ageing_timer + delay, jiffies))
+                       unsigned long this_timer;
+                       if (f->is_static)
+                               continue;
+                       this_timer = f->ageing_timer + delay;
+                       if (time_before_eq(this_timer, jiffies))
                                fdb_delete(f);
+                       else if (this_timer < next_timer)
+                               next_timer = this_timer;
                }
        }
        spin_unlock_bh(&br->hash_lock);
 
-       mod_timer(&br->gc_timer, jiffies + HZ/10);
+       /* Add HZ/4 to ensure we round the jiffies upwards to be after the next
+        * timer, otherwise we might round down and will have no-op run. */
+       mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4));
 }
 
 /* Completely flush all dynamic entries in forwarding database.*/
index 0e035d6162cc840e1e7a71592f79894e0cb5b316..e38034aa56f5a2f6d1476f38cf3e931a18513fe0 100644 (file)
@@ -178,7 +178,8 @@ void br_transmit_config(struct net_bridge_port *p)
                br_send_config_bpdu(p, &bpdu);
                p->topology_change_ack = 0;
                p->config_pending = 0;
-               mod_timer(&p->hold_timer, jiffies + BR_HOLD_TIME);
+               mod_timer(&p->hold_timer,
+                         round_jiffies(jiffies + BR_HOLD_TIME));
        }
 }
 
index 24e0ca4a3131948af3cf2d59c956ccf9f852fc96..77f5255e691569a48766cce3ce109a4aec17c0df 100644 (file)
@@ -42,7 +42,7 @@ static void br_hello_timer_expired(unsigned long arg)
        if (br->dev->flags & IFF_UP) {
                br_config_bpdu_generation(br);
 
-               mod_timer(&br->hello_timer, jiffies + br->hello_time);
+               mod_timer(&br->hello_timer, round_jiffies(jiffies + br->hello_time));
        }
        spin_unlock(&br->lock);
 }
index 7e51d3a5e4f6c5af74f0e782e28acdcdb08c4d57..c14ce0198d25d7be42762ee3dae5df76ba9ec8d6 100644 (file)
@@ -998,7 +998,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
        __sk_dst_set(sk, dst);
        sk->sk_route_caps = dst->dev->features;
        if (sk->sk_route_caps & NETIF_F_GSO)
-               sk->sk_route_caps |= NETIF_F_GSO_MASK;
+               sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE;
        if (sk_can_gso(sk)) {
                if (dst->header_len)
                        sk->sk_route_caps &= ~NETIF_F_GSO_MASK;
index f34aca041a25b8b9aacfc18b17717f3a1bb15c63..6d5ea97620408a41e4b05a71d4e6b159c2228354 100644 (file)
@@ -25,6 +25,7 @@ extern int sysctl_core_destroy_delay;
 extern u32 sysctl_xfrm_aevent_etime;
 extern u32 sysctl_xfrm_aevent_rseqth;
 extern int sysctl_xfrm_larval_drop;
+extern u32 sysctl_xfrm_acq_expires;
 #endif
 
 ctl_table core_table[] = {
@@ -127,6 +128,14 @@ ctl_table core_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "xfrm_acq_expires",
+               .data           = &sysctl_xfrm_acq_expires,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
 #endif /* CONFIG_XFRM */
 #endif /* CONFIG_NET */
        {
index adecfd281ae98d6b8239eada1b26de0dbe459890..2030bb8c2d30c4c27fccf960f87acd51fc5fac54 100644 (file)
@@ -139,16 +139,16 @@ int in4_pton(const char *src, int srclen,
        while(1) {
                int c;
                c = xdigit2bin(srclen > 0 ? *s : '\0', delim);
-               if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM))) {
+               if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK))) {
                        goto out;
                }
-               if (c & (IN6PTON_DOT | IN6PTON_DELIM)) {
+               if (c & (IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK)) {
                        if (w == 0)
                                goto out;
                        *d++ = w & 0xff;
                        w = 0;
                        i++;
-                       if (c & IN6PTON_DELIM) {
+                       if (c & (IN6PTON_DELIM | IN6PTON_COLON_MASK)) {
                                if (i != 4)
                                        goto out;
                                break;
index 1f5e3ba62065e76bf8c48b39b7a7a6a174800919..43a3adb027e7593ba9b15b366f3ae7d1b7843325 100644 (file)
@@ -128,7 +128,7 @@ static ssize_t dccpprobe_read(struct file *file, char __user *buf,
        int error = 0, cnt = 0;
        unsigned char *tbuf;
 
-       if (!buf || len < 0)
+       if (!buf)
                return -EINVAL;
 
        if (len == 0)
index 7ec6610841bab68435cdba151ab2102ef15e1c53..17ad278696edfada4765d6ae540903c1ef2a565a 100644 (file)
@@ -140,7 +140,7 @@ struct net_device *alloc_ieee80211(int sizeof_priv)
 
        dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
        if (!dev) {
-               IEEE80211_ERROR("Unable to network device.\n");
+               IEEE80211_ERROR("Unable to allocate network device.\n");
                goto failed;
        }
        ieee = netdev_priv(dev);
index e9cdc6615ddc7483447d34907205c907a39782a0..c308756c2f9dae7edb6f65d90e98dfbe41fded7a 100644 (file)
@@ -33,7 +33,10 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv)
        struct ieee80211softmac_device *softmac;
        struct net_device *dev;
 
-       dev = alloc_ieee80211(sizeof(struct ieee80211softmac_device) + sizeof_priv);
+       dev = alloc_ieee80211(sizeof(*softmac) + sizeof_priv);
+       if (!dev)
+               return NULL;
+
        softmac = ieee80211_priv(dev);
        softmac->dev = dev;
        softmac->ieee = netdev_priv(dev);
index dd02a45d0f675945c8c85799ac99b4fbea4c9c04..0301dd468cf47638fdd7d434c35ac44a7b96cae6 100644 (file)
@@ -50,8 +50,12 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                               RT_CONN_FLAGS(sk), oif,
                               sk->sk_protocol,
                               inet->sport, usin->sin_port, sk, 1);
-       if (err)
+       if (err) {
+               if (err == -ENETUNREACH)
+                       IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
                return err;
+       }
+
        if ((rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST)) {
                ip_rt_put(rt);
                return -EACCES;
index 837f2957fa83d702a948dafb24b5cac1661a80ec..9ad1f6252a9729fd5bc9e9ec1af69e690ad75e3e 100644 (file)
@@ -250,8 +250,6 @@ e_inval:
        return -EINVAL;
 }
 
-#ifndef CONFIG_IP_NOSIOCRT
-
 static inline __be32 sk_extract_addr(struct sockaddr *addr)
 {
        return ((struct sockaddr_in *) addr)->sin_addr.s_addr;
@@ -443,15 +441,6 @@ int ip_rt_ioctl(unsigned int cmd, void __user *arg)
        return -EINVAL;
 }
 
-#else
-
-int ip_rt_ioctl(unsigned int cmd, void *arg)
-{
-       return -EINVAL;
-}
-
-#endif
-
 struct nla_policy rtm_ipv4_policy[RTA_MAX+1] __read_mostly = {
        [RTA_DST]               = { .type = NLA_U32 },
        [RTA_SRC]               = { .type = NLA_U32 },
index e238b17f554cc150e36e1430f238af194f9e9b55..02a899bec1969fcb6511722d41fe20009b6f2dbc 100644 (file)
@@ -514,12 +514,15 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info)
 
        saddr = iph->daddr;
        if (!(rt->rt_flags & RTCF_LOCAL)) {
-               /* This is broken, skb_in->dev points to the outgoing device
-                * after the packet passes through ip_output().
-                */
-               if (skb_in->dev && sysctl_icmp_errors_use_inbound_ifaddr)
-                       saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK);
-               else
+               struct net_device *dev = NULL;
+
+               if (rt->fl.iif && sysctl_icmp_errors_use_inbound_ifaddr)
+                       dev = dev_get_by_index(rt->fl.iif);
+
+               if (dev) {
+                       saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK);
+                       dev_put(dev);
+               } else
                        saddr = 0;
        }
 
index 43fb1600f1f03904846bc3d53a98c73e0f729a61..fbe7714f21d08593beecb3945f2f85848b506be8 100644 (file)
@@ -31,10 +31,8 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg);
 
 /*
  * This array holds the first and last local port number.
- * For high-usage systems, use sysctl to change this to
- * 32768-61000
  */
-int sysctl_local_port_range[2] = { 1024, 4999 };
+int sysctl_local_port_range[2] = { 32768, 61000 };
 
 int inet_csk_bind_conflict(const struct sock *sk,
                           const struct inet_bind_bucket *tb)
index bd4c295f5d796347c2ba705710c417a50d6002fe..cd3c7e95de9e07296de8583fdc5b3df73aa45cdf 100644 (file)
@@ -1674,9 +1674,8 @@ adjudge_to_death:
        }
        if (sk->sk_state != TCP_CLOSE) {
                sk_stream_mem_reclaim(sk);
-               if (atomic_read(sk->sk_prot->orphan_count) > sysctl_tcp_max_orphans ||
-                   (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
-                    atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) {
+               if (tcp_too_many_orphans(sk,
+                               atomic_read(sk->sk_prot->orphan_count))) {
                        if (net_ratelimit())
                                printk(KERN_INFO "TCP: too many of orphaned "
                                       "sockets\n");
@@ -2465,13 +2464,10 @@ void __init tcp_init(void)
                        order++)
                ;
        if (order >= 4) {
-               sysctl_local_port_range[0] = 32768;
-               sysctl_local_port_range[1] = 61000;
                tcp_death_row.sysctl_max_tw_buckets = 180000;
                sysctl_tcp_max_orphans = 4096 << (order - 4);
                sysctl_max_syn_backlog = 1024;
        } else if (order < 3) {
-               sysctl_local_port_range[0] = 1024 * (3 - order);
                tcp_death_row.sysctl_max_tw_buckets >>= (3 - order);
                sysctl_tcp_max_orphans >>= (3 - order);
                sysctl_max_syn_backlog = 128;
index 38cb25b48bf3b9961e1ba737db9ea194c448c3b1..74683d81c3f18f8c3450b3100ff89373179ea101 100644 (file)
@@ -2407,8 +2407,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
        struct sk_buff *skb;
        __u32 now = tcp_time_stamp;
        int acked = 0;
+       int prior_packets = tp->packets_out;
        __s32 seq_rtt = -1;
-       u32 pkts_acked = 0;
        ktime_t last_ackt = ktime_set(0,0);
 
        while ((skb = tcp_write_queue_head(sk)) &&
@@ -2437,7 +2437,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
                 */
                if (!(scb->flags & TCPCB_FLAG_SYN)) {
                        acked |= FLAG_DATA_ACKED;
-                       ++pkts_acked;
                } else {
                        acked |= FLAG_SYN_ACKED;
                        tp->retrans_stamp = 0;
@@ -2481,6 +2480,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
        }
 
        if (acked&FLAG_ACKED) {
+               u32 pkts_acked = prior_packets - tp->packets_out;
                const struct tcp_congestion_ops *ca_ops
                        = inet_csk(sk)->icsk_ca_ops;
 
index 5a3e7f839fc52f838122a88a40209566ce2e3ab7..47c61055eb601ae73a68b899fdccf5bb8e1921b2 100644 (file)
@@ -192,8 +192,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                               RT_CONN_FLAGS(sk), sk->sk_bound_dev_if,
                               IPPROTO_TCP,
                               inet->sport, usin->sin_port, sk, 1);
-       if (tmp < 0)
+       if (tmp < 0) {
+               if (tmp == -ENETUNREACH)
+                       IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
                return tmp;
+       }
 
        if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) {
                ip_rt_put(rt);
index 3938d5dbdf208292157573aa6448e088505a3145..760165a0800c317884015f7997b3106aa7ad8562 100644 (file)
@@ -80,7 +80,8 @@ static void printl(const char *fmt, ...)
 
        kfifo_put(tcpw.fifo, tbuf, len);
        wake_up(&tcpw.wait);
-}
+} __attribute__ ((format (printf, 1, 2)));
+
 
 /*
  * Hook inserted to be called before each receive packet.
@@ -95,7 +96,7 @@ static int jtcp_rcv_established(struct sock *sk, struct sk_buff *skb,
        /* Only update if port matches */
        if ((port == 0 || ntohs(inet->dport) == port || ntohs(inet->sport) == port)
            && (full || tp->snd_cwnd != tcpw.lastcwnd)) {
-               printl("%d.%d.%d.%d:%u %d.%d.%d.%d:%u %d %#x %#x %u %u %u\n",
+               printl("%d.%d.%d.%d:%u %d.%d.%d.%d:%u %d %#x %#x %u %u %u %u\n",
                       NIPQUAD(inet->saddr), ntohs(inet->sport),
                       NIPQUAD(inet->daddr), ntohs(inet->dport),
                       skb->len, tp->snd_nxt, tp->snd_una,
index 2ca97b20929d60540529c7af5cc46658ef4b70fb..e61340150ba6c3aacdf9d5012b7e50f382e5be4d 100644 (file)
@@ -78,9 +78,7 @@ static int tcp_out_of_resources(struct sock *sk, int do_reset)
        if (sk->sk_err_soft)
                orphans <<= 1;
 
-       if (orphans >= sysctl_tcp_max_orphans ||
-           (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
-            atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) {
+       if (tcp_too_many_orphans(sk, orphans)) {
                if (net_ratelimit())
                        printk(KERN_INFO "Out of socket memory\n");
 
index 4c7e95fa090d181234e3dbb1a2d1934a259c317f..5da703e699da243afcf6e660d0e6a3df09979981 100644 (file)
@@ -722,8 +722,11 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                                                 .dport = dport } } };
                security_sk_classify_flow(sk, &fl);
                err = ip_route_output_flow(&rt, &fl, sk, 1);
-               if (err)
+               if (err) {
+                       if (err == -ENETUNREACH)
+                               IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES);
                        goto out;
+               }
 
                err = -EACCES;
                if ((rt->rt_flags & RTCF_BROADCAST) &&
index 5ceca951d73f4fc4964d802ce68aac833c463904..fa1902dc81b86e1c20f24451c5bf515567e9015f 100644 (file)
@@ -139,10 +139,8 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
        nf_reset(skb);
 
        if (decaps) {
-               if (!(skb->dev->flags&IFF_LOOPBACK)) {
-                       dst_release(skb->dst);
-                       skb->dst = NULL;
-               }
+               dst_release(skb->dst);
+               skb->dst = NULL;
                netif_rx(skb);
                return 0;
        } else {
index a2f2e6a5ec5d1662e6ba0b372af47059288cebaf..9963700e74c1e6185f31ea807b839a0d67a87081 100644 (file)
@@ -85,6 +85,8 @@ static int xfrm4_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->saddr = x->props.saddr.a4;
        top_iph->daddr = x->id.daddr.a4;
 
+       skb->protocol = htons(ETH_P_IP);
+
        memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
        return 0;
 }
index b696c8401200b64c7775f85c511bad6e026d292b..128f94c79c641e462d62e3a762e92b00ab2fb0dc 100644 (file)
@@ -247,7 +247,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)
        memcpy(tmp_base, top_iph, sizeof(tmp_base));
 
        tmp_ext = NULL;
-       extlen = skb_transport_offset(skb) + sizeof(struct ipv6hdr);
+       extlen = skb_transport_offset(skb) - sizeof(struct ipv6hdr);
        if (extlen) {
                extlen += sizeof(*tmp_ext);
                tmp_ext = kmalloc(extlen, GFP_ATOMIC);
index ca08ee88d07f2913558c0ac331201f7d3a05527b..662a7d9681fdb03b4c2a9c089ec4dffdcfb2f4d2 100644 (file)
@@ -619,14 +619,6 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
 
        ins = &fn->leaf;
 
-       if (fn->fn_flags&RTN_TL_ROOT &&
-           fn->leaf == &ip6_null_entry &&
-           !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ){
-               fn->leaf = rt;
-               rt->u.dst.rt6_next = NULL;
-               goto out;
-       }
-
        for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) {
                /*
                 *      Search for duplicates
@@ -666,7 +658,6 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
         *      insert node
         */
 
-out:
        rt->u.dst.rt6_next = iter;
        *ins = rt;
        rt->rt6i_node = fn;
index 6d2a0820511104994dc90a08b4a14b8b52759741..dc442fb791b0c2c7dcc58a2c8d45eca3dc76ff4a 100644 (file)
@@ -177,8 +177,7 @@ static unsigned int ipv6_confirm(unsigned int hooknum,
 
        protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum,
                                         (*pskb)->len - extoff);
-       if (protoff < 0 || protoff > (*pskb)->len ||
-           pnum == NEXTHDR_FRAGMENT) {
+       if (protoff > (*pskb)->len || pnum == NEXTHDR_FRAGMENT) {
                DEBUGP("proto header not found\n");
                return NF_ACCEPT;
        }
index 0be790d250f9c239f6f1977927fd53b3604537e4..8814b95b232630604eb4e568d7771bcda8e47cb6 100644 (file)
@@ -168,8 +168,7 @@ icmpv6_error_message(struct sk_buff *skb,
                                           skb->len - inip6off
                                                    - sizeof(struct ipv6hdr));
 
-       if ((inprotoff < 0) || (inprotoff > skb->len) ||
-           (inprotonum == NEXTHDR_FRAGMENT)) {
+       if ((inprotoff > skb->len) || (inprotonum == NEXTHDR_FRAGMENT)) {
                DEBUGP("icmpv6_error: Can't get protocol header in ICMPv6 payload.\n");
                return -NF_ACCEPT;
        }
index d7ed8aa56ec18657e79abbf0abe45bbdcd01f878..c858537cec4b0b756ba03907b1ffa7dbcc787793 100644 (file)
@@ -104,10 +104,8 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
        nf_reset(skb);
 
        if (decaps) {
-               if (!(skb->dev->flags&IFF_LOOPBACK)) {
-                       dst_release(skb->dst);
-                       skb->dst = NULL;
-               }
+               dst_release(skb->dst);
+               skb->dst = NULL;
                netif_rx(skb);
                return -1;
        } else {
index a6c0cdf46ad6a3458f9b905cf284529c1371db97..9fc95bc6509f718b675579ba037adfc5cc0a9065 100644 (file)
@@ -80,6 +80,7 @@ static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT);
        ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr);
        ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr);
+       skb->protocol = htons(ETH_P_IPV6);
        return 0;
 }
 
index 6e36df67f8d59b3ecc1c61089249a74454863862..4e84f24fd439852e8473d70147227e82268f4aa0 100644 (file)
@@ -2474,6 +2474,8 @@ static int ieee80211_open(struct net_device *dev)
        if (sdata->type == IEEE80211_IF_TYPE_STA &&
            !local->user_space_mlme)
                netif_carrier_off(dev);
+       else
+               netif_carrier_on(dev);
 
        netif_start_queue(dev);
        return 0;
@@ -3278,8 +3280,10 @@ ieee80211_rx_h_defragment(struct ieee80211_txrx_data *rx)
                        return TXRX_DROP;
                }
        }
-       while ((skb = __skb_dequeue(&entry->skb_list)))
+       while ((skb = __skb_dequeue(&entry->skb_list))) {
                memcpy(skb_put(rx->skb, skb->len), skb->data, skb->len);
+               dev_kfree_skb(skb);
+       }
 
        /* Complete frame has been reassembled - process it now */
        rx->fragmented = 1;
index 3e07e9d6fa426f8dd7184c9ee4244b312ff52f7b..9f30ae4c2ab3e4be6f97f05d816528bb3e411a2c 100644 (file)
@@ -1155,6 +1155,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev,
        if (status_code != WLAN_STATUS_SUCCESS) {
                printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
                       dev->name, status_code);
+               if (status_code == WLAN_STATUS_REASSOC_NO_ASSOC)
+                       ifsta->prev_bssid_set = 0;
                return;
        }
 
@@ -2995,7 +2997,7 @@ struct sta_info * ieee80211_ibss_add_sta(struct net_device *dev,
 {
        struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
        struct sta_info *sta;
-       struct ieee80211_sub_if_data *sdata = NULL;
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
        /* TODO: Could consider removing the least recently used entry and
         * allow new one to be added. */
index 02e401cd683ffbff04dc28403ace1234071990b9..f8b83014cccad9ad56108cd1f6a3dce8b71f2b1d 100644 (file)
 #include <net/inet_common.h>
 #endif
 
-#define CONFIG_SOCK_PACKET     1
-
-/*
-   Proposed replacement for SIOC{ADD,DEL}MULTI and
-   IFF_PROMISC, IFF_ALLMULTI flags.
-
-   It is more expensive, but I believe,
-   it is really correct solution: reentereble, safe and fault tolerant.
-
-   IFF_PROMISC/IFF_ALLMULTI/SIOC{ADD/DEL}MULTI are faked by keeping
-   reference count and global flag, so that real status is
-   (gflag|(count != 0)), so that we can use obsolete faulty interface
-   not harming clever users.
- */
-#define CONFIG_PACKET_MULTICAST        1
-
 /*
    Assumptions:
    - if device has no dev->hard_header routine, it adds and removes ll header
@@ -159,7 +143,6 @@ static atomic_t packet_socks_nr;
 
 /* Private packet socket structures. */
 
-#ifdef CONFIG_PACKET_MULTICAST
 struct packet_mclist
 {
        struct packet_mclist    *next;
@@ -179,7 +162,7 @@ struct packet_mreq_max
        unsigned short  mr_alen;
        unsigned char   mr_address[MAX_ADDR_LEN];
 };
-#endif
+
 #ifdef CONFIG_PACKET_MMAP
 static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing);
 #endif
@@ -205,9 +188,7 @@ struct packet_sock {
                                origdev:1;
        int                     ifindex;        /* bound device         */
        __be16                  num;
-#ifdef CONFIG_PACKET_MULTICAST
        struct packet_mclist    *mclist;
-#endif
 #ifdef CONFIG_PACKET_MMAP
        atomic_t                mapped;
        unsigned int            pg_vec_order;
@@ -263,7 +244,6 @@ static void packet_sock_destruct(struct sock *sk)
 
 static const struct proto_ops packet_ops;
 
-#ifdef CONFIG_SOCK_PACKET
 static const struct proto_ops packet_ops_spkt;
 
 static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,  struct packet_type *pt, struct net_device *orig_dev)
@@ -435,7 +415,6 @@ out_unlock:
                dev_put(dev);
        return err;
 }
-#endif
 
 static inline unsigned int run_filter(struct sk_buff *skb, struct sock *sk,
                                      unsigned int res)
@@ -851,9 +830,7 @@ static int packet_release(struct socket *sock)
                __sock_put(sk);
        }
 
-#ifdef CONFIG_PACKET_MULTICAST
        packet_flush_mclist(sk);
-#endif
 
 #ifdef CONFIG_PACKET_MMAP
        if (po->pg_vec) {
@@ -936,8 +913,6 @@ out_unlock:
  *     Bind a packet socket to a device
  */
 
-#ifdef CONFIG_SOCK_PACKET
-
 static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 {
        struct sock *sk=sock->sk;
@@ -960,7 +935,6 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add
        }
        return err;
 }
-#endif
 
 static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 {
@@ -1012,11 +986,8 @@ static int packet_create(struct socket *sock, int protocol)
 
        if (!capable(CAP_NET_RAW))
                return -EPERM;
-       if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW
-#ifdef CONFIG_SOCK_PACKET
-           && sock->type != SOCK_PACKET
-#endif
-           )
+       if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW &&
+           sock->type != SOCK_PACKET)
                return -ESOCKTNOSUPPORT;
 
        sock->state = SS_UNCONNECTED;
@@ -1027,10 +998,9 @@ static int packet_create(struct socket *sock, int protocol)
                goto out;
 
        sock->ops = &packet_ops;
-#ifdef CONFIG_SOCK_PACKET
        if (sock->type == SOCK_PACKET)
                sock->ops = &packet_ops_spkt;
-#endif
+
        sock_init_data(sock, sk);
 
        po = pkt_sk(sk);
@@ -1046,10 +1016,10 @@ static int packet_create(struct socket *sock, int protocol)
 
        spin_lock_init(&po->bind_lock);
        po->prot_hook.func = packet_rcv;
-#ifdef CONFIG_SOCK_PACKET
+
        if (sock->type == SOCK_PACKET)
                po->prot_hook.func = packet_rcv_spkt;
-#endif
+
        po->prot_hook.af_packet_priv = sk;
 
        if (proto) {
@@ -1169,7 +1139,6 @@ out:
        return err;
 }
 
-#ifdef CONFIG_SOCK_PACKET
 static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
                               int *uaddr_len, int peer)
 {
@@ -1190,7 +1159,6 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
 
        return 0;
 }
-#endif
 
 static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
                          int *uaddr_len, int peer)
@@ -1221,7 +1189,6 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr,
        return 0;
 }
 
-#ifdef CONFIG_PACKET_MULTICAST
 static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int what)
 {
        switch (i->type) {
@@ -1349,7 +1316,6 @@ static void packet_flush_mclist(struct sock *sk)
        }
        rtnl_unlock();
 }
-#endif
 
 static int
 packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen)
@@ -1362,7 +1328,6 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
                return -ENOPROTOOPT;
 
        switch(optname) {
-#ifdef CONFIG_PACKET_MULTICAST
        case PACKET_ADD_MEMBERSHIP:
        case PACKET_DROP_MEMBERSHIP:
        {
@@ -1383,7 +1348,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
                        ret = packet_mc_drop(sk, &mreq);
                return ret;
        }
-#endif
+
 #ifdef CONFIG_PACKET_MMAP
        case PACKET_RX_RING:
        {
@@ -1506,11 +1471,10 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void
 
                switch (msg) {
                case NETDEV_UNREGISTER:
-#ifdef CONFIG_PACKET_MULTICAST
                        if (po->mclist)
                                packet_dev_mclist(dev, po->mclist, -1);
-                       // fallthrough
-#endif
+                       /* fallthrough */
+
                case NETDEV_DOWN:
                        if (dev->ifindex == po->ifindex) {
                                spin_lock(&po->bind_lock);
@@ -1856,7 +1820,6 @@ out:
 #endif
 
 
-#ifdef CONFIG_SOCK_PACKET
 static const struct proto_ops packet_ops_spkt = {
        .family =       PF_PACKET,
        .owner =        THIS_MODULE,
@@ -1877,7 +1840,6 @@ static const struct proto_ops packet_ops_spkt = {
        .mmap =         sock_no_mmap,
        .sendpage =     sock_no_sendpage,
 };
-#endif
 
 static const struct proto_ops packet_ops = {
        .family =       PF_PACKET,
index 45b3cda86a21413e6103c3c18ab9ca0116f407f8..6f8684b5617e5653e2fe5bcfd09aee084c7d9134 100644 (file)
@@ -164,8 +164,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,
                                printk("offset must be on 32 bit boundaries\n");
                                goto bad;
                        }
-                       if (skb->len < 0 ||
-                           (offset > 0 && offset > skb->len)) {
+                       if (offset > 0 && offset > skb->len) {
                                printk("offset %d cant exceed pkt length %d\n",
                                       offset, skb->len);
                                goto bad;
index cbefe225581e0b203d68b087653e81f18972dcd8..f4d34480a093d126061920e6f53e7b4fc8dfe83b 100644 (file)
@@ -224,7 +224,8 @@ void __netdev_watchdog_up(struct net_device *dev)
        if (dev->tx_timeout) {
                if (dev->watchdog_timeo <= 0)
                        dev->watchdog_timeo = 5*HZ;
-               if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo))
+               if (!mod_timer(&dev->watchdog_timer,
+                              round_jiffies(jiffies + dev->watchdog_timeo)))
                        dev_hold(dev);
        }
 }
index e8c0f7435d7f68be0eefd21b1baac4f1a05b1636..80f70aa533867317e5dcbdbadc7333d29c519901 100644 (file)
@@ -77,8 +77,6 @@ static const char *sctp_cid_tbl[SCTP_NUM_BASE_CHUNK_TYPES] = {
 /* Lookup "chunk type" debug name. */
 const char *sctp_cname(const sctp_subtype_t cid)
 {
-       if (cid.chunk < 0)
-               return "illegal chunk id";
        if (cid.chunk <= SCTP_CID_BASE_MAX)
                return sctp_cid_tbl[cid.chunk];
 
@@ -146,8 +144,6 @@ static const char *sctp_primitive_tbl[SCTP_NUM_PRIMITIVE_TYPES] = {
 /* Lookup primitive debug name. */
 const char *sctp_pname(const sctp_subtype_t id)
 {
-       if (id.primitive < 0)
-               return "illegal primitive";
        if (id.primitive <= SCTP_EVENT_PRIMITIVE_MAX)
                return sctp_primitive_tbl[id.primitive];
        return "unknown_primitive";
@@ -161,8 +157,6 @@ static const char *sctp_other_tbl[] = {
 /* Lookup "other" debug name. */
 const char *sctp_oname(const sctp_subtype_t id)
 {
-       if (id.other < 0)
-               return "illegal 'other' event";
        if (id.other <= SCTP_EVENT_OTHER_MAX)
                return sctp_other_tbl[id.other];
        return "unknown 'other' event";
@@ -184,8 +178,6 @@ static const char *sctp_timer_tbl[] = {
 /* Lookup timer debug name. */
 const char *sctp_tname(const sctp_subtype_t id)
 {
-       if (id.timeout < 0)
-               return "illegal 'timer' event";
        if (id.timeout <= SCTP_EVENT_TIMEOUT_MAX)
                return sctp_timer_tbl[id.timeout];
        return "unknown_timer";
index 523071c7902fbb5a163f1418c17e85fcb0d4f503..70a91ece3c49444de91b41b7db7f4b486a16e7de 100644 (file)
@@ -960,7 +960,7 @@ static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
        if (state > SCTP_STATE_MAX)
                return &bug;
 
-       if (cid >= 0 && cid <= SCTP_CID_BASE_MAX)
+       if (cid <= SCTP_CID_BASE_MAX)
                return &chunk_event_table[cid][state];
 
        if (sctp_prsctp_enable) {
index fc12ba51c1fc8223672c744e2c3eb06239741303..87c794d8fa2d55a272934e72330abc346335e5e5 100644 (file)
@@ -174,11 +174,11 @@ static struct sock *unix_peer_get(struct sock *s)
 {
        struct sock *peer;
 
-       unix_state_rlock(s);
+       unix_state_lock(s);
        peer = unix_peer(s);
        if (peer)
                sock_hold(peer);
-       unix_state_runlock(s);
+       unix_state_unlock(s);
        return peer;
 }
 
@@ -369,7 +369,7 @@ static int unix_release_sock (struct sock *sk, int embrion)
        unix_remove_socket(sk);
 
        /* Clear state */
-       unix_state_wlock(sk);
+       unix_state_lock(sk);
        sock_orphan(sk);
        sk->sk_shutdown = SHUTDOWN_MASK;
        dentry       = u->dentry;
@@ -378,7 +378,7 @@ static int unix_release_sock (struct sock *sk, int embrion)
        u->mnt       = NULL;
        state = sk->sk_state;
        sk->sk_state = TCP_CLOSE;
-       unix_state_wunlock(sk);
+       unix_state_unlock(sk);
 
        wake_up_interruptible_all(&u->peer_wait);
 
@@ -386,12 +386,12 @@ static int unix_release_sock (struct sock *sk, int embrion)
 
        if (skpair!=NULL) {
                if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
-                       unix_state_wlock(skpair);
+                       unix_state_lock(skpair);
                        /* No more writes */
                        skpair->sk_shutdown = SHUTDOWN_MASK;
                        if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
                                skpair->sk_err = ECONNRESET;
-                       unix_state_wunlock(skpair);
+                       unix_state_unlock(skpair);
                        skpair->sk_state_change(skpair);
                        read_lock(&skpair->sk_callback_lock);
                        sk_wake_async(skpair,1,POLL_HUP);
@@ -448,7 +448,7 @@ static int unix_listen(struct socket *sock, int backlog)
        err = -EINVAL;
        if (!u->addr)
                goto out;                       /* No listens on an unbound socket */
-       unix_state_wlock(sk);
+       unix_state_lock(sk);
        if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN)
                goto out_unlock;
        if (backlog > sk->sk_max_ack_backlog)
@@ -462,7 +462,7 @@ static int unix_listen(struct socket *sock, int backlog)
        err = 0;
 
 out_unlock:
-       unix_state_wunlock(sk);
+       unix_state_unlock(sk);
 out:
        return err;
 }
@@ -858,6 +858,31 @@ out_mknod_parent:
        goto out_up;
 }
 
+static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)
+{
+       if (unlikely(sk1 == sk2) || !sk2) {
+               unix_state_lock(sk1);
+               return;
+       }
+       if (sk1 < sk2) {
+               unix_state_lock(sk1);
+               unix_state_lock_nested(sk2);
+       } else {
+               unix_state_lock(sk2);
+               unix_state_lock_nested(sk1);
+       }
+}
+
+static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2)
+{
+       if (unlikely(sk1 == sk2) || !sk2) {
+               unix_state_unlock(sk1);
+               return;
+       }
+       unix_state_unlock(sk1);
+       unix_state_unlock(sk2);
+}
+
 static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
                              int alen, int flags)
 {
@@ -877,11 +902,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
                    !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0)
                        goto out;
 
+restart:
                other=unix_find_other(sunaddr, alen, sock->type, hash, &err);
                if (!other)
                        goto out;
 
-               unix_state_wlock(sk);
+               unix_state_double_lock(sk, other);
+
+               /* Apparently VFS overslept socket death. Retry. */
+               if (sock_flag(other, SOCK_DEAD)) {
+                       unix_state_double_unlock(sk, other);
+                       sock_put(other);
+                       goto restart;
+               }
 
                err = -EPERM;
                if (!unix_may_send(sk, other))
@@ -896,7 +929,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
                 *      1003.1g breaking connected state with AF_UNSPEC
                 */
                other = NULL;
-               unix_state_wlock(sk);
+               unix_state_double_lock(sk, other);
        }
 
        /*
@@ -905,19 +938,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
        if (unix_peer(sk)) {
                struct sock *old_peer = unix_peer(sk);
                unix_peer(sk)=other;
-               unix_state_wunlock(sk);
+               unix_state_double_unlock(sk, other);
 
                if (other != old_peer)
                        unix_dgram_disconnected(sk, old_peer);
                sock_put(old_peer);
        } else {
                unix_peer(sk)=other;
-               unix_state_wunlock(sk);
+               unix_state_double_unlock(sk, other);
        }
        return 0;
 
 out_unlock:
-       unix_state_wunlock(sk);
+       unix_state_double_unlock(sk, other);
        sock_put(other);
 out:
        return err;
@@ -936,7 +969,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo)
                (skb_queue_len(&other->sk_receive_queue) >
                 other->sk_max_ack_backlog);
 
-       unix_state_runlock(other);
+       unix_state_unlock(other);
 
        if (sched)
                timeo = schedule_timeout(timeo);
@@ -994,11 +1027,11 @@ restart:
                goto out;
 
        /* Latch state of peer */
-       unix_state_rlock(other);
+       unix_state_lock(other);
 
        /* Apparently VFS overslept socket death. Retry. */
        if (sock_flag(other, SOCK_DEAD)) {
-               unix_state_runlock(other);
+               unix_state_unlock(other);
                sock_put(other);
                goto restart;
        }
@@ -1048,18 +1081,18 @@ restart:
                goto out_unlock;
        }
 
-       unix_state_wlock_nested(sk);
+       unix_state_lock_nested(sk);
 
        if (sk->sk_state != st) {
-               unix_state_wunlock(sk);
-               unix_state_runlock(other);
+               unix_state_unlock(sk);
+               unix_state_unlock(other);
                sock_put(other);
                goto restart;
        }
 
        err = security_unix_stream_connect(sock, other->sk_socket, newsk);
        if (err) {
-               unix_state_wunlock(sk);
+               unix_state_unlock(sk);
                goto out_unlock;
        }
 
@@ -1096,7 +1129,7 @@ restart:
        smp_mb__after_atomic_inc();     /* sock_hold() does an atomic_inc() */
        unix_peer(sk)   = newsk;
 
-       unix_state_wunlock(sk);
+       unix_state_unlock(sk);
 
        /* take ten and and send info to listening sock */
        spin_lock(&other->sk_receive_queue.lock);
@@ -1105,14 +1138,14 @@ restart:
         * is installed to listening socket. */
        atomic_inc(&newu->inflight);
        spin_unlock(&other->sk_receive_queue.lock);
-       unix_state_runlock(other);
+       unix_state_unlock(other);
        other->sk_data_ready(other, 0);
        sock_put(other);
        return 0;
 
 out_unlock:
        if (other)
-               unix_state_runlock(other);
+               unix_state_unlock(other);
 
 out:
        if (skb)
@@ -1178,10 +1211,10 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags)
        wake_up_interruptible(&unix_sk(sk)->peer_wait);
 
        /* attach accepted sock to socket */
-       unix_state_wlock(tsk);
+       unix_state_lock(tsk);
        newsock->state = SS_CONNECTED;
        sock_graft(tsk, newsock);
-       unix_state_wunlock(tsk);
+       unix_state_unlock(tsk);
        return 0;
 
 out:
@@ -1208,7 +1241,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
        }
 
        u = unix_sk(sk);
-       unix_state_rlock(sk);
+       unix_state_lock(sk);
        if (!u->addr) {
                sunaddr->sun_family = AF_UNIX;
                sunaddr->sun_path[0] = 0;
@@ -1219,7 +1252,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_
                *uaddr_len = addr->len;
                memcpy(sunaddr, addr->name, *uaddr_len);
        }
-       unix_state_runlock(sk);
+       unix_state_unlock(sk);
        sock_put(sk);
 out:
        return err;
@@ -1337,7 +1370,7 @@ restart:
                        goto out_free;
        }
 
-       unix_state_rlock(other);
+       unix_state_lock(other);
        err = -EPERM;
        if (!unix_may_send(sk, other))
                goto out_unlock;
@@ -1347,20 +1380,20 @@ restart:
                 *      Check with 1003.1g - what should
                 *      datagram error
                 */
-               unix_state_runlock(other);
+               unix_state_unlock(other);
                sock_put(other);
 
                err = 0;
-               unix_state_wlock(sk);
+               unix_state_lock(sk);
                if (unix_peer(sk) == other) {
                        unix_peer(sk)=NULL;
-                       unix_state_wunlock(sk);
+                       unix_state_unlock(sk);
 
                        unix_dgram_disconnected(sk, other);
                        sock_put(other);
                        err = -ECONNREFUSED;
                } else {
-                       unix_state_wunlock(sk);
+                       unix_state_unlock(sk);
                }
 
                other = NULL;
@@ -1397,14 +1430,14 @@ restart:
        }
 
        skb_queue_tail(&other->sk_receive_queue, skb);
-       unix_state_runlock(other);
+       unix_state_unlock(other);
        other->sk_data_ready(other, len);
        sock_put(other);
        scm_destroy(siocb->scm);
        return len;
 
 out_unlock:
-       unix_state_runlock(other);
+       unix_state_unlock(other);
 out_free:
        kfree_skb(skb);
 out:
@@ -1494,14 +1527,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
                        goto out_err;
                }
 
-               unix_state_rlock(other);
+               unix_state_lock(other);
 
                if (sock_flag(other, SOCK_DEAD) ||
                    (other->sk_shutdown & RCV_SHUTDOWN))
                        goto pipe_err_free;
 
                skb_queue_tail(&other->sk_receive_queue, skb);
-               unix_state_runlock(other);
+               unix_state_unlock(other);
                other->sk_data_ready(other, size);
                sent+=size;
        }
@@ -1512,7 +1545,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
        return sent;
 
 pipe_err_free:
-       unix_state_runlock(other);
+       unix_state_unlock(other);
        kfree_skb(skb);
 pipe_err:
        if (sent==0 && !(msg->msg_flags&MSG_NOSIGNAL))
@@ -1641,7 +1674,7 @@ static long unix_stream_data_wait(struct sock * sk, long timeo)
 {
        DEFINE_WAIT(wait);
 
-       unix_state_rlock(sk);
+       unix_state_lock(sk);
 
        for (;;) {
                prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
@@ -1654,14 +1687,14 @@ static long unix_stream_data_wait(struct sock * sk, long timeo)
                        break;
 
                set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
-               unix_state_runlock(sk);
+               unix_state_unlock(sk);
                timeo = schedule_timeout(timeo);
-               unix_state_rlock(sk);
+               unix_state_lock(sk);
                clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
        }
 
        finish_wait(sk->sk_sleep, &wait);
-       unix_state_runlock(sk);
+       unix_state_unlock(sk);
        return timeo;
 }
 
@@ -1816,12 +1849,12 @@ static int unix_shutdown(struct socket *sock, int mode)
        mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN);
 
        if (mode) {
-               unix_state_wlock(sk);
+               unix_state_lock(sk);
                sk->sk_shutdown |= mode;
                other=unix_peer(sk);
                if (other)
                        sock_hold(other);
-               unix_state_wunlock(sk);
+               unix_state_unlock(sk);
                sk->sk_state_change(sk);
 
                if (other &&
@@ -1833,9 +1866,9 @@ static int unix_shutdown(struct socket *sock, int mode)
                                peer_mode |= SEND_SHUTDOWN;
                        if (mode&SEND_SHUTDOWN)
                                peer_mode |= RCV_SHUTDOWN;
-                       unix_state_wlock(other);
+                       unix_state_lock(other);
                        other->sk_shutdown |= peer_mode;
-                       unix_state_wunlock(other);
+                       unix_state_unlock(other);
                        other->sk_state_change(other);
                        read_lock(&other->sk_callback_lock);
                        if (peer_mode == SHUTDOWN_MASK)
@@ -1973,7 +2006,7 @@ static int unix_seq_show(struct seq_file *seq, void *v)
        else {
                struct sock *s = v;
                struct unix_sock *u = unix_sk(s);
-               unix_state_rlock(s);
+               unix_state_lock(s);
 
                seq_printf(seq, "%p: %08X %08X %08X %04X %02X %5lu",
                        s,
@@ -2001,7 +2034,7 @@ static int unix_seq_show(struct seq_file *seq, void *v)
                        for ( ; i < len; i++)
                                seq_putc(seq, u->addr->name->sun_path[i]);
                }
-               unix_state_runlock(s);
+               unix_state_unlock(s);
                seq_putc(seq, '\n');
        }
 
index 7a19e0ede2891238b910ecae4f416cfd6c6b49a7..849cc06bd9141a62da44061a230e7bc70c472761 100644 (file)
@@ -454,7 +454,7 @@ static int wanrouter_device_setup(struct wan_device *wandev,
        }
 
        if (conf->data_size && conf->data) {
-               if (conf->data_size > 128000 || conf->data_size < 0) {
+               if (conf->data_size > 128000) {
                        printk(KERN_INFO
                            "%s: ERROR, Invalid firmware data size %i !\n",
                                        wandev->name, conf->data_size);
index b8bab89616a069e22ff82c7fac1d00d44acef9c3..64a375178c5f28b2b4adb61ed9a76a62a9e15a09 100644 (file)
 #include <net/xfrm.h>
 #include <net/ip.h>
 #include <linux/audit.h>
+#include <linux/cache.h>
 
 #include "xfrm_hash.h"
 
-int sysctl_xfrm_larval_drop;
+int sysctl_xfrm_larval_drop __read_mostly;
 
 DEFINE_MUTEX(xfrm_cfg_mutex);
 EXPORT_SYMBOL(xfrm_cfg_mutex);
index 9955ff4da0a2a304e708c5622381ff991c739c5b..372f06eb8bb7e389298c555999f785232a92ff94 100644 (file)
 #include <linux/cache.h>
 #include <asm/uaccess.h>
 #include <linux/audit.h>
+#include <linux/cache.h>
 
 #include "xfrm_hash.h"
 
 struct sock *xfrm_nl;
 EXPORT_SYMBOL(xfrm_nl);
 
-u32 sysctl_xfrm_aevent_etime = XFRM_AE_ETIME;
+u32 sysctl_xfrm_aevent_etime __read_mostly = XFRM_AE_ETIME;
 EXPORT_SYMBOL(sysctl_xfrm_aevent_etime);
 
-u32 sysctl_xfrm_aevent_rseqth = XFRM_AE_SEQT_SIZE;
+u32 sysctl_xfrm_aevent_rseqth __read_mostly = XFRM_AE_SEQT_SIZE;
 EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth);
 
+u32 sysctl_xfrm_acq_expires __read_mostly = 30;
+
 /* Each xfrm_state may be linked to two tables:
 
    1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
@@ -622,8 +625,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
                                h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family);
                                hlist_add_head(&x->byspi, xfrm_state_byspi+h);
                        }
-                       x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
-                       x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
+                       x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
+                       x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
                        add_timer(&x->timer);
                        xfrm_state_num++;
                        xfrm_hash_grow_check(x->bydst.next != NULL);
@@ -772,9 +775,9 @@ static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 re
                x->props.family = family;
                x->props.mode = mode;
                x->props.reqid = reqid;
-               x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES;
+               x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires;
                xfrm_state_hold(x);
-               x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ;
+               x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ;
                add_timer(&x->timer);
                hlist_add_head(&x->bydst, xfrm_state_bydst+h);
                h = xfrm_src_hash(daddr, saddr, family);
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
new file mode 100644 (file)
index 0000000..e216d49
--- /dev/null
@@ -0,0 +1,595 @@
+#!/usr/bin/perl -w
+# (c) 2001, Dave Jones. <davej@codemonkey.org.uk> (the file handling bit)
+# (c) 2005, Joel Scohpp <jschopp@austin.ibm.com> (the ugly bit)
+# (c) 2007, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite, etc)
+# Licensed under the terms of the GNU GPL License version 2
+
+use strict;
+
+my $P = $0;
+
+my $V = '0.01';
+
+use Getopt::Long qw(:config no_auto_abbrev);
+
+my $quiet = 0;
+my $tree = 1;
+my $chk_signoff = 1;
+my $chk_patch = 1;
+GetOptions(
+       'q|quiet'       => \$quiet,
+       'tree!'         => \$tree,
+       'signoff!'      => \$chk_signoff,
+       'patch!'        => \$chk_patch,
+) or exit;
+
+my $exit = 0;
+
+if ($#ARGV < 0) {
+       print "usage: patchstylecheckemail.pl [options] patchfile\n";
+       print "version: $V\n";
+       print "options: -q           => quiet\n";
+       print "         --no-tree    => run without a kernel tree\n";
+       exit(1);
+}
+
+if ($tree && !top_of_kernel_tree()) {
+       print "Must be run from the top-level dir. of a kernel tree\n";
+       exit(2);
+}
+
+my @deprecated = ();
+my $removal = 'Documentation/feature-removal-schedule.txt';
+if ($tree && -f $removal) {
+       open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!\n";
+       while (<REMOVE>) {
+               if (/^Files:\s+(.*\S)/) {
+                       for my $file (split(/[, ]+/, $1)) {
+                               if ($file =~ m@include/(.*)@) {
+                                       push(@deprecated, $1);
+                               }
+                       }
+               }
+       }
+}
+
+my @lines = ();
+while (<>) {
+       chomp;
+       push(@lines, $_);
+       if (eof(ARGV)) {
+               if (!process($ARGV, @lines)) {
+                       $exit = 1;
+               }
+               @lines = ();
+       }
+}
+
+exit($exit);
+
+sub top_of_kernel_tree {
+       if ((-f "COPYING") && (-f "CREDITS") && (-f "Kbuild") &&
+           (-f "MAINTAINERS") && (-f "Makefile") && (-f "README") &&
+           (-d "Documentation") && (-d "arch") && (-d "include") &&
+           (-d "drivers") && (-d "fs") && (-d "init") && (-d "ipc") &&
+           (-d "kernel") && (-d "lib") && (-d "scripts")) {
+               return 1;
+       }
+       return 0;
+}
+
+sub expand_tabs {
+       my ($str) = @_;
+
+       my $res = '';
+       my $n = 0;
+       for my $c (split(//, $str)) {
+               if ($c eq "\t") {
+                       $res .= ' ';
+                       $n++;
+                       for (; ($n % 8) != 0; $n++) {
+                               $res .= ' ';
+                       }
+                       next;
+               }
+               $res .= $c;
+               $n++;
+       }
+
+       return $res;
+}
+
+sub cat_vet {
+       my ($vet) = @_;
+
+       $vet =~ s/\t/^I/;
+       $vet =~ s/$/\$/;
+
+       return $vet;
+}
+
+sub process {
+       my $filename = shift;
+       my @lines = @_;
+
+       my $linenr=0;
+       my $prevline="";
+       my $stashline="";
+
+       my $lineforcounting='';
+       my $indent;
+       my $previndent=0;
+       my $stashindent=0;
+
+       my $clean = 1;
+       my $signoff = 0;
+       my $is_patch = 0;
+
+       # Trace the real file/line as we go.
+       my $realfile = '';
+       my $realline = 0;
+       my $realcnt = 0;
+       my $here = '';
+       my $in_comment = 0;
+       my $first_line = 0;
+
+       foreach my $line (@lines) {
+               $linenr++;
+
+#extract the filename as it passes
+               if ($line=~/^\+\+\+\s+(\S+)/) {
+                       $realfile=$1;
+                       $in_comment = 0;
+                       next;
+               }
+#extract the line range in the file after the patch is applied
+               if ($line=~/^\@\@ -\d+,\d+ \+(\d+)(,(\d+))? \@\@/) {
+                       $is_patch = 1;
+                       $first_line = 1;
+                       $in_comment = 0;
+                       $realline=$1-1;
+                       if (defined $2) {
+                               $realcnt=$3+1;
+                       } else {
+                               $realcnt=1+1;
+                       }
+                       next;
+               }
+
+#track the line number as we move through the hunk
+               if ($line=~/^[ \+]/) {
+                       $realline++;
+                       $realcnt-- if ($realcnt != 0);
+
+                       # track any sort of multi-line comment.  Obviously if
+                       # the added text or context do not include the whole
+                       # comment we will not see it. Such is life.
+                       #
+                       # Guestimate if this is a continuing comment.  If this
+                       # is the start of a diff block and this line starts
+                       # ' *' then it is very likely a comment.
+                       if ($first_line and $line =~ m@^.\s*\*@) {
+                               $in_comment = 1;
+                       }
+                       if ($line =~ m@/\*@) {
+                               $in_comment = 1;
+                       }
+                       if ($line =~ m@\*/@) {
+                               $in_comment = 0;
+                       }
+
+                       $lineforcounting = $line;
+                       $lineforcounting =~ s/^\+//;
+                       $lineforcounting = expand_tabs($lineforcounting);
+
+                       my ($white) = ($lineforcounting =~ /^(\s*)/);
+                       $indent = length($white);
+
+                       # Track the previous line.
+                       ($prevline, $stashline) = ($stashline, $line);
+                       ($previndent, $stashindent) = ($stashindent, $indent);
+                       $first_line = 0;
+               }
+
+#make up the handle for any error we report on this line
+               $here = "PATCH: $ARGV:$linenr:";
+               $here .= "\nFILE: $realfile:$realline:" if ($realcnt != 0);
+
+               my $herecurr = "$here\n$line\n\n";
+               my $hereprev = "$here\n$prevline\n$line\n\n";
+
+#check the patch for a signoff:
+               if ($line =~ /^\s*Signed-off-by:\s/) {
+                       $signoff++;
+
+               } elsif ($line =~ /^\s*signed-off-by:/i) {
+                       if (!($line =~ /^\s*Signed-off-by:/)) {
+                               print "use Signed-off-by:\n";
+                               print "$herecurr";
+                               $clean = 0;
+                       }
+                       if ($line =~ /^\s*signed-off-by:\S/i) {
+                               print "need space after Signed-off-by:\n";
+                               print "$herecurr";
+                               $clean = 0;
+                       }
+               }
+
+#ignore lines not being added
+               if ($line=~/^[^\+]/) {next;}
+
+# check we are in a valid source file *.[hcsS] if not then ignore this hunk
+               next if ($realfile !~ /\.[hcsS]$/);
+
+#trailing whitespace
+               if ($line=~/\S\s+$/) {
+                       my $herevet = "$here\n" . cat_vet($line) . "\n\n";
+                       print "trailing whitespace\n";
+                       print "$herevet";
+                       $clean = 0;
+               }
+#80 column limit
+               if (!($prevline=~/\/\*\*/) && length($lineforcounting) > 80) {
+                       print "line over 80 characters\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+# check we are in a valid source file *.[hc] if not then ignore this hunk
+               next if ($realfile !~ /\.[hc]$/);
+
+# at the beginning of a line any tabs must come first and anything
+# more than 8 must use tabs.
+               if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s*        \s*/) {
+                       my $herevet = "$here\n" . cat_vet($line) . "\n\n";
+                       print "use tabs not spaces\n";
+                       print "$herevet";
+                       $clean = 0;
+               }
+
+               #
+               # The rest of our checks refer specifically to C style
+               # only apply those _outside_ comments.
+               #
+               next if ($in_comment);
+
+# no C99 // comments
+               if ($line =~ m@//@ and !($line =~ m@\".*//.*\"@)) {
+                       print "do not use C99 // comments\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+               # Remove comments from the line before processing.
+               $line =~ s@/\*.*\*/@@g;
+               $line =~ s@/\*.*@@;
+               $line =~ s@.*\*/@@;
+               $line =~ s@//.*@@;
+
+#EXPORT_SYMBOL should immediately follow its function closing }.
+               if (($line =~ /EXPORT_SYMBOL.*\(.*\)/) ||
+                   ($line =~ /EXPORT_UNUSED_SYMBOL.*\(.*\)/)) {
+                       if (($prevline !~ /^}/) &&
+                          ($prevline !~ /^\+}/) &&
+                          ($prevline !~ /^ }/)) {
+                               print "EXPORT_SYMBOL(func); should immediately follow its function\n";
+                               print "$herecurr";
+                               $clean = 0;
+                       }
+               }
+
+               # check for static initialisers.
+               if ($line=~/\s*static\s.*=\s+(0|NULL);/) {
+                       print "do not initialise statics to 0 or NULL\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+               # check for new typedefs.
+               if ($line=~/\s*typedef\s/) {
+                       print "do not add new typedefs\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+# * goes on variable not on type
+               if ($line=~/[A-Za-z\d_]+\* [A-Za-z\d_]+/) {
+                       print "\"foo* bar\" should be \"foo *bar\"\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+# # no BUG() or BUG_ON()
+#              if ($line =~ /\b(BUG|BUG_ON)\b/) {
+#                      print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
+#                      print "$herecurr";
+#                      $clean = 0;
+#              }
+
+# printk should use KERN_* levels
+               if ($line =~ /\bprintk\((?!KERN_)/) {
+                       print "printk() should include KERN_ facility level\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+#function brace can't be on same line, except for #defines of do while, or if closed on same line
+               if (($line=~/[A-Za-z\d_]+\**\s+\**[A-Za-z\d_]+\(.*\).* {/) and
+                   !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
+                       print "braces following function declarations go on the next line\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+               my $opline = $line;
+               $opline =~ s/^.//;
+               if (!($line=~/\#\s*include/)) {
+                       # Check operator spacing.
+                       my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline);
+                       for (my $n = 0; $n < $#elements; $n += 2) {
+                               # $wN says we have white-space before or after
+                               # $sN says we have a separator before or after
+                               # $oN says we have another operator before or after
+                               my $w1 = $elements[$n] =~ /\s$/;
+                               my $s1 = $elements[$n] =~ /(\[|\(|\s)$/;
+                               my $o1 = $elements[$n] eq '';
+                               my $op = $elements[$n + 1];
+                               my $w2 = 1;
+                               my $s2 = 1;
+                               my $o2 = 0;
+                               # If we have something after the operator handle it.
+                               if (defined $elements[$n + 2]) {
+                                       $w2 = $elements[$n + 2] =~ /^\s/;
+                                       $s2 = $elements[$n + 2] =~ /^(\s|\)|\]|;)/;
+                                       $o2 = $elements[$n + 2] eq '';
+                               }
+
+                               # Generate the context.
+                               my $at = "here: ";
+                               for (my $m = $n; $m >= 0; $m--) {
+                                       if ($elements[$m] ne '') {
+                                               $at .= $elements[$m];
+                                               last;
+                                       }
+                               }
+                               $at .= $op;
+                               for (my $m = $n + 2; defined $elements[$m]; $m++) {
+                                       if ($elements[$m] ne '') {
+                                               $at .= $elements[$m];
+                                               last;
+                                       }
+                               }
+
+                               ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n";
+                               # Skip things apparently in quotes.
+                               next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/);
+
+                               # We need ; as an operator.  // is a comment.
+                               if ($op eq ';' or $op eq '//') {
+
+                               # -> should have no spaces
+                               } elsif ($op eq '->') {
+                                       if ($s1 or $s2) {
+                                               print "no spaces around that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # , must have a space on the right.
+                               } elsif ($op eq ',') {
+                                       if (!$s2) {
+                                               print "need space after that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # unary ! and unary ~ are allowed no space on the right
+                               } elsif ($op eq '!' or $op eq '~') {
+                                       if (!$s1 && !$o1) {
+                                               print "need space before that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+                                       if ($s2) {
+                                               print "no space after that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # unary ++ and unary -- are allowed no space on one side.
+                               } elsif ($op eq '++' or $op eq '--') {
+                                       if (($s1 && $s2) || ((!$s1 && !$o1) && (!$s2 && !$o2))) {
+                                               print "need space one side of that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # & is both unary and binary
+                               # unary:
+                               #       a &b
+                               # binary (consistent spacing):
+                               #       a&b             OK
+                               #       a & b           OK
+                               #
+                               # boiling down to: if there is a space on the right then there
+                               # should be one on the left.
+                               #
+                               # - is the same
+                               #
+                               # * is the same only adding:
+                               # type:
+                               #       (foo *)
+                               #       (foo **)
+                               #
+                               } elsif ($op eq '&' or $op eq '-' or $op eq '*') {
+                                       if ($w2 and !$w1) {
+                                               print "need space before that '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # << and >> may either have or not have spaces both sides
+                               } elsif ($op eq '<<' or $op eq '>>' or $op eq '+' or $op eq '/' or
+                                        $op eq '^' or $op eq '|')
+                               {
+                                       if ($s1 != $s2) {
+                                               print "need consistent spacing around '$op' $at\n";
+                                               print "$herecurr";
+                                               $clean = 0;
+                                       }
+
+                               # All the others need spaces both sides.
+                               } elsif (!$s1 or !$s2) {
+                                       print "need spaces around that '$op' $at\n";
+                                       print "$herecurr";
+                                       $clean = 0;
+                               }
+                       }
+               }
+
+#need space before brace following if, while, etc
+               if ($line=~/\(.*\){/) {
+                       print "need a space before the brace\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+#goto labels aren't indented, allow a single space however
+               if ($line=~/^.\s+[A-Za-z\d_]+:/ and
+                  !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
+                       print "labels should not be indented\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+# Need a space before open parenthesis after if, while etc
+               if ($line=~/(if|while|for|switch)\(/) {
+                       print "need a space before the open parenthesis\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+# Check for illegal assignment in if conditional.
+               if ($line=~/(if|while)\s*\(.*[^<>!=]=[^=].*\)/) {
+                       print "do not use assignment in if condition\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+               # Check for }<nl>else {, these must be at the same
+               # indent level to be relevant to each other.
+               if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
+                                               $previndent == $indent) {
+                       print "else should follow close brace\n";
+                       print "$hereprev";
+                       $clean = 0;
+               }
+
+               # Check for switch () {<nl>case, these must be at the
+               # same indent.  We will only catch the first one, as our
+               # context is very small but people tend to be consistent
+               # so we will catch them out more often than not.
+               if ($prevline=~/\s*switch\s*\(.*\)/ and $line=~/\s*case\s+/
+                                               and $previndent != $indent) {
+                       print "switch and case should be at the same indent\n";
+                       print "$hereprev";
+                       $clean = 0;
+               }
+
+#studly caps, commented out until figure out how to distinguish between use of existing and adding new
+#              if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
+#                  print "No studly caps, use _\n";
+#                  print "$herecurr";
+#                  $clean = 0;
+#              }
+
+#no spaces allowed after \ in define
+               if ($line=~/\#define.*\\\s$/) {
+                       print("Whitepspace after \\ makes next lines useless\n");
+                       print "$herecurr";
+                       $clean = 0;
+               }
+
+#warn if <asm/foo.h> is #included and <linux/foo.h> is available.
+               if ($tree && $line =~ qr|\s*\#\s*include\s*\<asm\/(.*)\.h\>|) {
+                       my $checkfile = "include/linux/$1.h";
+                       if (-f $checkfile) {
+                               print "Use #include <linux/$1.h> instead of <asm/$1.h>\n";
+                               print $herecurr;
+                               $clean = 0;
+                       }
+               }
+
+#if/while/etc brace do not go on next line, unless #defining a do while loop, or if that brace on the next line is for something else
+               if ($prevline=~/(if|while|for|switch)\s*\(/) {
+                       my @opened = $prevline=~/\(/g;
+                       my @closed = $prevline=~/\)/g;
+                       my $nr_line = $linenr;
+                       my $remaining = $realcnt;
+                       my $next_line = $line;
+                       my $extra_lines = 0;
+                       my $display_segment = $prevline;
+
+                       while ($remaining > 0 && scalar @opened > scalar @closed) {
+                               $prevline .= $next_line;
+                               $display_segment .= "\n" . $next_line;
+                               $next_line = $lines[$nr_line];
+                               $nr_line++;
+                               $remaining--;
+
+                               @opened = $prevline=~/\(/g;
+                               @closed = $prevline=~/\)/g;
+                       }
+
+                       if (($prevline=~/(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and
+                          !($next_line=~/(if|while|for)/) and !($next_line=~/\#define.*do.*while/)) {
+                               print "That { should be on the previous line\n";
+                               print "$display_segment\n$next_line\n\n";
+                               $clean = 0;
+                       }
+               }
+
+#multiline macros should be enclosed in a do while loop
+               if (($prevline=~/\#define.*\\/) and !($prevline=~/do\s+{/) and
+                  !($prevline=~/\(\{/) and ($line=~/;\s*\\/) and
+                  !($line=~/do.*{/) and !($line=~/\(\{/)) {
+                       print "Macros with multiple statements should be enclosed in a do - while loop\n";
+                       print "$hereprev";
+                       $clean = 0;
+               }
+
+# don't include deprecated include files
+               for my $inc (@deprecated) {
+                       if ($line =~ m@\#\s*include\s*\<$inc>@) {
+                               print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n";
+                               print "$herecurr";
+                               $clean = 0;
+                       }
+               }
+
+# don't use kernel_thread()
+               if ($line =~ /\bkernel_thread\b/) {
+                       print "Don't use kernel_thread(), use kthread(): see Documentation/feature-removal-schedule.txt\n";
+                       print "$herecurr";
+                       $clean = 0;
+               }
+       }
+
+       if ($chk_patch && !$is_patch) {
+               $clean = 0;
+               print "Does not appear to be a unified-diff format patch\n";
+       }
+       if ($is_patch && $chk_signoff && $signoff == 0) {
+               $clean = 0;
+               print "Missing Signed-off-by: line(s)\n";
+       }
+
+       if ($clean == 1 && $quiet == 0) {
+               print "Your patch has no obvious style problems and is ready for submission.\n"
+       }
+       if ($clean == 0 && $quiet == 0) {
+               print "Your patch has style problems, please review.  If any of these errors\n";
+               print "are false positives report them to the maintainer, see\n";
+               print "CHECKPATCH in MAINTAINERS.\n";
+       }
+       return $clean;
+}
index c7e1b26461938eea09e0381fd0e83e213219fb4f..e7ed868fa7c0d4f50d5d1c7d87c117b4efc76569 100644 (file)
@@ -987,7 +987,7 @@ static int __init sa11xx_uda1341_init(void)
                if (platform_get_drvdata(device))
                        return 0;
                platform_device_unregister(device);
-               err = -ENODEV
+               err = -ENODEV;
        } else
                err = PTR_ERR(device);
        platform_driver_unregister(&sa11xx_uda1341_driver);
index e1ed59549c5063a76ba0eb200f966ebaa0c268c8..cb59f994c68f2a4bdfd2c9c1925d5b8cb2dd507d 100644 (file)
@@ -1250,7 +1250,7 @@ static int snd_ali_playback_hw_params(struct snd_pcm_substream *substream,
                        evoice->substream = substream;
                }
        } else {
-               if (!evoice) {
+               if (evoice) {
                        snd_ali_free_voice(codec, evoice);
                        pvoice->extra = evoice = NULL;
                }
@@ -1267,7 +1267,7 @@ static int snd_ali_playback_hw_free(struct snd_pcm_substream *substream)
        struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL;
 
        snd_pcm_lib_free_pages(substream);
-       if (!evoice) {
+       if (evoice) {
                snd_ali_free_voice(codec, evoice);
                pvoice->extra = NULL;
        }
@@ -1356,7 +1356,7 @@ static int snd_ali_playback_prepare(struct snd_pcm_substream *substream)
                                 VOL,
                                 CTRL,
                                 EC);
-       if (!evoice) {
+       if (evoice) {
                evoice->count = pvoice->count;
                evoice->eso = pvoice->count << 1;
                ESO = evoice->eso - 1;
index 8e89d56b6400d2721a6d68e505aa11358c47113e..f87f8f088956d31827ea62750ffebe10fc2f189a 100644 (file)
@@ -713,6 +713,19 @@ static u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction)
        return info->amp_caps;
 }
 
+int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
+                             unsigned int caps)
+{
+       struct hda_amp_info *info;
+
+       info = get_alloc_amp_hash(codec, HDA_HASH_KEY(nid, dir, 0));
+       if (!info)
+               return -EINVAL;
+       info->amp_caps = caps;
+       info->status |= INFO_AMP_CAPS;
+       return 0;
+}
+
 /*
  * read the current volume to info
  * if the cache exists, read the cache value.
index be12b8814c39b62d8e27ee65b0f9fce0c49aedb6..f91ea5ec9f6d547527c91996a45ba34bdbd079cc 100644 (file)
@@ -277,5 +277,7 @@ static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid)
        return codec->wcaps[nid - codec->start_nid];
 }
 
+int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
+                             unsigned int caps);
 
 #endif /* __SOUND_HDA_LOCAL_H */
index a5a4b2bddf200a8daecde2b76c28b24f702a6231..bef214bcdddfa2ad60c0fa02a9f8c9a16c0036af 100644 (file)
@@ -705,6 +705,17 @@ static struct snd_kcontrol_new cxt5045_test_mixer[] = {
                .get = conexant_mux_enum_get,
                .put = conexant_mux_enum_put,
        },
+       /* Audio input controls */
+       HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT),
+       HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT),
+       HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT),
+       HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT),
+       HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT),
+       HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT),
+       HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT),
+       HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT),
+       HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT),
        { } /* end */
 };
 
@@ -947,6 +958,23 @@ static void cxt5047_hp_automute(struct hda_codec *codec)
        snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits);
 }
 
+/* mute internal speaker if HP is plugged */
+static void cxt5047_hp2_automute(struct hda_codec *codec)
+{
+       struct conexant_spec *spec = codec->spec;
+       unsigned int bits;
+
+       spec->hp_present = snd_hda_codec_read(codec, 0x13, 0,
+                                    AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
+
+       bits = spec->hp_present ? 0x80 : 0;
+       snd_hda_codec_amp_update(codec, 0x1d, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x1d, 1, HDA_OUTPUT, 0, 0x80, bits);
+       /* Mute/Unmute PCM 2 for good measure - some systems need this */
+       snd_hda_codec_amp_update(codec, 0x1c, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits);
+}
+
 /* toggle input of built-in and mic jack appropriately */
 static void cxt5047_hp_automic(struct hda_codec *codec)
 {
@@ -985,6 +1013,21 @@ static void cxt5047_hp_unsol_event(struct hda_codec *codec,
        }
 }
 
+/* unsolicited event for HP jack sensing - non-EAPD systems */
+static void cxt5047_hp2_unsol_event(struct hda_codec *codec,
+                                 unsigned int res)
+{
+       res >>= 26;
+       switch (res) {
+       case CONEXANT_HP_EVENT:
+               cxt5047_hp2_automute(codec);
+               break;
+       case CONEXANT_MIC_EVENT:
+               cxt5047_hp_automic(codec);
+               break;
+       }
+}
+
 static struct snd_kcontrol_new cxt5047_mixers[] = {
        HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT),
        HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT),
@@ -1300,19 +1343,20 @@ static int patch_cxt5047(struct hda_codec *codec)
        spec->channel_mode = cxt5047_modes,
 
        codec->patch_ops = conexant_patch_ops;
-       codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
 
        board_config = snd_hda_check_board_config(codec, CXT5047_MODELS,
                                                  cxt5047_models,
                                                  cxt5047_cfg_tbl);
        switch (board_config) {
        case CXT5047_LAPTOP:
+               codec->patch_ops.unsol_event = cxt5047_hp2_unsol_event;
                break;
        case CXT5047_LAPTOP_HP:
                spec->input_mux = &cxt5047_hp_capture_source;
                spec->num_init_verbs = 2;
                spec->init_verbs[1] = cxt5047_hp_init_verbs;
                spec->mixers[0] = cxt5047_hp_mixers;
+               codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
                codec->patch_ops.init = cxt5047_hp_init;
                break;
        case CXT5047_LAPTOP_EAPD:
@@ -1320,12 +1364,14 @@ static int patch_cxt5047(struct hda_codec *codec)
                spec->num_init_verbs = 2;
                spec->init_verbs[1] = cxt5047_toshiba_init_verbs;
                spec->mixers[0] = cxt5047_toshiba_mixers;
+               codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
                break;
 #ifdef CONFIG_SND_DEBUG
        case CXT5047_TEST:
                spec->input_mux = &cxt5047_test_capture_source;
                spec->mixers[0] = cxt5047_test_mixer;
                spec->init_verbs[0] = cxt5047_test_init_verbs;
+               codec->patch_ops.unsol_event = cxt5047_hp_unsol_event;
 #endif 
        }
        return 0;
index 34ac634695328c2ddedb780101f1c8545deef666..4776de93928b4b55fa78a2b570b40715a54b1f4d 100644 (file)
@@ -6379,8 +6379,10 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1458, 0xa002, "MSI", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
+       SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
+       SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
        SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
        SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
        SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
@@ -6391,6 +6393,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
        SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
        SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER),
+       SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
        SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
        SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
        SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
@@ -8765,7 +8768,6 @@ static struct snd_pci_quirk alc861_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
        SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
        SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
-       SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660_3ST),
        SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
        SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA),
        SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
@@ -9473,6 +9475,7 @@ static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
        SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),
+       SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST),
        SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
        SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
 
index 6fcda9bcf0cfc593137701fa3bc6d79c5ecde97c..43f537ef40bf12a134c86b64cd7fa93b6d0f2de7 100644 (file)
@@ -304,6 +304,8 @@ struct hda_codec_preset snd_hda_preset_si3054[] = {
        { .id = 0x10573055, .name = "Si3054", .patch = patch_si3054 },
        { .id = 0x10573057, .name = "Si3054", .patch = patch_si3054 },
        { .id = 0x10573155, .name = "Si3054", .patch = patch_si3054 },
+       /* Asus A8J Modem (SM56) */
+       { .id = 0x15433155, .name = "Si3054", .patch = patch_si3054 },
        {}
 };
 
index a6a0a80edc3b19860f781595b84d300aab4de5bd..e3964fc4c40521cb3914740fdd25f764e836209f 100644 (file)
@@ -51,6 +51,7 @@ enum {
        STAC_925x_REF,
        STAC_M2_2,
        STAC_MA6,
+       STAC_PA6,
        STAC_925x_MODELS
 };
 
@@ -152,6 +153,10 @@ static hda_nid_t stac925x_dac_nids[1] = {
         0x02,
 };
 
+static hda_nid_t stac925x_dmic_nids[1] = {
+       0x15, 
+};
+
 static hda_nid_t stac922x_adc_nids[2] = {
         0x06, 0x07,
 };
@@ -469,6 +474,14 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = {
                      "Dell Precision M90", STAC_REF),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
                      "unknown Dell", STAC_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
+                     "Dell Inspiron 640m", STAC_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
+                     "Dell Inspiron 1501", STAC_REF),
+
+       /* Panasonic */
+       SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF),
+
        {} /* terminator */
 };
 
@@ -482,29 +495,38 @@ static unsigned int stac925x_MA6_pin_configs[8] = {
        0x90a70320, 0x90100211, 0x400003f1, 0x9033032e,
 };
 
+static unsigned int stac925x_PA6_pin_configs[8] = {
+       0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
+       0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e,
+};
+
 static unsigned int stac925xM2_2_pin_configs[8] = {
-       0x40c003f3, 0x424503f2, 0x041800f4, 0x02a19020,
-       0x50a103F0, 0x90100210, 0x400003f1, 0x9033032e,
+       0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020,
+       0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e,
 };
 
 static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
        [STAC_REF] = ref925x_pin_configs,
        [STAC_M2_2] = stac925xM2_2_pin_configs,
        [STAC_MA6] = stac925x_MA6_pin_configs,
+       [STAC_PA6] = stac925x_PA6_pin_configs,
 };
 
 static const char *stac925x_models[STAC_925x_MODELS] = {
        [STAC_REF] = "ref",
        [STAC_M2_2] = "m2-2",
        [STAC_MA6] = "m6",
+       [STAC_PA6] = "pa6",
 };
 
 static struct snd_pci_quirk stac925x_cfg_tbl[] = {
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
+       SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
        SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF),
        SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF),
        SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6),
+       SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6),
        SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2),
        {} /* terminator */
 };
@@ -1742,6 +1764,21 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
        unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
                        0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
 
+       if (pin_ctl & AC_PINCTL_IN_EN) {
+               /*
+                * we need to check the current set-up direction of
+                * shared input pins since they can be switched via
+                * "xxx as Output" mixer switch
+                */
+               struct sigmatel_spec *spec = codec->spec;
+               struct auto_pin_cfg *cfg = &spec->autocfg;
+               if ((nid == cfg->input_pins[AUTO_PIN_LINE] &&
+                    spec->line_switch) ||
+                   (nid == cfg->input_pins[AUTO_PIN_MIC] &&
+                    spec->mic_switch))
+                       return;
+       }
+
        /* if setting pin direction bits, clear the current
           direction bits first */
        if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
@@ -1911,7 +1948,8 @@ static int patch_stac925x(struct hda_codec *codec)
                                                        stac925x_cfg_tbl);
  again:
        if (spec->board_config < 0) {
-               snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x, using BIOS defaults\n");
+               snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x," 
+                                     "using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
                if (err < 0) {
                        stac92xx_free(codec);
@@ -1929,7 +1967,18 @@ static int patch_stac925x(struct hda_codec *codec)
        spec->adc_nids = stac925x_adc_nids;
        spec->mux_nids = stac925x_mux_nids;
        spec->num_muxes = 1;
-       spec->num_dmics = 0;
+       switch (codec->vendor_id) {
+       case 0x83847632: /* STAC9202  */
+       case 0x83847633: /* STAC9202D */
+       case 0x83847636: /* STAC9251  */
+       case 0x83847637: /* STAC9251D */
+               spec->num_dmics = 1;
+               spec->dmic_nids = stac925x_dmic_nids;
+               break;
+       default:
+               spec->num_dmics = 0;
+               break;
+       }
 
        spec->init = stac925x_core_init;
        spec->mixer = stac925x_mixer;
@@ -2110,6 +2159,13 @@ static int patch_stac927x(struct hda_codec *codec)
 
        codec->patch_ops = stac92xx_patch_ops;
 
+       /* Fix Mux capture level; max to 2 */
+       snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
+                                 (0 << AC_AMPCAP_OFFSET_SHIFT) |
+                                 (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
+                                 (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
+                                 (0 << AC_AMPCAP_MUTE_SHIFT));
+
        return 0;
 }
 
index 21dc6974d6a3922c3d6a94baf5f232e4bf5e8c44..bfbdc3cbd43b5e936c0614c9429d1414e4a4bb56 100644 (file)
@@ -337,6 +337,8 @@ static int s3c24xx_pcm_open(struct snd_pcm_substream *substream)
        if (prtd == NULL)
                return -ENOMEM;
 
+       spin_lock_init(&prtd->lock);
+
        runtime->private_data = prtd;
        return 0;
 }