]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Pull battery into release branch
authorLen Brown <len.brown@intel.com>
Sat, 25 Aug 2007 02:18:51 +0000 (22:18 -0400)
committerLen Brown <len.brown@intel.com>
Sat, 25 Aug 2007 02:18:51 +0000 (22:18 -0400)
371 files changed:
Documentation/DocBook/deviceiobook.tmpl
Documentation/HOWTO
Documentation/SubmittingPatches
Documentation/accounting/getdelays.c
Documentation/dvb/get_dvb_firmware
Documentation/filesystems/9p.txt
Documentation/ko_KR/HOWTO [new file with mode: 0644]
Documentation/vm/numa_memory_policy.txt [new file with mode: 0644]
Documentation/watchdog/00-INDEX [new file with mode: 0644]
MAINTAINERS
arch/arm/mach-ks8695/board-micrel.c
arch/arm/mach-s3c2442/Kconfig
arch/avr32/boards/atngw100/setup.c
arch/avr32/boards/atstk1000/Kconfig
arch/avr32/boards/atstk1000/atstk1002.c
arch/cris/arch-v10/drivers/Kconfig
arch/cris/arch-v32/drivers/Kconfig
arch/h8300/kernel/process.c
arch/h8300/kernel/sys_h8300.c
arch/i386/Kconfig
arch/i386/Makefile
arch/i386/boot/edd.c
arch/i386/boot/video.c
arch/i386/kernel/alternative.c
arch/i386/kernel/apic.c
arch/i386/kernel/nmi.c
arch/i386/kernel/tsc.c
arch/i386/mm/fault.c
arch/i386/xen/xen-head.S
arch/ia64/Kconfig
arch/ia64/configs/bigsur_defconfig
arch/ia64/configs/gensparse_defconfig
arch/ia64/configs/sim_defconfig
arch/ia64/configs/sn2_defconfig
arch/ia64/configs/tiger_defconfig
arch/ia64/configs/zx1_defconfig
arch/ia64/defconfig
arch/ia64/hp/sim/boot/boot_head.S
arch/ia64/kernel/cpufreq/acpi-cpufreq.c
arch/ia64/kernel/irq.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/process.c
arch/ia64/kernel/ptrace.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/vmlinux.lds.S
arch/ia64/mm/fault.c
arch/ia64/sn/kernel/irq.c
arch/m68k/kernel/setup.c
arch/m68k/kernel/vmlinux-std.lds
arch/m68k/mm/motorola.c
arch/m68knommu/kernel/process.c
arch/m68knommu/kernel/sys_m68k.c
arch/powerpc/boot/dts/mpc8544ds.dts
arch/powerpc/boot/dts/mpc8641_hpcn.dts
arch/powerpc/boot/flatdevtree.c
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/misc_32.S
arch/powerpc/kernel/traps.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/platforms/85xx/Kconfig
arch/powerpc/platforms/85xx/mpc8544_ds.c
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/cell/spu_syscalls.c
arch/powerpc/platforms/fsl_uli1575.c [new file with mode: 0644]
arch/powerpc/platforms/ps3/device-init.c
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/rtc_cmos_setup.c
arch/ppc/kernel/misc.S
arch/s390/hypfs/inode.c
arch/s390/kernel/Makefile
arch/s390/kernel/diag.c [new file with mode: 0644]
arch/s390/kernel/dis.c
arch/s390/kernel/kprobes.c
arch/s390/kernel/s390_ksyms.c
arch/s390/mm/cmm.c
arch/s390/mm/init.c
arch/sh/Makefile
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
arch/sh/kernel/early_printk.c
arch/sh/kernel/machvec.c
arch/sh/kernel/ptrace.c
arch/sh64/kernel/setup.c
arch/sh64/kernel/signal.c
arch/sparc/kernel/ebus.c
arch/sparc/mm/io-unit.c
arch/sparc/mm/iommu.c
arch/sparc/mm/sun4c.c
arch/sparc64/kernel/head.S
arch/sparc64/kernel/mdesc.c
arch/sparc64/kernel/trampoline.S
arch/sparc64/lib/Makefile
arch/sparc64/lib/NG2copy_from_user.S [new file with mode: 0644]
arch/sparc64/lib/NG2copy_to_user.S [new file with mode: 0644]
arch/sparc64/lib/NG2memcpy.S [new file with mode: 0644]
arch/sparc64/lib/NG2page.S [new file with mode: 0644]
arch/sparc64/lib/NG2patch.S [new file with mode: 0644]
arch/sparc64/lib/NGpage.S
arch/um/drivers/ubd_kern.c
arch/x86_64/Makefile
arch/x86_64/kernel/head.S
arch/x86_64/kernel/nmi.c
arch/x86_64/kernel/pci-dma.c
drivers/acpi/processor_idle.c
drivers/ata/ata_piix.c
drivers/ata/libata-core.c
drivers/ata/pata_artop.c
drivers/ata/pata_hpt37x.c
drivers/ata/pata_hpt3x2n.c
drivers/ata/pata_isapnp.c
drivers/ata/pata_it821x.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_sis.c
drivers/ata/pata_via.c
drivers/ata/sata_mv.c
drivers/atm/Kconfig
drivers/auxdisplay/Kconfig
drivers/auxdisplay/cfag12864b.c
drivers/block/Kconfig
drivers/block/lguest_blk.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/keyboard.c
drivers/char/synclink_gt.c
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_atmel.c
drivers/char/tpm/tpm_atmel.h
drivers/char/tpm/tpm_bios.c
drivers/char/tpm/tpm_nsc.c
drivers/char/tpm/tpm_tis.c
drivers/char/tty_io.c
drivers/char/watchdog/alim1535_wdt.c
drivers/char/watchdog/eurotechwdt.c
drivers/crypto/Kconfig
drivers/dma/ioatdma.c
drivers/dma/ioatdma.h
drivers/hid/Kconfig
drivers/hwmon/smsc47m1.c
drivers/hwmon/w83627ehf.c
drivers/hwmon/w83781d.c
drivers/ide/Kconfig
drivers/ide/cris/ide-cris.c
drivers/ide/ide-disk.c
drivers/ide/ide-dma.c
drivers/ide/ide-iops.c
drivers/ide/pci/cs5530.c
drivers/ide/pci/hpt34x.c
drivers/ide/pci/ns87415.c
drivers/ide/pci/pdc202xx_new.c
drivers/ide/pci/pdc202xx_old.c
drivers/ide/pci/triflex.c
drivers/ide/ppc/pmac.c
drivers/infiniband/core/agent.c
drivers/infiniband/core/agent.h
drivers/infiniband/core/device.c
drivers/infiniband/core/mad.c
drivers/infiniband/core/mad_rmpp.c
drivers/infiniband/core/sa_query.c
drivers/infiniband/core/umem.c
drivers/infiniband/hw/cxgb3/iwch_cm.c
drivers/infiniband/hw/mlx4/cq.c
drivers/infiniband/hw/mlx4/mad.c
drivers/infiniband/ulp/ipoib/ipoib_verbs.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/input/misc/Kconfig
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/hisax/hfc_usb.h
drivers/kvm/Kconfig
drivers/kvm/kvm_main.c
drivers/lguest/Kconfig
drivers/macintosh/Kconfig
drivers/macintosh/mac_hid.c
drivers/macintosh/via-pmu68k.c
drivers/md/raid1.c
drivers/media/dvb/b2c2/flexcop-i2c.c
drivers/media/dvb/dvb-core/dvb_net.c
drivers/media/dvb/frontends/dvb-pll.c
drivers/media/video/cafe_ccic.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/ov7670.c
drivers/media/video/pwc/pwc-if.c
drivers/media/video/pwc/pwc.h
drivers/misc/Kconfig
drivers/misc/asus-laptop.c
drivers/mmc/core/bus.c
drivers/mmc/core/host.c
drivers/mmc/host/sdhci.c
drivers/mmc/host/sdhci.h
drivers/net/Kconfig
drivers/net/forcedeth.c
drivers/net/mlx4/reset.c
drivers/net/ppp_generic.c
drivers/net/sky2.c
drivers/pci/hotplug/cpqphp_ctrl.c
drivers/pci/pci.h
drivers/pci/probe.c
drivers/pci/quirks.c
drivers/rtc/rtc-m41t80.c
drivers/rtc/rtc-max6902.c
drivers/s390/block/dasd_diag.c
drivers/s390/char/raw3270.c
drivers/s390/char/vmur.c
drivers/s390/char/vmur.h
drivers/s390/cio/cmf.c
drivers/s390/cio/device.c
drivers/s390/cio/device_id.c
drivers/s390/cio/qdio.c
drivers/scsi/Kconfig
drivers/serial/8250.c
drivers/serial/8250_pci.c
drivers/serial/serial_core.c
drivers/serial/serial_txx9.c
drivers/usb/Kconfig
drivers/usb/atm/cxacru.c
drivers/usb/atm/ueagle-atm.c
drivers/usb/class/cdc-acm.c
drivers/usb/core/driver.c
drivers/usb/core/hub.c
drivers/usb/core/message.c
drivers/usb/core/quirks.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/fsl_usb2_udc.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/host/Kconfig
drivers/usb/host/ehci-au1xxx.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-mem.c
drivers/usb/host/ehci-ppc-soc.c
drivers/usb/host/ehci-q.c
drivers/usb/host/ehci-sched.c
drivers/usb/host/ehci.h
drivers/usb/host/ohci-dbg.c
drivers/usb/host/r8a66597-hcd.c
drivers/usb/host/u132-hcd.c
drivers/usb/serial/airprime.c
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.h
drivers/usb/serial/garmin_gps.c
drivers/usb/serial/ipaq.c
drivers/usb/serial/option.c
drivers/usb/serial/oti6858.c
drivers/usb/serial/safe_serial.c
drivers/usb/serial/visor.c
drivers/usb/serial/visor.h
drivers/usb/storage/unusual_devs.h
drivers/usb/storage/usb.c
drivers/usb/storage/usb.h
drivers/video/au1100fb.c
drivers/video/console/newport_con.c
drivers/video/imsttfb.c
drivers/video/pxafb.c
drivers/w1/w1_int.c
drivers/zorro/zorro-sysfs.c
fs/9p/fid.c
fs/9p/fid.h
fs/autofs4/root.c
fs/cifs/CHANGES
fs/cifs/README
fs/cifs/TODO
fs/cifs/file.c
fs/cifs/sess.c
fs/direct-io.c
fs/ecryptfs/inode.c
fs/exec.c
fs/jffs2/write.c
fs/proc/array.c
fs/signalfd.c
fs/sysfs/bin.c
fs/sysfs/dir.c
include/asm-avr32/io.h
include/asm-avr32/pgalloc.h
include/asm-avr32/pgtable.h
include/asm-i386/io.h
include/asm-i386/mach-default/mach_wakecpu.h
include/asm-i386/mach-es7000/mach_wakecpu.h
include/asm-i386/nmi.h
include/asm-ia64/atomic.h
include/asm-ia64/hw_irq.h
include/asm-ia64/machvec.h
include/asm-ia64/machvec_init.h
include/asm-ia64/machvec_sn2.h
include/asm-m68k/ioctls.h
include/asm-m68k/page.h
include/asm-m68k/processor.h
include/asm-m68k/termbits.h
include/asm-m68k/termios.h
include/asm-m68knommu/pgtable.h
include/asm-powerpc/reg_booke.h
include/asm-s390/atomic.h
include/asm-s390/cio.h
include/asm-s390/diag.h [new file with mode: 0644]
include/asm-s390/pgalloc.h
include/asm-sh/dma-mapping.h
include/asm-sh64/dma-mapping.h
include/asm-sparc/sbus.h
include/asm-sparc/sfp-machine.h
include/asm-sparc64/elf.h
include/asm-sparc64/percpu.h
include/asm-sparc64/sfp-machine.h
include/asm-sparc64/system.h
include/asm-x86_64/nmi.h
include/linux/audit.h
include/linux/ide.h
include/linux/kbd_kern.h
include/linux/mempolicy.h
include/linux/mm.h
include/linux/mmzone.h
include/linux/mod_devicetable.h
include/linux/pci.h
include/linux/pci_ids.h
include/linux/sched.h
include/linux/security.h
include/linux/selection.h
include/linux/serial_reg.h
include/linux/videodev2.h
include/math-emu/op-common.h
include/math-emu/soft-fp.h
include/rdma/ib_mad.h
include/rdma/ib_verbs.h
kernel/auditsc.c
kernel/futex.c
kernel/irq/manage.c
kernel/module.c
kernel/posix-timers.c
kernel/printk.c
kernel/sched.c
kernel/sched_debug.c
kernel/signal.c
kernel/sysctl.c
lib/Kconfig
lib/Makefile
lib/iomap.c
mm/hugetlb.c
mm/mempolicy.c
mm/mmap.c
mm/nommu.c
mm/page_alloc.c
mm/slab.c
mm/slub.c
mm/sparse.c
mm/vmscan.c
net/802/psnap.c
net/8021q/vlanproc.c
net/9p/conv.c
net/9p/mux.c
net/ax25/ax25_iface.c
net/bridge/br_stp_if.c
net/bridge/br_sysfs_br.c
net/core/ethtool.c
net/dccp/ccids/ccid2.c
net/econet/af_econet.c
net/ipv4/netfilter/nf_nat_sip.c
net/ipv6/ip6_output.c
net/ipv6/ipv6_sockglue.c
net/irda/irmod.c
net/irda/irnetlink.c
net/mac80211/ieee80211.c
net/mac80211/ieee80211_sta.c
net/netfilter/nf_conntrack_sip.c
net/netfilter/xt_u32.c
net/socket.c
security/commoncap.c
security/dummy.c
security/selinux/hooks.c
security/selinux/ss/services.c

index 90ed23df1f68f6f14c0077d7a196c36c0db08c11..c917de681ccd7cde61ee94333234cd8ad8b70ecb 100644 (file)
@@ -316,7 +316,8 @@ CPU B:  spin_unlock_irqrestore(&amp;dev_lock, flags)
 
   <chapter id="pubfunctions">
      <title>Public Functions Provided</title>
-!Einclude/asm-i386/io.h
+!Iinclude/asm-i386/io.h
+!Elib/iomap.c
   </chapter>
 
 </book>
index f8cc3f8ed152742542e06cd14df7c99aae40f9cd..c64e969dc33bb6e511f78984c007052e9b6cbc54 100644 (file)
@@ -208,7 +208,7 @@ tools.  One such tool that is particularly recommended is the Linux
 Cross-Reference project, which is able to present source code in a
 self-referential, indexed webpage format. An excellent up-to-date
 repository of the kernel code may be found at:
-       http://sosdg.org/~coywolf/lxr/
+       http://users.sosdg.org/~qiyong/lxr/
 
 
 The development process
@@ -384,7 +384,7 @@ One of the best ways to put into practice your hacking skills is by fixing
 bugs reported by other people. Not only you will help to make the kernel
 more stable, you'll learn to fix real world problems and you will improve
 your skills, and other developers will be aware of your presence. Fixing
-bugs is one of the best ways to earn merit amongst the developers, because
+bugs is one of the best ways to get merits among other developers, because
 not many people like wasting time fixing other people's bugs.
 
 To work in the already reported bug reports, go to http://bugzilla.kernel.org.
index d6b45a9b29b4f6377e23a4415cdaea09e88d1845..397575880dc402d4e3330184b7d55277a94adb8e 100644 (file)
@@ -560,7 +560,7 @@ NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
   <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
 
 Kernel Documentation/CodingStyle:
-  <http://sosdg.org/~coywolf/lxr/source/Documentation/CodingStyle>
+  <http://users.sosdg.org/~qiyong/lxr/source/Documentation/CodingStyle>
 
 Linus Torvalds's mail on the canonical patch format:
   <http://lkml.org/lkml/2005/4/7/183>
index 24c5aade89987998260f956bfc16dacfe3d48841..cbee3a27f76889f04e7615caae54e8a867f39f5c 100644 (file)
@@ -196,7 +196,7 @@ void print_delayacct(struct taskstats *t)
               "IO    %15s%15s\n"
               "      %15llu%15llu\n"
               "MEM   %15s%15s\n"
-              "      %15llu%15llu\n"
+              "      %15llu%15llu\n",
               "count", "real total", "virtual total", "delay total",
               t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total,
               t->cpu_delay_total,
index b4d306ae923431d4844f42360f8cfdeb7e0753e4..f2e908d7f90d104fd23d166279f52a180afda822 100644 (file)
@@ -111,21 +111,21 @@ sub tda10045 {
 }
 
 sub tda10046 {
-    my $sourcefile = "tt_budget_217g.zip";
-    my $url = "http://www.technotrend.de/new/217g/$sourcefile";
-    my $hash = "6a7e1e2f2644b162ff0502367553c72d";
-    my $outfile = "dvb-fe-tda10046.fw";
-    my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
+       my $sourcefile = "TT_PCI_2.19h_28_11_2006.zip";
+       my $url = "http://technotrend-online.com/download/software/219/$sourcefile";
+       my $hash = "6a7e1e2f2644b162ff0502367553c72d";
+       my $outfile = "dvb-fe-tda10046.fw";
+       my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
 
-    checkstandard();
+       checkstandard();
 
-    wgetfile($sourcefile, $url);
-    unzip($sourcefile, $tmpdir);
-    extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24478, "$tmpdir/fwtmp");
-    verify("$tmpdir/fwtmp", $hash);
-    copy("$tmpdir/fwtmp", $outfile);
+       wgetfile($sourcefile, $url);
+       unzip($sourcefile, $tmpdir);
+       extract("$tmpdir/TT_PCI_2.19h_28_11_2006/software/OEM/PCI/App/ttlcdacc.dll", 0x65389, 24478, "$tmpdir/fwtmp");
+       verify("$tmpdir/fwtmp", $hash);
+       copy("$tmpdir/fwtmp", $outfile);
 
-    $outfile;
+       $outfile;
 }
 
 sub tda10046lifeview {
index bbd8b28c13de917dc3bdc6d04b1bc38e9aea2768..cda6905cbe49cac2f73dfd0437a53940c25810df 100644 (file)
@@ -6,12 +6,26 @@ ABOUT
 
 v9fs is a Unix implementation of the Plan 9 9p remote filesystem protocol.
 
-This software was originally developed by Ron Minnich <rminnich@lanl.gov>
-and Maya Gokhale <maya@lanl.gov>.  Additional development by Greg Watson
+This software was originally developed by Ron Minnich <rminnich@sandia.gov>
+and Maya Gokhale.  Additional development by Greg Watson
 <gwatson@lanl.gov> and most recently Eric Van Hensbergen
 <ericvh@gmail.com>, Latchesar Ionkov <lucho@ionkov.net> and Russ Cox
 <rsc@swtch.com>.
 
+The best detailed explanation of the Linux implementation and applications of
+the 9p client is available in the form of a USENIX paper:
+   http://www.usenix.org/events/usenix05/tech/freenix/hensbergen.html
+
+Other applications are described in the following papers:
+       * XCPU & Clustering
+               http://www.xcpu.org/xcpu-talk.pdf
+       * KVMFS: control file system for KVM
+               http://www.xcpu.org/kvmfs.pdf
+       * CellFS: A New ProgrammingModel for the Cell BE
+               http://www.xcpu.org/cellfs-talk.pdf
+       * PROSE I/O: Using 9p to enable Application Partitions
+               http://plan9.escet.urjc.es/iwp9/cready/PROSE_iwp9_2006.pdf
+
 USAGE
 =====
 
@@ -90,9 +104,9 @@ subset of the namespace by extending the path: '#U*'/tmp would just export
 and export.
 
 A Linux version of the 9p server is now maintained under the npfs project
-on sourceforge (http://sourceforge.net/projects/npfs).  There is also a
-more stable single-threaded version of the server (named spfs) available from
-the same CVS repository.
+on sourceforge (http://sourceforge.net/projects/npfs).  The currently
+maintained version is the single-threaded version of the server (named spfs)
+available from the same CVS repository.
 
 There are user and developer mailing lists available through the v9fs project
 on sourceforge (http://sourceforge.net/projects/v9fs).
diff --git a/Documentation/ko_KR/HOWTO b/Documentation/ko_KR/HOWTO
new file mode 100644 (file)
index 0000000..b51d7ca
--- /dev/null
@@ -0,0 +1,623 @@
+NOTE:
+This is a version of Documentation/HOWTO translated into korean
+This document is maintained by minchan Kim < minchan.kim@gmail.com>
+If you find any difference between this document and the original file or
+a problem with the translation, please contact the maintainer of this file.
+
+Please also note that the purpose of this file is to be easier to
+read for non English (read: korean) speakers and is not intended as
+a fork. So if you have any comments or updates for this file please
+try to update the original English file first.
+
+==================================
+이 문서는
+Documentation/HOWTO
+의 한글 번역입니다.
+
+역자: 김민찬 <minchan.kim@gmail.com >
+감수: 이제이미 <jamee.lee@samsung.com>
+==================================
+
+어떻게 리눅스 커널 개발을 하는가
+---------------------------------
+
+이 문서는 커널 개발에 있어 가장 중요한 문서이다. 이 문서는
+리눅스 커널 개발자가 되는 법과 리눅스 커널 개발 커뮤니티와 일하는
+법을 담고있다. 커널 프로그래밍의기술적인 측면과 관련된 내용들은
+포함하지 않으려고 하였지만 올바으로 여러분을 안내하는 데 도움이
+될 것이다.
+
+이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인트너에게
+패치를 보내달라.
+
+
+소개
+----
+
+자, 여러분은 리눅스 커널 개발자가 되는 법을 배우고 싶은가? 아니면
+상사로부터"이 장치를 위한 리눅스 드라이버를 작성하시오"라는 말을
+들었는가? 이 문서는 여러분이 겪게 될 과정과 커뮤니티와 일하는 법을
+조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주는
+것이다.
+
+커널은 대부분은 C로 작성되었어고 몇몇 아키텍쳐의 의존적인 부분은
+어셈블리로 작성되었다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다.
+여러분이 특정 아키텍쳐의 low-level 개발을 할 것이 아니라면
+어셈블리(특정 아키텍쳐)는 잘 알아야 할 필요는 없다.
+다음의 참고서적들은 기본에 충실한 C 교육이나 수년간의 경험에 견주지는
+못하지만 적어도 참고 용도로는 좋을 것이다
+ - "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
+ - "Practical C Programming" by Steve Oualline [O'Reilly]
+ - "C:  A Reference Manual" by Harbison and Steele [Prentice Hall]
+
+커널은 GNU C와 GNU 툴체인을 사용하여 작성되었다. 이 툴들은 ISO C89 표준을
+따르는 반면 표준에 있지 않은 많은 확장기능도 가지고 있다. 커널은 표준 C
+라이브러리와는 관계없이 freestanding C 환경이어서 C 표준의 일부는
+지원되지 않는다. 임의의 long long 나누기나 floating point는 지원되지 않는다.
+때론 이런 이유로 커널이 그런 확장 기능을 가진 툴체인을 가지고 만들어졌다는
+것이 이해하기 어려울 수도 있고 게다가 불행하게도 그런 것을 정확하게 설명하는
+어떤 참고문서도 있지 않다. 정보를 얻기 위해서는 gcc info (`info gcc`)페이지를
+살펴보라.
+
+여러분은 기존의 개발 커뮤니티와 일하는 법을 배우려고 하고 있다는 것을
+기억하라. 코딩, 스타일, 절차에 관한 훌륭한 표준을 가진 사람들이 모인
+다양한 그룹이 있다. 이 표준들은 오랜동안 크고 지역적으로 분산된 팀들에
+의해 가장 좋은 방법으로 일하기위하여 찾은 것을 기초로 만들어져왔다.
+그 표준들은 문서화가 잘 되어 있기 때문에 가능한한 미리 많은 표준들에
+관하여 배우려고 시도하라. 다른 사람들은 여러분이나 여러분의 회사가
+일하는 방식에 적응하는 것을 원하지는 않는다.
+
+
+법적 문제
+---------
+
+리눅스 커널 소스 코드는 GPL로 배포(release)되었다. 소스트리의 메인
+디렉토리에 있는 라이센스에 관하여 상세하게 쓰여 있는 COPYING이라는
+파일을 봐라.여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면
+리눅스 커널 메일링 리스트에 묻지말고 변호사와 연락하라. 메일링
+리스트들에 있는 사람들은 변호사가 아니기 때문에 법적 문제에 관하여
+그들의 말에 의지해서는 안된다.
+
+GPL에 관한 잦은 질문들과 답변들은 다음을 참조하라.
+    http://www.gnu.org/licenses/gpl-faq.html
+
+
+문서
+----
+
+리눅스 커널 소스 트리는 커널 커뮤니티와 일하는 법을 배우기 위한 많은
+귀중한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때,
+그 기능을 어떻게 사용하는지에 관한 설명을 위하여 새로운 문서 파일을
+추가하는 것을 권장한다. 커널이 유저스페이스로 노출하는 인터페이스를
+변경하게 되면 변경을 설명하는 메뉴얼 페이지들에 대한 패치나 정보를
+mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
+
+다음은 커널 소스 트리에 있는 읽어야 할 파일들의 리스트이다.
+  README
+    이 파일은 리눅스 커널에 관하여 간단한 배경 설명과 커널을 설정하고
+    빌드하기 위해 필요한 것을 설명한다. 커널에 입문하는 사람들은 여기서
+    시작해야 한다.
+
+  Documentation/Changes
+    이 파일은 커널을 성공적으로 빌드하고 실행시키기 위해 필요한 다양한
+    소프트웨어 패키지들의 최소 버젼을 나열한다.
+
+  Documentation/CodingStyle
+    이 문서는 리눅스 커널 코딩 스타일과 그렇게 한 몇몇 이유를 설명한다.
+    모든 새로운 코드는 이 문서에 가이드라인들을 따라야 한다. 대부분의
+    메인트너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이
+    그 패치가 올바른 스타일일 경우만 코드를 검토할 것이다.
+
+  Documentation/SubmittingPatches
+  Documentation/SubmittingDrivers
+    이 파일들은 성공적으로 패치를 만들고 보내는 법을 다음의 내용들로
+    굉장히 상세히 설명하고 있다(그러나 다음으로 한정되진 않는다).
+       - Email 내용들
+       - Email 양식
+       - 그것을 누구에게 보낼지
+    이러한 규칙들을 따르는 것이 성공을 보장하진 않는다(왜냐하면 모든
+    패치들은 내용과 스타일에 관하여 면밀히 검토되기 때문이다).
+    그러나 규칙을 따르지 않는다면 거의 성공하지도 못할 것이다.
+
+    올바른 패치들을 만드는 법에 관한 훌륭한 다른 문서들이 있다.
+    "The Perfect Patch"
+        http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
+    "Linux kernel patch submission format"
+        http://linux.yyz.us/patch-format.html
+
+   Documentation/stable_api_nonsense.txt
+    이 문서는 의도적으로 커널이 변하지 않는 API를 갖지 않도록 결정한
+    이유를 설명하며 다음과 같은 것들을 포함한다.
+       - 서브시스템 shim-layer(호환성을 위해?)
+       - 운영 체제들 간의 드라이버 이식성
+       - 커널 소스 트리내에 빠른 변화를 늦추는 것(또는 빠른 변화를 막는 것)
+    이 문서는 리눅스 개발 철학을 이해하는데 필수적이며 다른 운영체제에서
+    리눅스로 옮겨오는 사람들에게는 매우 중요하다.
+
+
+  Documentation/SecurityBugs
+    여러분들이 리눅스 커널의 보안 문제를 발견했다고 생각한다면 이 문서에
+    나온 단계에 따라서 커널 개발자들에게 알리고 그 문제를 해결할 수 있도록
+    도와 달라.
+
+  Documentation/ManagementStyle
+    이 문서는 리눅스 커널 메인트너들이 어떻게 그들의 방법론의 정신을
+    어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는
+    모든 사람들(또는 커널 개발에 작은 호기심이라도 있는 사람들)이
+    읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인트너들의
+    독특한 행동에 관하여 흔히 있는 오해들과 혼란들을 해소하고 있기
+    때문이다.
+
+  Documentation/stable_kernel_rules.txt
+    이 문서는 안정적인 커널 배포가 이루어지는 규칙을 설명하고 있으며
+    여러분들이 이러한 배포들 중 하나에 변경을 하길 원한다면
+    무엇을 해야 하는지를 설명한다.
+
+  Documentation/kernel-docs.txt
+    커널 개발에 관계된 외부 문서의 리스트이다. 커널 내의 포함된 문서들
+    중에 여러분이 찾고 싶은 문서를 발견하지 못할 경우 이 리스트를
+    살펴보라.
+
+  Documentation/applying-patches.txt
+    패치가 무엇이며 그것을 커널의 다른 개발 브랜치들에 어떻게
+    적용하는지에 관하여 자세히 설명 하고 있는 좋은 입문서이다.
+
+커널은 소스 코드 그 자체에서 자동적으로 만들어질 수 있는 많은 문서들을
+가지고 있다. 이것은 커널 내의 API에 대한 모든 설명, 그리고 락킹을
+올바르게 처리하는 법에 관한 규칙을 포함하고 있다. 이 문서는
+Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, HTML,
+그리고 man 페이지들로 다음과 같이 실행하여 만들어 진다.
+         make pdfdocs
+         make psdocs
+         make htmldocs
+         make mandocs
+각각의 명령을 메인 커널 소스 디렉토리로부터 실행한다.
+
+
+커널 개발자가 되는 것
+---------------------
+
+여러분이 리눅스 커널 개발에 관하여 아무것도 모른다면 Linux KernelNewbies
+프로젝트를 봐야 한다.
+    http://kernelnewbies.org
+그곳은 거의 모든 종류의 기본적인 커널 개발 질문들(질문하기 전에 먼저
+아카이브를 찾아봐라. 과거에 이미 답변되었을 수도 있다)을 할수있는 도움이
+될만한 메일링 리스트가 있다. 또한 실시간으로 질문 할수 있는 IRC 채널도
+가지고 있으며 리눅스 커널 개발을 배우는 데 유용한 문서들을 보유하고 있다.
+
+웹사이트는 코드구성, 서브시스템들, 그리고 현재 프로젝트들
+(트리 내, 외부에 존재하는)에 관한 기본적인 정보들을 가지고 있다. 또한
+그곳은 커널 컴파일이나 패치를 하는 법과 같은 기본적인 것들을  설명한다.
+
+여러분이 어디서 시작해야 할진 모르지만 커널 개발 커뮤니티에 참여할 수
+있는 일들을 찾길 원한다면 리눅스 커널 Janitor 프로젝트를 살펴봐라.
+         http://janitor.kernelnewbies.org/
+그곳은 시작하기에 아주 딱 좋은 곳이다. 그곳은 리눅스 커널 소스 트리내에
+간단히 정리되고 수정될 수 있는 문제들에 관하여 설명한다. 여러분은 이
+프로젝트를 대표하는 개발자들과 일하면서 자신의 패치를 리눅스 커널 트리에
+반영하기 위한 기본적인 것들을 배우게 될것이며 여러분이 아직 아이디어를
+가지고 있지 않다면 다음에 무엇을 해야할지에 관한 방향을 배울 수 있을
+것이다.
+
+여러분들이 이미 커널 트리에 반영하길 원하는 코드 묶음을 가지고 있지만
+올바른 포맷으로 포장하는데 도움이 필요하다면 그러한 문제를 돕기 위해
+만들어진 kernel-mentors 프로젝트가 있다. 그곳은 메일링 리스트이며
+다음에서 참조할 수 있다.
+         http://selenic.com/mailman/listinfo/kernel-mentors
+
+리눅스 커널 코드에 실제 변경을 하기 전에 반드시 그 코드가 어떻게
+동작하는지 이해하고 있어야 한다. 코드를 분석하기 위하여 특정한 툴의
+도움을 빌려서라도 코드를 직접 읽는 것보다 좋은 것은 없다(대부분의
+자잘한 부분들은 잘 코멘트되어 있다). 그런 툴들 중에 특히 추천할만한
+것은 Linux Cross-Reference project이며 그것은 자기 참조 방식이며
+소스코드를 인덱스된 웹 페이지들의 형태로 보여준다. 최신의 멋진 커널
+코드 저장소는 다음을 통하여 참조할 수 있다.
+      http://sosdg.org/~coywolf/lxr/
+
+
+개발 프로세스
+-------------
+
+리눅스 커널 개발 프로세스는 현재 몇몇 다른 메인 커널 "브랜치들"과
+서브시스템에 특화된 커널 브랜치들로 구성된다. 몇몇 다른 메인
+브랜치들은 다음과 같다.
+  - main 2.6.x 커널 트리
+  - 2.6.x.y - 안정된 커널 트리
+  - 2.6.x -git 커널 패치들
+  - 2.6.x -mm 커널 패치들
+  - 서브시스템을 위한 커널 트리들과 패치들
+
+2.6.x 커널 트리
+---------------
+
+2.6.x 커널들은 Linux Torvalds가 관리하며 kernel.org의 pub/linux/kernel/v2.6/
+디렉토리에서 참조될 수 있다.개발 프로세스는 다음과 같다.
+  - 새로운 커널이 배포되자마자 2주의 시간이 주어진다. 이 기간동은
+    메인트너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은
+    몇 주 동안 -mm 커널내에 이미 있었던 것들이다. 큰 변경들을 제출하는 데
+    선호되는 방법은  git(커널의 소스 관리 툴, 더 많은 정보들은 http://git.or.cz/
+    에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내도
+    것도 무관하다.
+  - 2주 후에 -rc1 커널이 배포되며 지금부터는 전체 커널의 안정성에 영향을
+    미칠수 있는 새로운 기능들을 포함하지 않는 패치들만을 추가될 수 있다.
+    완전히 새로운 드라이버(혹은 파일시스템)는 -rc1 이후에만 받아들여진다는
+    것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가
+    드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은
+    퇴보(regression)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
+    배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은
+    공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다.
+  - 새로운 -rc는 Linus는 현재 git tree가 테스트 하기에 충분히 안정된 상태에
+    있다고 판단될 때마다 배포된다. 목표는 새로운 -rc 커널을 매주 배포하는
+    것이다.
+  - 이러한 프로세스는 커널이 "준비"되었다고 여겨질때까지 계속된다.
+    프로세스는 대체로 6주간 지속된다.
+    - 각 -rc 배포에 있는 알려진 퇴보의 목록들은 다음 URI에 남겨진다.
+    http://kernelnewbies.org/known_regressions
+
+커널 배포에 있어서 언급할만한 가치가 있는 리눅스 커널 메일링 리스트의
+Andrew Morton의 글이 있다.
+        "커널이 언제 배포될지는 아무로 모른다. 왜냐하면 배포는 알려진
+         버그의 상황에 따라 배포되는 것이지 미리정해 놓은 시간에 따라
+          배포되는 것은 아니기 때문이다."
+
+2.6.x.y - 안정 커널 트리
+------------------------
+
+4 자리 숫자로 이루어진 버젼의 커널들은 -stable 커널들이다. 그것들은 2.6.x
+커널에서 발견된 큰 퇴보들이나 보안 문제들 중 비교적 작고 중요한 수정들을
+포함한다.
+
+이것은 가장 최근의 안정적인 커널을 원하는 사용자에게 추천되는 브랜치이며,
+개발/실험적 버젼을 테스트하는 것을 돕는데는 별로 관심이 없다.
+
+어떤 2.6.x.y 커널도 사용가능하지 않다면 그때는 가장 높은 숫자의 2.6.x
+커널이 현재의 안정 커널이다.
+
+2.6.x.y는 "stable" 팀<stable@kernel.org>에 의해 관리되며 거의 매번 격주로
+배포된다.
+
+커널 트리 문서들 내에 Documentation/stable_kernel_rules.txt 파일은 어떤
+종류의 변경들이 -stable 트리로 들어왔는지와 배포 프로세스가 어떻게
+진행되는지를 설명한다.
+
+
+2.6.x -git 패치들
+------------------
+git 저장소(그러므로 -git이라는 이름이 붙음)에는 날마다 관리되는 Linus의
+커널 트리의 snapshot 들이 있다. 이 패치들은 일반적으로 날마다 배포되며
+Linus의 트리의 현재 상태를 나타낸다. 이 패치들은 정상적인지 조금도
+살펴보지 않고 자동적으로 생성된 것이므로 -rc 커널들 보다도 더 실험적이다.
+
+2.6.x -mm 커널 패치들
+---------------------
+Andrew Morton에 의해 배포된 실험적인 커널 패치들이다. Andrew는 모든 다른
+서브시스템 커널 트리와 패치들을 가져와서 리눅스 커널 메일링 리스트로
+온 많은 패치들과 한데 묶는다. 이 트리는 새로운 기능들과 패치들을 위한
+장소를 제공하는 역할을 한다. 하나의 패치가 -mm에 한동안 있으면서 그 가치가
+증명되게 되면 Andrew나 서브시스템 메인트너는 그것을 메인라인에 포함시키기
+위하여 Linus에게 보낸다.
+
+커널 트리에 포함하고 싶은 모든 새로운 패치들은 Linus에게 보내지기 전에
+-mm 트리에서 테스트를 하는 것을 적극 추천한다.
+
+이 커널들은 안정되게 사용할 시스템에서에 실행하는 것은 적합하지 않으며
+다른 브랜치들의 어떤 것들보다 위험하다.
+
+여러분이 커널 개발 프로세스를 돕길 원한다면 이 커널 배포들을 사용하고
+테스트한 후 어떤 문제를 발견하거나 또는 모든 것이 잘 동작한다면 리눅스
+커널 메일링 리스트로 피드백을 해달라.
+
+이 커널들은 일반적으로 모든 다른 실험적인 패치들과 배포될 당시의
+사용가능한 메인라인 -git 커널들의 몇몇 변경을 포함한다.
+
+-mm 커널들은 정해진 일정대로 배포되지 않는다. 하지만 대개 몇몇 -mm 커널들은
+각 -rc 커널(1부터 3이 흔함) 사이에서 배포된다.
+
+서브시스템 커널 트리들과 패치들
+-------------------------------
+많은 다른 커널 서브시스템 개발자들은 커널의 다른 부분들에서 무슨 일이
+일어나고 있는지를 볼수 있도록 그들의 개발 트리를 공개한다. 이 트리들은
+위에서 설명하였던 것 처럼 -mm 커널 배포들로 합쳐진다.
+
+다음은  활용가능한 커널 트리들을 나열한다.
+  git trees:
+    - Kbuild development tree, Sam Ravnborg < sam@ravnborg.org>
+    git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
+
+    - ACPI development tree, Len Brown <len.brown@intel.com >
+    git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
+
+    - Block development tree, Jens Axboe <axboe@suse.de>
+    git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
+
+    - DRM development tree, Dave Airlie <airlied@linux.ie>
+    git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
+
+    - ia64 development tree, Tony Luck < tony.luck@intel.com>
+    git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
+
+    - infiniband, Roland Dreier <rolandd@cisco.com >
+    git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
+
+    - libata, Jeff Garzik <jgarzik@pobox.com>
+    git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
+
+    - network drivers, Jeff Garzik <jgarzik@pobox.com>
+    git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
+
+    - pcmcia, Dominik Brodowski < linux@dominikbrodowski.net>
+    git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
+
+    - SCSI, James Bottomley < James.Bottomley@SteelEye.com>
+    git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
+
+  quilt trees:
+    - USB, PCI, Driver Core, and I2C, Greg Kroah-Hartman < gregkh@suse.de>
+    kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
+    - x86-64, partly i386, Andi Kleen < ak@suse.de>
+        ftp.firstfloor.org:/pub/ak/x86_64/quilt/
+
+  다른 커널 트리들은 http://kernel.org/git와 MAINTAINERS 파일에서 참조할 수
+  있다.
+
+버그 보고
+---------
+bugzilla.kernel.org는 리눅스 커널 개발자들이 커널의 버그를 추적하는 곳이다.
+사용자들은 발견한 모든 버그들을 보고하기 위하여 이 툴을 사용할 것을 권장한다.
+kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라.
+    http://test.kernel.org/bugzilla/faq.html
+
+메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그일 것 같은
+것을 보고하는는 법에 관한 좋은 템플릿이고 문제를 추적하기 위해서 커널
+개발자들이 필요로 하는 정보가 무엇들인지를 상세히 설명하고 있다.
+
+
+버그 리포트들의 관리
+--------------------
+
+여러분의 해킹 기술을 연습하는 가장 좋은 방법 중의 하는 다른 사람들이
+보고한 버그들을 수정하는 것이다. 여러분은 커널을 더욱 안정화시키는데
+도움을 줄 뿐만이 아니라 실제있는 문제들을 수정하는 법을 배우게 되고
+그와 함께 여러분들의 기술은 향상될 것이며 다른 개발자들이 여러분의
+존재에 대해 알게 될 것이다. 버그를 수정하는 것은 개발자들  사이에서
+점수를 얻을 수 있는 가장 좋은 방법중의 하나이다. 왜냐하면 많은 사람들은
+다른 사람들의 버그들을 수정하기 위하여 시간을 낭비하지 않기 때문이다.
+
+이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernelorg를
+참조하라. 여러분이 앞으로 생겨날 버그 리포트들의 조언자가 되길 원한다면
+bugme-new 메일링 리스트나(새로운 버그 리포트들만이 이곳에서 메일로 전해진다)
+bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메일로 전해진다)
+에 등록하면 된다.
+
+      http://lists.osdl.org/mailman/listinfo/bugme-new
+      http://lists.osdl.org/mailman/listinfo/bugme-janitors
+
+
+
+메일링 리스트들
+---------------
+
+위의 몇몇 문서들이 설명하였지만 핵심 커널 개발자들의 대다수는
+리눅스 커널 메일링 리스트에 참여하고 있다. 리스트에 등록하고 해지하는
+방법에 관한 자세한 사항은 다음에서 참조할 수 있다.
+    http://vger.kernel.org/vger-lists.html#linux-kernel
+웹상의 많은 다른 곳에도 메일링 리스트의 아카이브들이 있다.
+이러한 아카이브들을 찾으려면 검색 엔진을 사용하라. 예를 들어:
+      http://dir.gmane.org/gmane.linux.kernel
+여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 대한
+것을 아카이브에서 먼저 찾기를 강력히 권장한다. 이미 상세하게 토론된 많은
+것들이 메일링 리스트의 아카이브에 기록되어 있다.
+
+각각의 커널 서브시스템들의 대부분은 자신들의 개발에 관한 노력들로 이루어진
+분리된 메일링 리스트를 따로 가지고 있다. 다른 그룹들이 무슨 리스트를 가지고
+있는지는 MAINTAINERS 파일을 참조하라.
+
+많은 리스트들은 kernel.org에서 호스트되고 있다. 그 정보들은 다음에서 참조될 수 있다.
+         http://vger.kernel.org/vger-lists.html
+
+리스트들을 사용할 때는 올바른 예절을 따를 것을 유념해라.
+대단하진 않지만 다음 URL은 리스트(혹은 모든 리스트)와 대화하는 몇몇 간단한
+가이드라인을 가지고 있다.
+         http://www.albion.com/netiquette/
+
+여러 사람들이 여러분의 메일에 응답한다면 CC: 즉 수신 리스트는 꽤 커지게
+될 것이다. 아무 이유없이 CC에서 어떤 사람도 제거하거나 리스트 주소로만
+회신하지 마라. 메일을 보낸 사람으로서 하나를 받고 리스트로부터 또
+하나를 받아 두번 받는 것에 익숙하여 있으니 mail-header를 조작하려고 하지
+말아라. 사람들은 그런 것을 좋아하지 않을 것이다.
+
+여러분의 회신의 문맥을 원래대로 유지해야 한다. 여러분들의 회신의 윗부분에
+"John 커널해커는 작성했다...."를 유지하며 여러분들의 의견을 그 메일의 윗부분에
+작성하지 말고 각 인용한 단락들 사이에 넣어라.
+
+여러분들이 패치들을 메일에 넣는다면 그것들은 Documentation/SubmittingPatches에
+나와있는데로 명백히(plain) 읽을 수 있는 텍스트여야 한다. 커널 개발자들은
+첨부파일이나 압축된 패치들을 원하지 않는다. 그들은 여러분들의 패치의
+각 라인 단위로 코멘트를 하길 원하며 압축하거나 첨부하지 않고 보내는 것이
+그렇게 할 수 있는 유일한 방법이다. 여러분들이 사용하는 메일 프로그램이
+스페이스나 탭 문자들을 조작하지 않는지 확인하라. 가장 좋은 첫 테스트는
+메일을 자신에게 보내보고 스스로 그 패치를 적용해보라. 그것이 동작하지
+않는다면 여러분의 메일 프로그램을 고치던가 제대로 동작하는 프로그램으로
+바꾸어라.
+
+무엇보다도 메일링 리스트의 다른 구독자들에게 보여주려 한다는 것을 기억하라.
+
+
+커뮤니티와 일하는 법
+--------------------
+
+커널 커뮤니티의 목적은 가능한한 가장 좋은 커널을 제공하는 것이다. 여러분이
+받아들여질 패치를 제출하게 되면 그 패치의 기술적인 이점으로 검토될 것이다.
+그럼 여러분들은 무엇을 기대하고 있어야 하는가?
+ - 비판
+ - 의견
+ - 변경을 위한 요구
+ - 당위성을 위한 요구
+ - 고요
+
+기억하라. 이것들은 여러분의 패치가 커널로 들어가기 위한 과정이다. 여러분의
+패치들은 비판과 다른 의견을 받을 수 있고 그것들을 기술적인 레벨로 평가하고
+재작업하거나 또는 왜 수정하면 안되는지에 관하여 명료하고 간결한 이유를
+말할 수 있어야 한다. 여러분이 제출한 것에 어떤 응답도 있지 않다면 몇 일을
+기다려보고 다시 시도해라. 때론 너무 많은 메일들 속에 묻혀버리기도 한다.
+
+여러분은 무엇을 해서는 안되는가?
+ - 여러분의 패치가 아무 질문 없이 받아들여지기를 기대하는 것
+ - 방어적이 되는 것
+ - 의견을 무시하는 것
+ - 요청된 변경을 하지 않고 패치를 다시 제출하는 것
+
+가능한한 가장 좋은 기술적인 해답을 찾고 있는 커뮤니티에서는 항상
+어떤 패치가 얼마나 좋은지에 관하여 다른 의견들이 있을 수 있다. 여러분은
+협조적이어야 하고 기꺼이 여러분의 생각을 커널 내에 맞추어야 한다. 아니면
+적어도 여러분의 것이 가치있다는 것을 중명하여야 한다. 잘못된 것도 여러분이
+올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을
+기억하라.
+
+여러분의 첫 패치에  여러분이 수정해야하는 십여개 정도의 회신이 오는
+경우도 흔하다. 이것은 여러분의 패치가 받아들여지지 않을 것이라는 것을
+의미하는 것이 아니고 개인적으로 여러분에게 감정이 있어서 그러는 것도
+아니다. 간단히 여러분의 패치에 제기된 문제들을 수정하고 그것을 다시
+보내라.
+
+
+커널 커뮤니티와 기업 조직간의 차이점
+-----------------------------------------------------------------
+커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의
+문제를 피하기 위한 목록이 있다.
+  여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 :
+    - " 이것은 여러 문제들을 해겹합니다."
+    - "이것은 2000 라인의 코드를 제거합니다."
+    - "이것은 내가 말하려는 것에 관해 설명하는 패치입니다."
+    - "나는 5개의 다른 아키텍쳐에서 그것을 테스트했슴으로..."
+    - "여기에 일련의 작은 패치들이 있습음로..."
+    - "이것은 일반적인 머신에서 성능을 향상시키므로..."
+
+  여러분들이 말할 때 피해야 할 좋지 않은 것들 :
+    - "우리를 그것을 AIT/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀립없다..."
+    - "나는 20년동안 이것을 해왔다. 그러므로..."
+    - "이것은 돈을 벌기위해 나의 회사가 필요로 하는 것이다."
+    - "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다."
+    - "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다."
+    - "나는 6달동안 이것을 했으니..."
+    - "여기세 5000라인 짜리 패치가 있으니..."
+    - "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..."
+    - "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다."
+
+커널 커뮤니티가 전통적인 소프트웨어 엔지니어링 개발 환경들과
+또 다른 점은 얼굴을 보지 않고 일한다는 점이다. 이메일과 irc를 대화의
+주요수단으로 사용하는 것의 한가지 장점은 성별이나 인종의 차별이
+없다는 것이다. 리눅스 커널의 작업 환경에서는 단지 이메일 주소만
+알수 있기 때문에 여성과 소수 민족들도 모두 받아들여진다. 국제적으로
+일하게 되는 측면은 사람의 이름에 근거하여 성별을 추측할 수 없게
+하기때문에  차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와
+Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅스 커널에서
+작업하며 생각을 표현해왔던 대부분의 여성들은 긍정적인 경험을 가지고
+있다.
+
+언어 장벽은 영어에 익숙하지 않은 몇몇 사람들에게 문제가 될 수도 있다.
+ 언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을
+표현하기 위하여 필요하다. 그래서 여러분은 이메일을 보내기 전에
+영어를 올바르게 사용하고 있는지를 체크하는 것이 바람직하다.
+
+
+여러분의 변경을 나누어라
+------------------------
+
+리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음을 쉽게
+받아들이지 않는다. 변경은 적절하게 소개되고, 검토되고, 각각의
+부분으로 작게 나누어져야 한다. 이것은 회사에서 하는 것과는 정확히
+반대되는 것이다. 여러분들의 제안은 개발 초기에 일찍이 소개되야 한다.
+그래서 여러분들은 자신이 하고 있는 것에 관하여 피드백을 받을 수 있게
+된다. 커뮤니티가 여러분들이 커뮤니티와 함께 일하고 있다는 것을
+느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로서
+사용되지 않고 있다는 것을 느끼게 하자. 그러나 메일링 리스트에 한번에
+50개의 이메일을 보내지는 말아라. 여러분들의 일련의 패치들은 항상
+더 작아야 한다.
+
+패치를 나누는 이유는 다음과 같다.
+
+1) 작은 패치들은 여러분의 패치들이 적용될 수 있는 확률을 높여준다.
+   왜냐하면 다른 사람들은 정확성을 검증하기 위하여 많은 시간과 노력을
+   들이기를 원하지 않는다. 5줄의 패치는 메인트너가 거의 몇 초간 힐끗
+   보면 적용될 수 있다. 그러나 500 줄의 패치는 정확성을 검토하기 위하여
+   몇시간이 걸릴 수도 있다(걸리는 시간은 패치의 크기 혹은 다른 것에
+   비례하여 기하급수적으로 늘어난다).
+
+   패치를 작게 만드는 것은 무엇인가 잘못되었을 때 디버그하는 것을
+   쉽게 만든다. 즉, 그렇게 만드는 것은 매우 큰 패치를 적용한 후에
+   조사하는 것 보다 작은 패치를 적용한 후에 (그리고 몇몇의 것이
+   깨졌을 때) 하나씩 패치들을 제거해가며 디버그 하기 쉽도록 만들어 준다.
+
+2) 작은 패치들을 보내는 것뿐만 아니라 패치들을 제출하기전에 재작성하고
+   간단하게(혹은 간단한게 재배치하여) 하는 것도 중요하다.
+
+여기에 커널 개발자 Al Viro의 이야기가 있다.
+    "학생의 수학 숙제를 채점하는 선생님을 생각해보라. 선생님은 학생들이
+    답을 얻을때까지 겪은 시행착오를 보길 원하지 않는다. 선생님들은
+    간결하고 가장 뛰어난 답을 보길 원한다. 훌륭한 학생은 이것을 알고
+    마지막으로 답을 얻기 전 중간 과정들을 제출하진 않는다.
+
+    커널 개발도 마찬가지이다. 메인트너들과 검토하는 사람들은 문제를
+    풀어나가는 과정속에 숨겨진 과정을 보길 원하진 않는다. 그들은
+    간결하고 멋진 답을 보길 원한다."
+
+커뮤니티와 함께 일하며 뛰어난 답을 찾고 여러분들의 완성되지 않은 일들
+사이에 균형을 유지해야 하는 어려움이 있을 수 있다. 그러므로 프로세스의
+초반에 여러분의 일을 향상시키기위한 피드백을 얻는 것 뿐만 아니라
+여러분들의 변경들을 작은 묶음으로 유지해서 심지어는 여러분의 작업의
+모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 이미
+받아들여질 수 있도록 유지하는 것이 바람직하다.
+
+또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들은 포함하는
+패치들은 받아들여지지 않을 것이라는 점을 유념하라.
+
+변경을 정당화해라
+-----------------
+
+여러분들의 나누어진 패치들을 리눅스 커뮤니티가 왜 반영해야 하는지를
+알도록 하는 것은 매우 중요하다. 새로운 기능들이 필요하고 유용하다는
+것은 반드시 그에 맞는 이유가 있어야 한다.
+
+
+변경을 문서화해라
+-----------------
+
+여러분이 패치를 보내려 할때는 여러분이 무엇을 말하려고 하는지를 충분히
+생각하여 이메일을 작성해야 한다. 이 정보는 패치를 위한 ChangeLog가 될
+것이다. 그리고 항상 그 내용을 보길 원하는 모든 사람들을 위해 보존될
+것이다. 패치는 완벽하게 다음과 같은 내용들을 포함하여 설명해야 한다.
+  - 변경이 왜 필요한지
+  - 패치에 관한 전체 설계 어프로치
+  - 구현 상세들
+  - 테스트 결과들
+
+이것이 무엇인지 더 자세한 것을 알고 싶다면 다음 문서의 ChageLog 항을 봐라.
+   "The Perfect Patch"
+    http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
+
+
+
+
+이 모든 것을 하는 것은 매우 어려운 일이다. 완벽히 소화하는 데는 적어도 몇년이
+걸릴 수도 있다. 많은 인내와 결의가 필요한 계속되는 개선의 과정이다. 그러나
+가능한한 포기하지 말라. 많은 사람들은 이전부터 해왔던 것이고 그 사람들도
+정확하게 여러분들이 지금 서 있는 그 곳부터  시작했었다.
+
+
+
+
+----------
+"개발 프로세스"(http://linux.tar.gz/articles/2.6-development_process) 섹션을
+작성하는데 있어 참고할 문서를 사용하도록 허락해준 Paolo Ciarrocchi에게
+감사한다. 여러분들이 말해야 할 것과 말해서는 안되는 것의 목록 중 일부를 제공해준
+Randy Dunlap과 Gerrit Huizenga에게 감사한다. 또한 검토와 의견 그리고
+공헌을 아끼지 않은 Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
+Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi Kleen,
+Vadim Lobanov, Jesper Juhl, Adrian Bunk, Keri Harris, Frans Pop,
+David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard에게도 감사를 전한다.
+그들의 도움이 없었다면 이 문서는 존재하지 않았을 것이다.
+
+
+
+메인트너: Greg Kroah-Hartman <greg@kroah.com>
diff --git a/Documentation/vm/numa_memory_policy.txt b/Documentation/vm/numa_memory_policy.txt
new file mode 100644 (file)
index 0000000..8242f52
--- /dev/null
@@ -0,0 +1,332 @@
+
+What is Linux Memory Policy?
+
+In the Linux kernel, "memory policy" determines from which node the kernel will
+allocate memory in a NUMA system or in an emulated NUMA system.  Linux has
+supported platforms with Non-Uniform Memory Access architectures since 2.4.?.
+The current memory policy support was added to Linux 2.6 around May 2004.  This
+document attempts to describe the concepts and APIs of the 2.6 memory policy
+support.
+
+Memory policies should not be confused with cpusets (Documentation/cpusets.txt)
+which is an administrative mechanism for restricting the nodes from which
+memory may be allocated by a set of processes. Memory policies are a
+programming interface that a NUMA-aware application can take advantage of.  When
+both cpusets and policies are applied to a task, the restrictions of the cpuset
+takes priority.  See "MEMORY POLICIES AND CPUSETS" below for more details.
+
+MEMORY POLICY CONCEPTS
+
+Scope of Memory Policies
+
+The Linux kernel supports _scopes_ of memory policy, described here from
+most general to most specific:
+
+    System Default Policy:  this policy is "hard coded" into the kernel.  It
+    is the policy that governs all page allocations that aren't controlled
+    by one of the more specific policy scopes discussed below.  When the
+    system is "up and running", the system default policy will use "local
+    allocation" described below.  However, during boot up, the system
+    default policy will be set to interleave allocations across all nodes
+    with "sufficient" memory, so as not to overload the initial boot node
+    with boot-time allocations.
+
+    Task/Process Policy:  this is an optional, per-task policy.  When defined
+    for a specific task, this policy controls all page allocations made by or
+    on behalf of the task that aren't controlled by a more specific scope.
+    If a task does not define a task policy, then all page allocations that
+    would have been controlled by the task policy "fall back" to the System
+    Default Policy.
+
+       The task policy applies to the entire address space of a task. Thus,
+       it is inheritable, and indeed is inherited, across both fork()
+       [clone() w/o the CLONE_VM flag] and exec*().  This allows a parent task
+       to establish the task policy for a child task exec()'d from an
+       executable image that has no awareness of memory policy.  See the
+       MEMORY POLICY APIS section, below, for an overview of the system call
+       that a task may use to set/change it's task/process policy.
+
+       In a multi-threaded task, task policies apply only to the thread
+       [Linux kernel task] that installs the policy and any threads
+       subsequently created by that thread.  Any sibling threads existing
+       at the time a new task policy is installed retain their current
+       policy.
+
+       A task policy applies only to pages allocated after the policy is
+       installed.  Any pages already faulted in by the task when the task
+       changes its task policy remain where they were allocated based on
+       the policy at the time they were allocated.
+
+    VMA Policy:  A "VMA" or "Virtual Memory Area" refers to a range of a task's
+    virtual adddress space.  A task may define a specific policy for a range
+    of its virtual address space.   See the MEMORY POLICIES APIS section,
+    below, for an overview of the mbind() system call used to set a VMA
+    policy.
+
+    A VMA policy will govern the allocation of pages that back this region of
+    the address space.  Any regions of the task's address space that don't
+    have an explicit VMA policy will fall back to the task policy, which may
+    itself fall back to the System Default Policy.
+
+    VMA policies have a few complicating details:
+
+       VMA policy applies ONLY to anonymous pages.  These include pages
+       allocated for anonymous segments, such as the task stack and heap, and
+       any regions of the address space mmap()ed with the MAP_ANONYMOUS flag.
+       If a VMA policy is applied to a file mapping, it will be ignored if
+       the mapping used the MAP_SHARED flag.  If the file mapping used the
+       MAP_PRIVATE flag, the VMA policy will only be applied when an
+       anonymous page is allocated on an attempt to write to the mapping--
+       i.e., at Copy-On-Write.
+
+       VMA policies are shared between all tasks that share a virtual address
+       space--a.k.a. threads--independent of when the policy is installed; and
+       they are inherited across fork().  However, because VMA policies refer
+       to a specific region of a task's address space, and because the address
+       space is discarded and recreated on exec*(), VMA policies are NOT
+       inheritable across exec().  Thus, only NUMA-aware applications may
+       use VMA policies.
+
+       A task may install a new VMA policy on a sub-range of a previously
+       mmap()ed region.  When this happens, Linux splits the existing virtual
+       memory area into 2 or 3 VMAs, each with it's own policy.
+
+       By default, VMA policy applies only to pages allocated after the policy
+       is installed.  Any pages already faulted into the VMA range remain
+       where they were allocated based on the policy at the time they were
+       allocated.  However, since 2.6.16, Linux supports page migration via
+       the mbind() system call, so that page contents can be moved to match
+       a newly installed policy.
+
+    Shared Policy:  Conceptually, shared policies apply to "memory objects"
+    mapped shared into one or more tasks' distinct address spaces.  An
+    application installs a shared policies the same way as VMA policies--using
+    the mbind() system call specifying a range of virtual addresses that map
+    the shared object.  However, unlike VMA policies, which can be considered
+    to be an attribute of a range of a task's address space, shared policies
+    apply directly to the shared object.  Thus, all tasks that attach to the
+    object share the policy, and all pages allocated for the shared object,
+    by any task, will obey the shared policy.
+
+       As of 2.6.22, only shared memory segments, created by shmget() or
+       mmap(MAP_ANONYMOUS|MAP_SHARED), support shared policy.  When shared
+       policy support was added to Linux, the associated data structures were
+       added to hugetlbfs shmem segments.  At the time, hugetlbfs did not
+       support allocation at fault time--a.k.a lazy allocation--so hugetlbfs
+       shmem segments were never "hooked up" to the shared policy support.
+       Although hugetlbfs segments now support lazy allocation, their support
+       for shared policy has not been completed.
+
+       As mentioned above [re: VMA policies], allocations of page cache
+       pages for regular files mmap()ed with MAP_SHARED ignore any VMA
+       policy installed on the virtual address range backed by the shared
+       file mapping.  Rather, shared page cache pages, including pages backing
+       private mappings that have not yet been written by the task, follow
+       task policy, if any, else System Default Policy.
+
+       The shared policy infrastructure supports different policies on subset
+       ranges of the shared object.  However, Linux still splits the VMA of
+       the task that installs the policy for each range of distinct policy.
+       Thus, different tasks that attach to a shared memory segment can have
+       different VMA configurations mapping that one shared object.  This
+       can be seen by examining the /proc/<pid>/numa_maps of tasks sharing
+       a shared memory region, when one task has installed shared policy on
+       one or more ranges of the region.
+
+Components of Memory Policies
+
+    A Linux memory policy is a tuple consisting of a "mode" and an optional set
+    of nodes.  The mode determine the behavior of the policy, while the
+    optional set of nodes can be viewed as the arguments to the behavior.
+
+   Internally, memory policies are implemented by a reference counted
+   structure, struct mempolicy.  Details of this structure will be discussed
+   in context, below, as required to explain the behavior.
+
+       Note:  in some functions AND in the struct mempolicy itself, the mode
+       is called "policy".  However, to avoid confusion with the policy tuple,
+       this document will continue to use the term "mode".
+
+   Linux memory policy supports the following 4 behavioral modes:
+
+       Default Mode--MPOL_DEFAULT:  The behavior specified by this mode is
+       context or scope dependent.
+
+           As mentioned in the Policy Scope section above, during normal
+           system operation, the System Default Policy is hard coded to
+           contain the Default mode.
+
+           In this context, default mode means "local" allocation--that is
+           attempt to allocate the page from the node associated with the cpu
+           where the fault occurs.  If the "local" node has no memory, or the
+           node's memory can be exhausted [no free pages available], local
+           allocation will "fallback to"--attempt to allocate pages from--
+           "nearby" nodes, in order of increasing "distance".
+
+               Implementation detail -- subject to change:  "Fallback" uses
+               a per node list of sibling nodes--called zonelists--built at
+               boot time, or when nodes or memory are added or removed from
+               the system [memory hotplug].  These per node zonelist are
+               constructed with nodes in order of increasing distance based
+               on information provided by the platform firmware.
+
+           When a task/process policy or a shared policy contains the Default
+           mode, this also means "local allocation", as described above.
+
+           In the context of a VMA, Default mode means "fall back to task
+           policy"--which may or may not specify Default mode.  Thus, Default
+           mode can not be counted on to mean local allocation when used
+           on a non-shared region of the address space.  However, see
+           MPOL_PREFERRED below.
+
+           The Default mode does not use the optional set of nodes.
+
+       MPOL_BIND:  This mode specifies that memory must come from the
+       set of nodes specified by the policy.
+
+           The memory policy APIs do not specify an order in which the nodes
+           will be searched.  However, unlike "local allocation", the Bind
+           policy does not consider the distance between the nodes.  Rather,
+           allocations will fallback to the nodes specified by the policy in
+           order of numeric node id.  Like everything in Linux, this is subject
+           to change.
+
+       MPOL_PREFERRED:  This mode specifies that the allocation should be
+       attempted from the single node specified in the policy.  If that
+       allocation fails, the kernel will search other nodes, exactly as
+       it would for a local allocation that started at the preferred node
+       in increasing distance from the preferred node.  "Local" allocation
+       policy can be viewed as a Preferred policy that starts at the node
+       containing the cpu where the allocation takes place.
+
+           Internally, the Preferred policy uses a single node--the
+           preferred_node member of struct mempolicy.  A "distinguished
+           value of this preferred_node, currently '-1', is interpreted
+           as "the node containing the cpu where the allocation takes
+           place"--local allocation.  This is the way to specify
+           local allocation for a specific range of addresses--i.e. for
+           VMA policies.
+
+       MPOL_INTERLEAVED:  This mode specifies that page allocations be
+       interleaved, on a page granularity, across the nodes specified in
+       the policy.  This mode also behaves slightly differently, based on
+       the context where it is used:
+
+           For allocation of anonymous pages and shared memory pages,
+           Interleave mode indexes the set of nodes specified by the policy
+           using the page offset of the faulting address into the segment
+           [VMA] containing the address modulo the number of nodes specified
+           by the policy.  It then attempts to allocate a page, starting at
+           the selected node, as if the node had been specified by a Preferred
+           policy or had been selected by a local allocation.  That is,
+           allocation will follow the per node zonelist.
+
+           For allocation of page cache pages, Interleave mode indexes the set
+           of nodes specified by the policy using a node counter maintained
+           per task.  This counter wraps around to the lowest specified node
+           after it reaches the highest specified node.  This will tend to
+           spread the pages out over the nodes specified by the policy based
+           on the order in which they are allocated, rather than based on any
+           page offset into an address range or file.  During system boot up,
+           the temporary interleaved system default policy works in this
+           mode.
+
+MEMORY POLICY APIs
+
+Linux supports 3 system calls for controlling memory policy.  These APIS
+always affect only the calling task, the calling task's address space, or
+some shared object mapped into the calling task's address space.
+
+       Note:  the headers that define these APIs and the parameter data types
+       for user space applications reside in a package that is not part of
+       the Linux kernel.  The kernel system call interfaces, with the 'sys_'
+       prefix, are defined in <linux/syscalls.h>; the mode and flag
+       definitions are defined in <linux/mempolicy.h>.
+
+Set [Task] Memory Policy:
+
+       long set_mempolicy(int mode, const unsigned long *nmask,
+                                       unsigned long maxnode);
+
+       Set's the calling task's "task/process memory policy" to mode
+       specified by the 'mode' argument and the set of nodes defined
+       by 'nmask'.  'nmask' points to a bit mask of node ids containing
+       at least 'maxnode' ids.
+
+       See the set_mempolicy(2) man page for more details
+
+
+Get [Task] Memory Policy or Related Information
+
+       long get_mempolicy(int *mode,
+                          const unsigned long *nmask, unsigned long maxnode,
+                          void *addr, int flags);
+
+       Queries the "task/process memory policy" of the calling task, or
+       the policy or location of a specified virtual address, depending
+       on the 'flags' argument.
+
+       See the get_mempolicy(2) man page for more details
+
+
+Install VMA/Shared Policy for a Range of Task's Address Space
+
+       long mbind(void *start, unsigned long len, int mode,
+                  const unsigned long *nmask, unsigned long maxnode,
+                  unsigned flags);
+
+       mbind() installs the policy specified by (mode, nmask, maxnodes) as
+       a VMA policy for the range of the calling task's address space
+       specified by the 'start' and 'len' arguments.  Additional actions
+       may be requested via the 'flags' argument.
+
+       See the mbind(2) man page for more details.
+
+MEMORY POLICY COMMAND LINE INTERFACE
+
+Although not strictly part of the Linux implementation of memory policy,
+a command line tool, numactl(8), exists that allows one to:
+
++ set the task policy for a specified program via set_mempolicy(2), fork(2) and
+  exec(2)
+
++ set the shared policy for a shared memory segment via mbind(2)
+
+The numactl(8) tool is packages with the run-time version of the library
+containing the memory policy system call wrappers.  Some distributions
+package the headers and compile-time libraries in a separate development
+package.
+
+
+MEMORY POLICIES AND CPUSETS
+
+Memory policies work within cpusets as described above.  For memory policies
+that require a node or set of nodes, the nodes are restricted to the set of
+nodes whose memories are allowed by the cpuset constraints.  If the
+intersection of the set of nodes specified for the policy and the set of nodes
+allowed by the cpuset is the empty set, the policy is considered invalid and
+cannot be installed.
+
+The interaction of memory policies and cpusets can be problematic for a
+couple of reasons:
+
+1) the memory policy APIs take physical node id's as arguments.  However, the
+   memory policy APIs do not provide a way to determine what nodes are valid
+   in the context where the application is running.  An application MAY consult
+   the cpuset file system [directly or via an out of tree, and not generally
+   available, libcpuset API] to obtain this information, but then the
+   application must be aware that it is running in a cpuset and use what are
+   intended primarily as administrative APIs.
+
+   However, as long as the policy specifies at least one node that is valid
+   in the controlling cpuset, the policy can be used.
+
+2) when tasks in two cpusets share access to a memory region, such as shared
+   memory segments created by shmget() of mmap() with the MAP_ANONYMOUS and
+   MAP_SHARED flags, and any of the tasks install shared policy on the region,
+   only nodes whose memories are allowed in both cpusets may be used in the
+   policies.  Again, obtaining this information requires "stepping outside"
+   the memory policy APIs, as well as knowing in what cpusets other task might
+   be attaching to the shared region, to use the cpuset information.
+   Furthermore, if the cpusets' allowed memory sets are disjoint, "local"
+   allocation is the only valid policy.
diff --git a/Documentation/watchdog/00-INDEX b/Documentation/watchdog/00-INDEX
new file mode 100644 (file)
index 0000000..c3ea47e
--- /dev/null
@@ -0,0 +1,10 @@
+00-INDEX
+       - this file.
+pcwd-watchdog.txt
+       - documentation for Berkshire Products PC Watchdog ISA cards.
+src/
+       - directory holding watchdog related example programs.
+watchdog-api.txt
+       - description of the Linux Watchdog driver API.
+wdt.txt
+       - description of the Watchdog Timer Interfaces for Linux.
index e4dde7f1f8d253092d0aa5ec9ec31f7aea535df0..10a6f57776b29eb82c49485a5f39ecd173a52396 100644 (file)
@@ -167,11 +167,11 @@ S:        Maintained
 P:     Eric Van Hensbergen
 M:     ericvh@gmail.com
 P:     Ron Minnich
-M:     rminnich@lanl.gov
+M:     rminnich@sandia.gov
 P:     Latchesar Ionkov
 M:     lucho@ionkov.net
 L:     v9fs-developer@lists.sourceforge.net
-W:     http://v9fs.sf.net
+W:     http://swik.net/v9fs
 T:     git kernel.org:/pub/scm/linux/kernel/ericvh/v9fs.git
 S:     Maintained
 
@@ -1009,7 +1009,7 @@ P:        Steve French
 M:     sfrench@samba.org
 L:     linux-cifs-client@lists.samba.org
 L:     samba-technical@lists.samba.org
-W:     http://us1.samba.org/samba/Linux_CIFS_client.html
+W:     http://linux-cifs.samba.org/
 T:     git kernel.org:/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
 S:     Supported
 
@@ -3452,7 +3452,7 @@ S:        Maintained
 
 TPM DEVICE DRIVER
 P:     Kylene Hall
-M:     kjhall@us.ibm.com
+M:     tpmdd-devel@lists.sourceforge.net
 W:     http://tpmdd.sourceforge.net
 P:     Marcel Selhorst
 M:     tpm@selhorst.net
index 8fc0edb5211ed82a9d9100aeb00521b33e240f42..2feeef81d84328ee3a3a3414718264b7f418b386 100644 (file)
 #include "generic.h"
 
 #ifdef CONFIG_PCI
-static int __init micrel_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+static int micrel_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 {
        return KS8695_IRQ_EXTERN0;
 }
 
-static struct ks8695_pci_cfg micrel_pci = {
+static struct ks8695_pci_cfg __initdata micrel_pci = {
        .mode           = KS8695_MODE_MINIPCI,
        .map_irq        = micrel_pci_map_irq,
 };
 #endif
 
 
-static void micrel_init(void)
+static void __init micrel_init(void)
 {
        printk(KERN_INFO "Micrel KS8695 Development Board initializing\n");
 
 #ifdef CONFIG_PCI
-       ks8695_init_pci(&micrel_pci);
+//     ks8695_init_pci(&micrel_pci);
 #endif
 
        /* Add devices */
index 88d5fd34fe3bca320a4146feb314ccc5c21163a1..26d131a77074ae7efe431099491b1ade31738109 100644 (file)
@@ -6,7 +6,7 @@
 
 config CPU_S3C2442
        bool
-       depends on ARCH_S3C2420
+       depends on ARCH_S3C2410
        select S3C2410_CLOCK
        select S3C2410_GPIO
        select S3C2410_PM if PM
index 2edcecdea8bdd3402c2e323e0afceb7c7937bb83..ef801563bbf58930cfb90762a345b0d480c99841 100644 (file)
@@ -9,6 +9,7 @@
  */
 #include <linux/clk.h>
 #include <linux/etherdevice.h>
+#include <linux/i2c-gpio.h>
 #include <linux/init.h>
 #include <linux/linkage.h>
 #include <linux/platform_device.h>
@@ -123,6 +124,19 @@ static struct platform_device ngw_gpio_leds = {
        }
 };
 
+static struct i2c_gpio_platform_data i2c_gpio_data = {
+       .sda_pin        = GPIO_PIN_PA(6),
+       .scl_pin        = GPIO_PIN_PA(7),
+};
+
+static struct platform_device i2c_gpio_device = {
+       .name           = "i2c-gpio",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &i2c_gpio_data,
+       },
+};
+
 static int __init atngw100_init(void)
 {
        unsigned        i;
@@ -147,6 +161,10 @@ static int __init atngw100_init(void)
        }
        platform_device_register(&ngw_gpio_leds);
 
+       at32_select_gpio(i2c_gpio_data.sda_pin, 0);
+       at32_select_gpio(i2c_gpio_data.scl_pin, 0);
+       platform_device_register(&i2c_gpio_device);
+
        return 0;
 }
 postcore_initcall(atngw100_init);
index 71bc7d364fb7c17ee8f1884f6f58d64732aedfa2..718578f640691c2e9b692c1b98acf53e6d7b5ca1 100644 (file)
@@ -50,4 +50,30 @@ config BOARD_ATSTK1002_SPI1
          GPIO lines and accessed through the J1 jumper block.  Say "y"
          here to configure that SPI controller.
 
+config BOARD_ATSTK1002_J2_LED
+       bool
+       default BOARD_ATSTK1002_J2_LED8 || BOARD_ATSTK1002_J2_RGB
+
+choice
+       prompt "LEDs connected to J2:"
+       depends on LEDS_GPIO && !BOARD_ATSTK1002_SW4_CUSTOM
+       optional
+       help
+         Select this if you have jumpered the J2 jumper block to the
+         LED0..LED7 amber leds, or to the RGB leds, using a ten-pin
+         IDC cable.  A default "heartbeat" trigger is provided, but
+         you can of course override this.
+
+config BOARD_ATSTK1002_J2_LED8
+       bool "LED0..LED7"
+       help
+         Select this if J2 is jumpered to LED0..LED7 amber leds.
+
+config BOARD_ATSTK1002_J2_RGB
+       bool "RGB leds"
+       help
+         Select this if J2 is jumpered to the RGB leds.
+
+endchoice
+
 endif  # stk 1002
index cb93eabb9c6c4145947df0bda8afaefd0d734340..c9981b731efa58e1d20aecee60222081ed813b06 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/leds.h>
 #include <linux/platform_device.h>
 #include <linux/string.h>
 #include <linux/types.h>
@@ -120,6 +121,65 @@ static void __init set_hw_addr(struct platform_device *pdev)
        clk_put(pclk);
 }
 
+#ifdef CONFIG_BOARD_ATSTK1002_J2_LED
+
+static struct gpio_led stk_j2_led[] = {
+#ifdef CONFIG_BOARD_ATSTK1002_J2_LED8
+#define LEDSTRING "J2 jumpered to LED8"
+       { .name = "led0:amber", .gpio = GPIO_PIN_PB( 8), },
+       { .name = "led1:amber", .gpio = GPIO_PIN_PB( 9), },
+       { .name = "led2:amber", .gpio = GPIO_PIN_PB(10), },
+       { .name = "led3:amber", .gpio = GPIO_PIN_PB(13), },
+       { .name = "led4:amber", .gpio = GPIO_PIN_PB(14), },
+       { .name = "led5:amber", .gpio = GPIO_PIN_PB(15), },
+       { .name = "led6:amber", .gpio = GPIO_PIN_PB(16), },
+       { .name = "led7:amber", .gpio = GPIO_PIN_PB(30),
+                       .default_trigger = "heartbeat", },
+#else  /* RGB */
+#define LEDSTRING "J2 jumpered to RGB LEDs"
+       { .name = "r1:red",     .gpio = GPIO_PIN_PB( 8), },
+       { .name = "g1:green",   .gpio = GPIO_PIN_PB(10), },
+       { .name = "b1:blue",    .gpio = GPIO_PIN_PB(14), },
+
+       { .name = "r2:red",     .gpio = GPIO_PIN_PB( 9),
+                       .default_trigger = "heartbeat", },
+       { .name = "g2:green",   .gpio = GPIO_PIN_PB(13), },
+       { .name = "b2:blue",    .gpio = GPIO_PIN_PB(15),
+                       .default_trigger = "heartbeat", },
+       /* PB16, PB30 unused */
+#endif
+};
+
+static struct gpio_led_platform_data stk_j2_led_data = {
+       .num_leds       = ARRAY_SIZE(stk_j2_led),
+       .leds           = stk_j2_led,
+};
+
+static struct platform_device stk_j2_led_dev = {
+       .name           = "leds-gpio",
+       .id             = 2,    /* gpio block J2 */
+       .dev            = {
+               .platform_data  = &stk_j2_led_data,
+       },
+};
+
+static void setup_j2_leds(void)
+{
+       unsigned        i;
+
+       for (i = 0; i < ARRAY_SIZE(stk_j2_led); i++)
+               at32_select_gpio(stk_j2_led[i].gpio, AT32_GPIOF_OUTPUT);
+
+       printk("STK1002: " LEDSTRING "\n");
+       platform_device_register(&stk_j2_led_dev);
+}
+
+#else
+static void setup_j2_leds(void)
+{
+}
+#endif
+
 void __init setup_board(void)
 {
 #ifdef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM
@@ -185,6 +245,8 @@ static int __init atstk1002_init(void)
        at32_add_device_ssc(0, ATMEL_SSC_TX);
 #endif
 
+       setup_j2_leds();
+
        return 0;
 }
 postcore_initcall(atstk1002_init);
index e7e724bc0ba6d701688365c118c57f59795ab697..03e2e68f947dd7c3d49424e5781ec9e1f4e3cf57 100644 (file)
@@ -548,6 +548,7 @@ config ETRAX_IDE
        select BLK_DEV_IDEDISK
        select BLK_DEV_IDECD
        select BLK_DEV_IDEDMA
+       select IDE_GENERIC
        help
          Enable this to get support for ATA/IDE.
          You can't use parallel ports or SCSI ports
index 1d859c16931e3628853b80bdefa4664bda69b863..cc6ba542375472be1147f122b5ebd3a41e434a4b 100644 (file)
@@ -592,6 +592,7 @@ config ETRAX_IDE
        select BLK_DEV_IDEDISK
        select BLK_DEV_IDECD
        select BLK_DEV_IDEDMA
+       select IDE_GENERIC
        help
          Enables the ETRAX IDE driver.
 
index e061b63a00386f51531fb1439cae57c37bbcfde9..dfbe7ab9ffe2e2fa632260ccb2111d3a9e9a87df 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/a.out.h>
 #include <linux/interrupt.h>
 #include <linux/reboot.h>
+#include <linux/fs.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
index de7688cfd573e6f73373b754efc1aecbcdf5571c..ddc62727dc9f42ac3a38097dd32367a5acb985ee 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mman.h>
 #include <linux/file.h>
 #include <linux/utsname.h>
+#include <linux/fs.h>
 
 #include <asm/setup.h>
 #include <asm/uaccess.h>
index f9524933258a47601a6838b4a3768fb296b9fbce..97b64d7d6bf692baacc019df57845c964c771d39 100644 (file)
@@ -614,10 +614,14 @@ config X86_PAE
 
 # Common NUMA Features
 config NUMA
-       bool "Numa Memory Allocation and Scheduler Support"
-       depends on SMP && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI)
+       bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
+       depends on SMP && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI) && EXPERIMENTAL
        default n if X86_PC
        default y if (X86_NUMAQ || X86_SUMMIT)
+       help
+         NUMA support for i386. This is currently high experimental
+         and should be only used for kernel development. It might also
+         cause boot failures.
 
 comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
        depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
@@ -1228,6 +1232,11 @@ menuconfig INSTRUMENTATION
        bool "Instrumentation Support"
        depends on EXPERIMENTAL
        default y
+       ---help---
+         Say Y here to get to see options related to performance measurement,
+         debugging, and testing. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if INSTRUMENTATION
 
index 01f0ff0daaf4203117a34a17c071fa2b110252ab..52b932478c6dbcf947882e1a483c962bce167f07 100644 (file)
@@ -51,8 +51,8 @@ cflags-y += -maccumulate-outgoing-args
 CFLAGS                         += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;)
 
 # do binutils support CFI?
-cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
-AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
+cflags-y += $(call as-instr,.cfi_startproc\n.cfi_rel_offset esp${comma}0\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
+AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_rel_offset esp${comma}0\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
 
 # is .cfi_signal_frame supported too?
 cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,)
index 658834d9f92a098acc2de75a1a5e9c028540b254..82b5c846a194acae54c1275150a76edf53d52518 100644 (file)
 
 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
 
-struct edd_dapa {
-       u8      pkt_size;
-       u8      rsvd;
-       u16     sector_cnt;
-       u16     buf_off, buf_seg;
-       u64     lba;
-       u64     buf_lin_addr;
-};
-
 /*
  * Read the MBR (first sector) from a specific device.
  */
 static int read_mbr(u8 devno, void *buf)
 {
-       struct edd_dapa dapa;
-       u16 ax, bx, cx, dx, si;
-
-       memset(&dapa, 0, sizeof dapa);
-       dapa.pkt_size = sizeof(dapa);
-       dapa.sector_cnt = 1;
-       dapa.buf_off = (size_t)buf;
-       dapa.buf_seg = ds();
-       /* dapa.lba = 0; */
-
-       ax = 0x4200;            /* Extended Read */
-       si = (size_t)&dapa;
-       dx = devno;
-       asm("pushfl; stc; int $0x13; setc %%al; popfl"
-           : "+a" (ax), "+S" (si), "+d" (dx)
-           : "m" (dapa)
-           : "ebx", "ecx", "edi", "memory");
-
-       if (!(u8)ax)
-               return 0;       /* OK */
+       u16 ax, bx, cx, dx;
 
        ax = 0x0201;            /* Legacy Read, one sector */
        cx = 0x0001;            /* Sector 0-0-1 */
@@ -65,11 +37,10 @@ static int read_mbr(u8 devno, void *buf)
        return -(u8)ax;         /* 0 or -1 */
 }
 
-static u32 read_mbr_sig(u8 devno, struct edd_info *ei)
+static u32 read_mbr_sig(u8 devno, struct edd_info *ei, u32 *mbrsig)
 {
        int sector_size;
        char *mbrbuf_ptr, *mbrbuf_end;
-       u32 mbrsig;
        u32 buf_base, mbr_base;
        extern char _end[];
 
@@ -85,15 +56,15 @@ static u32 read_mbr_sig(u8 devno, struct edd_info *ei)
 
        /* Make sure we actually have space on the heap... */
        if (!(boot_params.hdr.loadflags & CAN_USE_HEAP))
-               return 0;
+               return -1;
        if (mbrbuf_end > (char *)(size_t)boot_params.hdr.heap_end_ptr)
-               return 0;
+               return -1;
 
        if (read_mbr(devno, mbrbuf_ptr))
-               return 0;
+               return -1;
 
-       mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET];
-       return mbrsig;
+       *mbrsig = *(u32 *)&mbrbuf_ptr[EDD_MBR_SIG_OFFSET];
+       return 0;
 }
 
 static int get_edd_info(u8 devno, struct edd_info *ei)
@@ -160,6 +131,7 @@ void query_edd(void)
        int do_edd = 1;
        int devno;
        struct edd_info ei, *edp;
+       u32 *mbrptr;
 
        if (cmdline_find_option("edd", eddarg, sizeof eddarg) > 0) {
                if (!strcmp(eddarg, "skipmbr") || !strcmp(eddarg, "skip"))
@@ -168,7 +140,8 @@ void query_edd(void)
                        do_edd = 0;
        }
 
-       edp = (struct edd_info *)boot_params.eddbuf;
+       edp    = boot_params.eddbuf;
+       mbrptr = boot_params.edd_mbr_sig_buffer;
 
        if (!do_edd)
                return;
@@ -186,11 +159,8 @@ void query_edd(void)
                        boot_params.eddbuf_entries++;
                }
 
-               if (do_mbr) {
-                       u32 mbr_sig;
-                       mbr_sig = read_mbr_sig(devno, &ei);
-                       boot_params.edd_mbr_sig_buffer[devno-0x80] = mbr_sig;
-               }
+               if (do_mbr && !read_mbr_sig(devno, &ei, mbrptr++))
+                       boot_params.edd_mbr_sig_buf_entries = devno-0x80+1;
        }
 }
 
index 958130ef004296c02f79614838152f0e1beae102..693f20d3102e9322759adca6834f2de4e159d0a1 100644 (file)
@@ -61,7 +61,7 @@ static void store_video_mode(void)
 
        /* Not all BIOSes are clean with respect to the top bit */
        boot_params.screen_info.orig_video_mode = ax & 0x7f;
-       boot_params.screen_info.orig_video_page = page;
+       boot_params.screen_info.orig_video_page = page >> 8;
 }
 
 /*
index 1b66d5c70eaf65fc88fa1146313071843a069993..9f4ac8b02de407f756bf69e7756ac5422f5cb0a7 100644 (file)
@@ -366,6 +366,8 @@ void apply_paravirt(struct paravirt_patch_site *start,
                unsigned int used;
 
                BUG_ON(p->len > MAX_PATCH_LEN);
+               /* prep the buffer with the original instructions */
+               memcpy(insnbuf, p->instr, p->len);
                used = paravirt_ops.patch(p->instrtype, p->clobbers, insnbuf,
                                          (unsigned long)p->instr, p->len);
 
index f9fff29e01a9a3fecbf6f5a59936120416f23713..3d67ae18d762048a145c4211a0fa5f2ca174bf02 100644 (file)
@@ -1085,7 +1085,7 @@ static int __init detect_init_APIC (void)
        if (l & MSR_IA32_APICBASE_ENABLE)
                mp_lapic_addr = l & MSR_IA32_APICBASE_BASE;
 
-       if (nmi_watchdog != NMI_NONE)
+       if (nmi_watchdog != NMI_NONE && nmi_watchdog != NMI_DISABLED)
                nmi_watchdog = NMI_LOCAL_APIC;
 
        printk(KERN_INFO "Found and enabled local APIC!\n");
index 99beac7f96ceb4df737c9c02c304ba9d9999710f..8c1c965eb2a8e4b6c54d0bb7db320303d6844144 100644 (file)
@@ -77,7 +77,7 @@ static int __init check_nmi_watchdog(void)
        unsigned int *prev_nmi_count;
        int cpu;
 
-       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
+       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DISABLED))
                return 0;
 
        if (!atomic_read(&nmi_active))
@@ -424,7 +424,7 @@ int proc_nmi_enabled(struct ctl_table *table, int write, struct file *file,
        if (!!old_state == !!nmi_watchdog_enabled)
                return 0;
 
-       if (atomic_read(&nmi_active) < 0) {
+       if (atomic_read(&nmi_active) < 0 || nmi_watchdog == NMI_DISABLED) {
                printk( KERN_WARNING "NMI watchdog is permanently disabled\n");
                return -EIO;
        }
index debd7dbb4158bc9df0aab0a7f9211922b368ba3b..a39280b4dd3a53f107a23ac85df1b01d5ac6b7c4 100644 (file)
@@ -292,7 +292,6 @@ static struct clocksource clocksource_tsc = {
 
 void mark_tsc_unstable(char *reason)
 {
-       sched_clock_unstable_event();
        if (!tsc_unstable) {
                tsc_unstable = 1;
                tsc_enabled = 0;
index 01ffdd4964f08e9bec86c5ae759da9f5cbe8270a..fcb38e7f35434113896abc3caad887c9aad665d1 100644 (file)
@@ -249,9 +249,10 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
        pmd_k = pmd_offset(pud_k, address);
        if (!pmd_present(*pmd_k))
                return NULL;
-       if (!pmd_present(*pmd))
+       if (!pmd_present(*pmd)) {
                set_pmd(pmd, *pmd_k);
-       else
+               arch_flush_lazy_mmu_mode();
+       } else
                BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
        return pmd_k;
 }
index bc71f3bc40141019214201586ed292b743f81dc3..f8d6937db2ec8d1eb85dabd10f15c96526225dc8 100644 (file)
@@ -7,20 +7,20 @@
 #include <asm/boot.h>
 #include <xen/interface/elfnote.h>
 
-       .section .init.text
+.pushsection .init.text
 ENTRY(startup_xen)
        movl %esi,xen_start_info
        cld
        movl $(init_thread_union+THREAD_SIZE),%esp
        jmp xen_start_kernel
+.popsection
 
-.pushsection ".bss.page_aligned"
+.pushsection .bss.page_aligned
        .align PAGE_SIZE_asm
 ENTRY(hypercall_page)
        .skip 0x1000
 .popsection
 
-       .section .text
        ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz "linux")
        ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz "2.6")
        ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz "xen-3.0")
index 21aa4fc5f8efc64347d4518afec33d9dda000eb6..8c39913d17290c48fc9b60d260c49f58b9ab3d1e 100644 (file)
@@ -327,17 +327,7 @@ config FORCE_CPEI_RETARGET
        This option it useful to enable this feature on older BIOS's as well.
        You can also enable this by using boot command line option force_cpei=1.
 
-config PREEMPT
-       bool "Preemptible Kernel"
-        help
-          This option reduces the latency of the kernel when reacting to
-          real-time or interactive events by allowing a low priority process to
-          be preempted even if it is in kernel mode executing a system call.
-          This allows applications to run more reliably even when the system is
-          under load.
-
-          Say Y here if you are building a kernel for a desktop, embedded
-          or real-time system.  Say N if you are unsure.
+source "kernel/Kconfig.preempt"
 
 source "mm/Kconfig"
 
index 9eb48c0927b007baa1d14af8d139df35590ff2c7..6dd8655664f33fbfcae5843664fd71170dfe8137 100644 (file)
@@ -42,7 +42,7 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 # CONFIG_SLOB is not set
index 3a9ed951db085a77940f7264ca7b2a74b5edab45..e86fbd39c79509df11bb9720355b7146c28ca903 100644 (file)
@@ -43,7 +43,7 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 # CONFIG_SLOB is not set
index c420d9f3df98ddccf0e4580e4c93636c36952d0c..546a772f438e9e9e335d7a9d886019ce7f0be126 100644 (file)
@@ -43,7 +43,7 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
 CONFIG_CC_ALIGN_LABELS=0
 CONFIG_CC_ALIGN_LOOPS=0
 CONFIG_CC_ALIGN_JUMPS=0
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 # CONFIG_SLOB is not set
index 4c9ffc47bc7a3e53f87e00febd4af727109320b0..9aecfceeb38c6350c8ecae74b735f825ab8310f4 100644 (file)
@@ -46,7 +46,7 @@ CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
index 3dbb3987df277cf11a43e4062b86111046c2350c..797acf9066c1a0bd4de229d267a8f070b6e5a571 100644 (file)
@@ -53,7 +53,7 @@ CONFIG_TIMERFD=y
 CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
 CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 # CONFIG_SLUB is not set
 # CONFIG_SLOB is not set
 CONFIG_RT_MUTEXES=y
index 4a060fc39934e5bb30166eeb4fde9e15934e07dd..0a06b1333c9578e34295d7b67ff38e9e5d4723bc 100644 (file)
@@ -48,7 +48,7 @@ CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
+CONFIG_SLUB=y
 CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
index 03172dc8c4031fb51e8e1a620617f330076d85e9..0210545e7f61f1b498e97fc828f879ca396dd554 100644 (file)
@@ -53,8 +53,7 @@ CONFIG_TIMERFD=y
 CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
 CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_SLAB=y
-# CONFIG_SLUB is not set
+CONFIG_SLUB=y
 # CONFIG_SLOB is not set
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
index a9bd71ac78e2dec37dc23695ae552953f283bd9d..8808565491fb51b6d8e5a949d580d08646da8095 100644 (file)
@@ -26,6 +26,7 @@ GLOBAL_ENTRY(_start)
        movl sp = stack_mem+16384-16
        bsw.1
        br.call.sptk.many rp=start_bootloader
+0:     nop 0             /* dummy nop to make unwinding work */
 END(_start)
 
 /*
index 15c08d52f09fb60038ff85db84a2ede007c0867f..8c6ec7070844d7a7826881ccf15b4ca5079d5654 100644 (file)
@@ -113,10 +113,8 @@ processor_get_freq (
 
        saved_mask = current->cpus_allowed;
        set_cpus_allowed(current, cpumask_of_cpu(cpu));
-       if (smp_processor_id() != cpu) {
-               ret = -EAGAIN;
+       if (smp_processor_id() != cpu)
                goto migrate_end;
-       }
 
        /* processor_get_pstate gets the instantaneous frequency */
        ret = processor_get_pstate(&value);
@@ -125,7 +123,7 @@ processor_get_freq (
                set_cpus_allowed(current, saved_mask);
                printk(KERN_WARNING "get performance failed with error %d\n",
                       ret);
-               ret = -EAGAIN;
+               ret = 0;
                goto migrate_end;
        }
        clock_freq = extract_clock(data, value, cpu);
index cc3ee4ef37afb1bbfed332481f8b9e787b91ae38..44be1c952b7ca2cc6761f65c112a7f737c1f0b7f 100644 (file)
@@ -33,6 +33,11 @@ void ack_bad_irq(unsigned int irq)
 }
 
 #ifdef CONFIG_IA64_GENERIC
+ia64_vector __ia64_irq_to_vector(int irq)
+{
+       return irq_cfg[irq].vector;
+}
+
 unsigned int __ia64_local_vector_to_irq (ia64_vector vec)
 {
        return __get_cpu_var(vector_irq)[vec];
index ff28620cb992c7eb846f6ab2628b095d2ad41fca..63b73f3d4c9f9a7a2d0cbb6866c5cc2dfa9d3c26 100644 (file)
@@ -2018,22 +2018,26 @@ ia64_mca_late_init(void)
 
                if (cpe_vector >= 0) {
                        /* If platform supports CPEI, enable the irq. */
-                       cpe_poll_enabled = 0;
-                       for (irq = 0; irq < NR_IRQS; ++irq)
-                               if (irq_to_vector(irq) == cpe_vector) {
-                                       desc = irq_desc + irq;
-                                       desc->status |= IRQ_PER_CPU;
-                                       setup_irq(irq, &mca_cpe_irqaction);
-                                       ia64_cpe_irq = irq;
-                               }
-                       ia64_mca_register_cpev(cpe_vector);
-                       IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n", __FUNCTION__);
-               } else {
-                       /* If platform doesn't support CPEI, get the timer going. */
-                       if (cpe_poll_enabled) {
-                               ia64_mca_cpe_poll(0UL);
-                               IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __FUNCTION__);
+                       irq = local_vector_to_irq(cpe_vector);
+                       if (irq > 0) {
+                               cpe_poll_enabled = 0;
+                               desc = irq_desc + irq;
+                               desc->status |= IRQ_PER_CPU;
+                               setup_irq(irq, &mca_cpe_irqaction);
+                               ia64_cpe_irq = irq;
+                               ia64_mca_register_cpev(cpe_vector);
+                               IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n",
+                                       __FUNCTION__);
+                               return 0;
                        }
+                       printk(KERN_ERR "%s: Failed to find irq for CPE "
+                                       "interrupt handler, vector %d\n",
+                                       __FUNCTION__, cpe_vector);
+               }
+               /* If platform doesn't support CPEI, get the timer going. */
+               if (cpe_poll_enabled) {
+                       ia64_mca_cpe_poll(0UL);
+                       IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __FUNCTION__);
                }
        }
 #endif
index 4158906c45aacce3ad80bd8c203f9d34fdc2c23b..c613fc0e91cc8bc5d1cdc6f204d4c3e76037b589 100644 (file)
@@ -198,9 +198,13 @@ default_idle (void)
 {
        local_irq_enable();
        while (!need_resched()) {
-               if (can_do_pal_halt)
-                       safe_halt();
-               else
+               if (can_do_pal_halt) {
+                       local_irq_disable();
+                       if (!need_resched()) {
+                               safe_halt();
+                       }
+                       local_irq_enable();
+               } else
                        cpu_relax();
        }
 }
index 00f80324694829f5eef2e647299a8227213689f1..122444a97897d7f02a7707cdd3f178248a1efdf5 100644 (file)
@@ -951,10 +951,14 @@ access_uarea (struct task_struct *child, unsigned long addr,
                        return 0;
 
                      case PT_CR_IPSR:
-                       if (write_access)
-                               pt->cr_ipsr = ((*data & IPSR_MASK)
+                       if (write_access) {
+                               unsigned long tmp = *data;
+                               /* psr.ri==3 is a reserved value: SDM 2:25 */
+                               if ((tmp & IA64_PSR_RI) == IA64_PSR_RI)
+                                       tmp &= ~IA64_PSR_RI;
+                               pt->cr_ipsr = ((tmp & IPSR_MASK)
                                               | (pt->cr_ipsr & ~IPSR_MASK));
-                       else
+                       else
                                *data = (pt->cr_ipsr & IPSR_MASK);
                        return 0;
 
index cd9a37a552c3099a2de603d923e9d23984b3c347..407efea04bf5d9b761daea91281b8dff2479b312 100644 (file)
@@ -389,6 +389,13 @@ early_console_setup (char *cmdline)
        if (!efi_setup_pcdp_console(cmdline))
                earlycons++;
 #endif
+#ifdef CONFIG_HP_SIMSERIAL_CONSOLE
+       {
+               extern struct console hpsim_cons;
+               register_console(&hpsim_cons);
+               earlycons++;
+       }
+#endif
 
        return (earlycons) ? 0 : -1;
 }
index 83e80677de707c42776fe85bc7f38dce58219e0f..00232b4357ba20eeab9ef1dd82dddbaf489d0a57 100644 (file)
@@ -20,6 +20,8 @@ PHDRS {
   code   PT_LOAD;
   percpu PT_LOAD;
   data   PT_LOAD;
+  note   PT_NOTE;
+  unwind 0x70000001; /* PT_IA_64_UNWIND, but ld doesn't match the name */
 }
 SECTIONS
 {
@@ -62,6 +64,9 @@ SECTIONS
 
   /* Read-only data */
 
+  NOTES :code :note            /* put .notes in text and mark in PT_NOTE  */
+  code_continues : {} :code    /* switch back to regular program...  */
+
   /* Exception table */
   . = ALIGN(16);
   __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET)
@@ -99,7 +104,8 @@ SECTIONS
          __start_unwind = .;
          *(.IA_64.unwind*)
          __end_unwind = .;
-       }
+       } :code :unwind
+  code_continues2 : {} : code
 
   RODATA
 
@@ -276,10 +282,6 @@ SECTIONS
   .debug_typenames 0 : { *(.debug_typenames) }
   .debug_varnames  0 : { *(.debug_varnames) }
   /* These must appear regardless of  .  */
-  /* Discard them for now since Intel SoftSDV cannot handle them.
-  .comment 0 : { *(.comment) }
-  .note 0 : { *(.note) }
-  */
   /DISCARD/ : { *(.comment) }
   /DISCARD/ : { *(.note) }
 }
index 73ccb6010c055d18cf937f0e3f636530941e0eec..9150ffaff9e891da5ed52fbc05ed040d026afabc 100644 (file)
@@ -112,11 +112,17 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
        down_read(&mm->mmap_sem);
 
        vma = find_vma_prev(mm, address, &prev_vma);
-       if (!vma)
+       if (!vma && !prev_vma )
                goto bad_area;
 
-       /* find_vma_prev() returns vma such that address < vma->vm_end or NULL */
-       if (address < vma->vm_start)
+        /*
+         * find_vma_prev() returns vma such that address < vma->vm_end or NULL
+         *
+         * May find no vma, but could be that the last vm area is the
+         * register backing store that needs to expand upwards, in
+         * this case vma will be null, but prev_vma will ne non-null
+         */
+        if (( !vma && prev_vma ) || (address < vma->vm_start) )
                goto check_expansion;
 
   good_area:
@@ -172,6 +178,8 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
 
   check_expansion:
        if (!(prev_vma && (prev_vma->vm_flags & VM_GROWSUP) && (address == prev_vma->vm_end))) {
+               if (!vma)
+                       goto bad_area;
                if (!(vma->vm_flags & VM_GROWSDOWN))
                        goto bad_area;
                if (REGION_NUMBER(address) != REGION_NUMBER(vma->vm_start)
index 7f6d2360a2620f66f96487c4b37898f9a2dac13e..3600473894491baea82a5579398a5d29f52d802d 100644 (file)
@@ -256,6 +256,13 @@ struct irq_chip irq_type_sn = {
        .set_affinity   = sn_set_affinity_irq
 };
 
+ia64_vector sn_irq_to_vector(int irq)
+{
+       if (irq >= IA64_NUM_VECTORS)
+               return 0;
+       return (ia64_vector)irq;
+}
+
 unsigned int sn_local_vector_to_irq(u8 vector)
 {
        return (CPU_VECTOR_TO_IRQ(smp_processor_id(), vector));
@@ -398,7 +405,10 @@ sn_call_force_intr_provider(struct sn_irq_info *sn_irq_info)
        struct sn_pcibus_provider *pci_provider;
 
        pci_provider = sn_pci_provider[sn_irq_info->irq_bridge_type];
-       if (pci_provider && pci_provider->force_interrupt)
+
+       /* Don't force an interrupt if the irq has been disabled */
+       if (!(irq_desc[sn_irq_info->irq_irq].status & IRQ_DISABLED) &&
+           pci_provider && pci_provider->force_interrupt)
                (*pci_provider->force_interrupt)(sn_irq_info);
 }
 
index 7e6d5fb75390e7a92b5c438c6b0059e03e2e432e..ed3a4caec6209dfc5f73b3bf4561b222801d7a6b 100644 (file)
@@ -62,7 +62,6 @@ EXPORT_SYMBOL(m68k_num_memory);
 int m68k_realnum_memory;
 EXPORT_SYMBOL(m68k_realnum_memory);
 unsigned long m68k_memoffset;
-EXPORT_SYMBOL(m68k_memoffset);
 struct mem_info m68k_memory[NUM_MEMINFO];
 EXPORT_SYMBOL(m68k_memory);
 
@@ -200,7 +199,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
                       (m68k_num_memory - 1));
                m68k_num_memory = 1;
        }
-       m68k_memoffset = m68k_memory[0].addr-PAGE_OFFSET;
 #endif
 }
 
index c42245775a4db9d520df660424c6c7e690480beb..59fe285865ec050b958545a94007568d94c7f707 100644 (file)
@@ -19,6 +19,8 @@ SECTIONS
        *(.gnu.warning)
        } :text = 0x4e75
 
+  _etext = .;                  /* End of text section */
+
   . = ALIGN(16);               /* Exception table */
   __start___ex_table = .;
   __ex_table : { *(__ex_table) }
@@ -26,8 +28,6 @@ SECTIONS
 
   RODATA
 
-  _etext = .;                  /* End of text section */
-
   .data : {                    /* Data */
        DATA_DATA
        CONSTRUCTORS
index 7d571a2b44dd0bd2d61e6d3dcc9239146fe5d4c4..30d34f285024622718d3760dca09fde8d98a8096 100644 (file)
@@ -210,11 +210,7 @@ void __init paging_init(void)
        int i;
 
 #ifdef DEBUG
-       {
-               extern unsigned long availmem;
-               printk ("start of paging_init (%p, %lx)\n",
-                       kernel_pg_dir, availmem);
-       }
+       printk ("start of paging_init (%p, %lx)\n", kernel_pg_dir, availmem);
 #endif
 
        /* Fix the cache mode in the page descriptors for the 680[46]0.  */
index 846f97534685cfb9a529486d3a4a6d37c3f5aeee..47502d5ec19fa18873ca85fcebeae7ff42e9ed16 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/a.out.h>
 #include <linux/interrupt.h>
 #include <linux/reboot.h>
+#include <linux/fs.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
index 48e6b33e8b44962d7ce6c6c5da044179c4199ec8..15d62c5279a95d91642391c5365d7cfa4922ca10 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/mman.h>
 #include <linux/file.h>
 #include <linux/utsname.h>
+#include <linux/fs.h>
 
 #include <asm/setup.h>
 #include <asm/uaccess.h>
index 4680e2010887e468d4fb4824f9fc795428943a31..3e79bf0a3159c8422281f73d99a1586ee5f072f2 100644 (file)
                #size-cells = <1>;
                #interrupt-cells = <2>;
                device_type = "soc";
-               ranges = <0 e0000000 00100000>;
-               reg = <e0000000 00100000>;      // CCSRBAR 1M
+
+
+               ranges = <00001000 e0001000 000ff000
+                         80000000 80000000 20000000
+                         a0000000 a0000000 10000000
+                         b0000000 b0000000 00100000
+                         c0000000 c0000000 20000000
+                         b0100000 b0100000 00100000
+                         e1000000 e1000000 00010000
+                         e1010000 e1010000 00010000
+                         e1020000 e1020000 00010000>;
+               reg = <e0000000 00001000>;      // CCSRBAR 1M
                bus-frequency = <0>;            // Filled out by uboot.
 
                memory-controller@2000 {
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
                        bus-range = <0 ff>;
-                       ranges = <02000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 00800000>;
+                       ranges = <02000000 0 c0000000 c0000000 0 20000000
+                                 01000000 0 00000000 e1000000 0 00010000>;
                        clock-frequency = <3f940aa>;
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        #address-cells = <3>;
                        reg = <9000 1000>;
                        bus-range = <0 ff>;
-                       ranges = <02000000 0 90000000 90000000 0 10000000
-                                 01000000 0 00000000 e3000000 0 00800000>;
+                       ranges = <02000000 0 80000000 80000000 0 20000000
+                                 01000000 0 00000000 e1010000 0 00010000>;
                        clock-frequency = <1fca055>;
                        interrupt-parent = <&mpic>;
                        interrupts = <1a 2>;
                        reg = <a000 1000>;
                        bus-range = <0 ff>;
                        ranges = <02000000 0 a0000000 a0000000 0 10000000
-                                 01000000 0 00000000 e2800000 0 00800000>;
+                                 01000000 0 00000000 e1020000 0 00010000>;
                        clock-frequency = <1fca055>;
                        interrupt-parent = <&mpic>;
                        interrupts = <19 2>;
                        #address-cells = <3>;
                        reg = <b000 1000>;
                        bus-range = <0 ff>;
-                       ranges = <02000000 0 b0000000 b0000000 0 10000000
-                                 01000000 0 00000000 e3800000 0 00800000>;
+                       ranges = <02000000 0 b0000000 b0000000 0 00100000
+                                 01000000 0 00000000 b0100000 0 00100000>;
                        clock-frequency = <1fca055>;
                        interrupt-parent = <&mpic>;
                        interrupts = <1b 2>;
-                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map-mask = <fb00 0 0 0>;
                        interrupt-map = <
-
-                               // IDSEL 0x1a
-                               d000 0 0 1 &i8259 6 2
-                               d000 0 0 2 &i8259 3 2
-                               d000 0 0 3 &i8259 4 2
-                               d000 0 0 4 &i8259 5 2
-
-                               // IDSEL 0x1b
-                               d800 0 0 1 &i8259 5 2
-                               d800 0 0 2 &i8259 0 0
-                               d800 0 0 3 &i8259 0 0
-                               d800 0 0 4 &i8259 0 0
-
                                // IDSEL 0x1c  USB
-                               e000 0 0 1 &i8259 9 2
-                               e000 0 0 2 &i8259 a 2
-                               e000 0 0 3 &i8259 c 2
-                               e000 0 0 4 &i8259 7 2
+                               e000 0 0 0 &i8259 c 2
+                               e100 0 0 0 &i8259 9 2
+                               e200 0 0 0 &i8259 a 2
+                               e300 0 0 0 &i8259 b 2
 
                                // IDSEL 0x1d  Audio
-                               e800 0 0 1 &i8259 9 2
-                               e800 0 0 2 &i8259 a 2
-                               e800 0 0 3 &i8259 b 2
-                               e800 0 0 4 &i8259 0 0
+                               e800 0 0 0 &i8259 6 2
 
                                // IDSEL 0x1e Legacy
-                               f000 0 0 1 &i8259 c 2
-                               f000 0 0 2 &i8259 0 0
-                               f000 0 0 3 &i8259 0 0
-                               f000 0 0 4 &i8259 0 0
+                               f000 0 0 0 &i8259 7 2
+                               f100 0 0 0 &i8259 7 2
 
                                // IDSEL 0x1f IDE/SATA
-                               f800 0 0 1 &i8259 6 2
-                               f800 0 0 2 &i8259 0 0
-                               f800 0 0 3 &i8259 0 0
-                               f800 0 0 4 &i8259 0 0
+                               f800 0 0 0 &i8259 e 2
+                               f900 0 0 0 &i8259 5 2
                        >;
                        uli1575@0 {
                                reg = <0 0 0 0 0>;
                                #address-cells = <3>;
                                ranges = <02000000 0 b0000000
                                          02000000 0 b0000000
-                                         0 10000000
+                                         0 00100000
                                          01000000 0 00000000
                                          01000000 0 00000000
-                                         0 00080000>;
+                                         0 00100000>;
 
                                pci_bridge@0 {
                                        reg = <0 0 0 0 0>;
                                        #address-cells = <3>;
                                        ranges = <02000000 0 b0000000
                                                  02000000 0 b0000000
-                                                 0 20000000
+                                                 0 00100000
                                                  01000000 0 00000000
                                                  01000000 0 00000000
-                                                 0 00100000>;
+                                                 0 00100000>; 
 
                                        isa@1e {
                                                device_type = "isa";
                                                #size-cells = <1>;
                                                #address-cells = <2>;
                                                reg = <f000 0 0 0 0>;
-                                               ranges = <1 0 01000000 0 0
+                                               ranges = <1 0
+                                                         01000000 0 0
                                                          00001000>;
                                                interrupt-parent = <&i8259>;
 
                                                        built-in;
                                                        compatible = "chrp,iic";
                                                        interrupts = <9 2>;
-                                                       interrupt-parent =
-                                                               <&mpic>;
+                                                       interrupt-parent = <&mpic>;
                                                };
 
                                                i8042@60 {
                                                        #address-cells = <1>;
                                                        reg = <1 60 1 1 64 1>;
                                                        interrupts = <1 3 c 3>;
-                                                       interrupt-parent =
-                                                               <&i8259>;
+                                                       interrupt-parent = <&i8259>;
 
                                                        keyboard@0 {
                                                                reg = <0>;
                                                };
 
                                                rtc@70 {
-                                                       compatible =
-                                                               "pnpPNP,b00";
+                                                       compatible = "pnpPNP,b00";
                                                        reg = <1 70 2>;
                                                };
 
index 5d82709cfcbb38fbd7ee13596f415c2dc38d6972..b0166e5c177e49d499ce4deab88a1eaa9c457a4c 100644 (file)
                        clock-frequency = <1fca055>;
                        interrupt-parent = <&mpic>;
                        interrupts = <18 2>;
-                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map-mask = <fb00 0 0 0>;
                        interrupt-map = <
                                /* IDSEL 0x11 */
-                               8800 0 0 1 &i8259 3 2
-                               8800 0 0 2 &i8259 4 2
-                               8800 0 0 3 &i8259 5 2
-                               8800 0 0 4 &i8259 6 2
+                               8800 0 0 1 &i8259 9 2
+                               8800 0 0 2 &i8259 a 2
+                               8800 0 0 3 &i8259 b 2
+                               8800 0 0 4 &i8259 c 2
 
                                /* IDSEL 0x12 */
-                               9000 0 0 1 &i8259 4 2
-                               9000 0 0 2 &i8259 5 2
-                               9000 0 0 3 &i8259 6 2
-                               9000 0 0 4 &i8259 3 2
-
-                               /* IDSEL 0x13 */
-                               9800 0 0 1 &i8259 0 0
-                               9800 0 0 2 &i8259 0 0
-                               9800 0 0 3 &i8259 0 0
-                               9800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x14 */
-                               a000 0 0 1 &i8259 0 0
-                               a000 0 0 2 &i8259 0 0
-                               a000 0 0 3 &i8259 0 0
-                               a000 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x15 */
-                               a800 0 0 1 &i8259 0 0
-                               a800 0 0 2 &i8259 0 0
-                               a800 0 0 3 &i8259 0 0
-                               a800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x16 */
-                               b000 0 0 1 &i8259 0 0
-                               b000 0 0 2 &i8259 0 0
-                               b000 0 0 3 &i8259 0 0
-                               b000 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x17 */
-                               b800 0 0 1 &i8259 0 0
-                               b800 0 0 2 &i8259 0 0
-                               b800 0 0 3 &i8259 0 0
-                               b800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x18 */
-                               c000 0 0 1 &i8259 0 0
-                               c000 0 0 2 &i8259 0 0
-                               c000 0 0 3 &i8259 0 0
-                               c000 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x19 */
-                               c800 0 0 1 &i8259 0 0
-                               c800 0 0 2 &i8259 0 0
-                               c800 0 0 3 &i8259 0 0
-                               c800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x1a */
-                               d000 0 0 1 &i8259 6 2
-                               d000 0 0 2 &i8259 3 2
-                               d000 0 0 3 &i8259 4 2
-                               d000 0 0 4 &i8259 5 2
-
-
-                               /* IDSEL 0x1b */
-                               d800 0 0 1 &i8259 5 2
-                               d800 0 0 2 &i8259 0 0
-                               d800 0 0 3 &i8259 0 0
-                               d800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x1c */
-                               e000 0 0 1 &i8259 9 2
-                               e000 0 0 2 &i8259 a 2
-                               e000 0 0 3 &i8259 c 2
-                               e000 0 0 4 &i8259 7 2
-
-                               /* IDSEL 0x1d */
-                               e800 0 0 1 &i8259 9 2
-                               e800 0 0 2 &i8259 a 2
-                               e800 0 0 3 &i8259 b 2
-                               e800 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x1e */
-                               f000 0 0 1 &i8259 c 2
-                               f000 0 0 2 &i8259 0 0
-                               f000 0 0 3 &i8259 0 0
-                               f000 0 0 4 &i8259 0 0
-
-                               /* IDSEL 0x1f */
-                               f800 0 0 1 &i8259 6 2
-                               f800 0 0 2 &i8259 0 0
-                               f800 0 0 3 &i8259 0 0
-                               f800 0 0 4 &i8259 0 0
+                               9000 0 0 1 &i8259 a 2
+                               9000 0 0 2 &i8259 b 2
+                               9000 0 0 3 &i8259 c 2
+                               9000 0 0 4 &i8259 9 2
+
+                               // IDSEL 0x1c  USB
+                               e000 0 0 0 &i8259 c 2
+                               e100 0 0 0 &i8259 9 2
+                               e200 0 0 0 &i8259 a 2
+                               e300 0 0 0 &i8259 b 2
+
+                               // IDSEL 0x1d  Audio
+                               e800 0 0 0 &i8259 6 2
+
+                               // IDSEL 0x1e Legacy
+                               f000 0 0 0 &i8259 7 2
+                               f100 0 0 0 &i8259 7 2
+
+                               // IDSEL 0x1f IDE/SATA
+                               f800 0 0 0 &i8259 e 2
+                               f900 0 0 0 &i8259 5 2
                                >;
                        uli1575@0 {
                                reg = <0 0 0 0 0>;
index b732644788db799f83c6c90921ac14cd5f4e8069..13761bf160c406c4b4e29fb9fa8b869db35886f5 100644 (file)
@@ -134,20 +134,6 @@ static char *ft_next(struct ft_cxt *cxt, char *p, struct ft_atom *ret)
 #define HDR_SIZE       _ALIGN(sizeof(struct boot_param_header), 8)
 #define EXPAND_INCR    1024    /* alloc this much extra when expanding */
 
-/* See if the regions are in the standard order and non-overlapping */
-static int ft_ordered(struct ft_cxt *cxt)
-{
-       char *p = (char *)cxt->bph + HDR_SIZE;
-       enum ft_rgn_id r;
-
-       for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
-               if (p > cxt->rgn[r].start)
-                       return 0;
-               p = cxt->rgn[r].start + cxt->rgn[r].size;
-       }
-       return p <= (char *)cxt->bph + cxt->max_size;
-}
-
 /* Copy the tree to a newly-allocated region and put things in order */
 static int ft_reorder(struct ft_cxt *cxt, int nextra)
 {
@@ -573,10 +559,6 @@ int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
        cxt->rgn[FT_STRUCT].size = struct_size(cxt);
        cxt->rgn[FT_STRINGS].start = blob + be32_to_cpu(bph->off_dt_strings);
        cxt->rgn[FT_STRINGS].size = be32_to_cpu(bph->dt_strings_size);
-       /* Leave as '0' to force first ft_make_space call to do a ft_reorder
-        * and move dt to an area allocated by realloc.
-       cxt->isordered = ft_ordered(cxt);
-       */
 
        cxt->p = cxt->rgn[FT_STRUCT].start;
        cxt->str_anchor = cxt->rgn[FT_STRINGS].start;
index f39a72f30aadb81543fd3873491ccf94689b4d85..b0cb2e662c25a6e14f3b8e708a46993422c5e19f 100644 (file)
@@ -81,6 +81,7 @@ obj-y                         += iomap.o
 endif
 
 ifeq ($(CONFIG_PPC_ISERIES),y)
+CFLAGS_lparmap.s               += -g0
 extra-y += lparmap.s
 $(obj)/head_64.o:      $(obj)/lparmap.s
 AFLAGS_head_64.o += -I$(obj)
index e708ab7ca9e845968a6b71d910ecbaaa3f64c6e2..8533de50347d5284b23cbe0538673ba74b6b95fe 100644 (file)
@@ -301,9 +301,19 @@ _GLOBAL(_tlbie)
        mfspr   r4,SPRN_MMUCR
        mfspr   r5,SPRN_PID                     /* Get PID */
        rlwimi  r4,r5,0,24,31                   /* Set TID */
-       mtspr   SPRN_MMUCR,r4
 
+       /* We have to run the search with interrupts disabled, even critical
+        * and debug interrupts (in fact the only critical exceptions we have
+        * are debug and machine check).  Otherwise  an interrupt which causes
+        * a TLB miss can clobber the MMUCR between the mtspr and the tlbsx. */
+       mfmsr   r5
+       lis     r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@ha
+       addi    r6,r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@l
+       andc    r6,r5,r6
+       mtmsr   r6
+       mtspr   SPRN_MMUCR,r4
        tlbsx.  r3, 0, r3
+       mtmsr   r5
        bne     10f
        sync
        /* There are only 64 TLB entries, so r3 < 64,
index 2bb1cb911783e761dd51aaf224c29f116f3930b6..d8502e3775188a2cb76eead66f79dca99fbe0211 100644 (file)
@@ -299,7 +299,7 @@ static inline int check_io_access(struct pt_regs *regs)
 #ifndef CONFIG_FSL_BOOKE
 #define get_mc_reason(regs)    ((regs)->dsisr)
 #else
-#define get_mc_reason(regs)    (mfspr(SPRN_MCSR))
+#define get_mc_reason(regs)    (mfspr(SPRN_MCSR) & MCSR_MASK)
 #endif
 #define REASON_FP              ESR_FP
 #define REASON_ILLEGAL         (ESR_PIL | ESR_PUO)
@@ -414,8 +414,6 @@ void machine_check_exception(struct pt_regs *regs)
                printk("Data Cache Push Parity Error\n");
        if (reason & MCSR_DCPERR)
                printk("Data Cache Parity Error\n");
-       if (reason & MCSR_GL_CI)
-               printk("Guarded Load or Cache-Inhibited stwcx.\n");
        if (reason & MCSR_BUS_IAERR)
                printk("Bus - Instruction Address Error\n");
        if (reason & MCSR_BUS_RAERR)
index f1789578747aa340c7cf3cc7cc006f3f8ef39a98..a47151e806cae072c1836b49f4c3c8630a4c2bd0 100644 (file)
@@ -795,7 +795,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
 
 #ifdef CONFIG_PPC_MM_SLICES
        /* We only prefault standard pages for now */
-       if (unlikely(get_slice_psize(mm, ea) != mm->context.user_psize));
+       if (unlikely(get_slice_psize(mm, ea) != mm->context.user_psize))
                return;
 #endif
 
index f58184086c8cc3aa153b05e65f5e38b745d7f7f7..f620171ad6b1ab7df47ad9c574c0062e57240139 100644 (file)
@@ -33,6 +33,7 @@ config MPC8544_DS
        bool "Freescale MPC8544 DS"
        select PPC_I8259
        select DEFAULT_UIMAGE
+       select FSL_ULI1575
        help
          This option enables support for the MPC8544 DS board
 
index 4905f6f8903b831fa0d5749bd8e5a584a97fbbb7..0f834d8be44478e52a333039b2b8373bee7fdba2 100644 (file)
@@ -114,211 +114,25 @@ void __init mpc8544_ds_pic_init(void)
 }
 
 #ifdef CONFIG_PCI
-enum pirq { PIRQA = 8, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH };
+extern int uses_fsl_uli_m1575;
+extern int uli_exclude_device(struct pci_controller *hose,
+                               u_char bus, u_char devfn);
 
-/*
- * Value in  table -- IRQ number
- */
-const unsigned char uli1575_irq_route_table[16] = {
-       0,              /* 0: Reserved */
-       0x8,
-       0,              /* 2: Reserved */
-       0x2,
-       0x4,
-       0x5,
-       0x7,
-       0x6,
-       0,              /* 8: Reserved */
-       0x1,
-       0x3,
-       0x9,
-       0xb,
-       0,              /* 13: Reserved */
-       0xd,
-       0xf,
-};
-
-static int __devinit
-get_pci_irq_from_of(struct pci_controller *hose, int slot, int pin)
-{
-       struct of_irq oirq;
-       u32 laddr[3];
-       struct device_node *hosenode = hose ? hose->arch_data : NULL;
-
-       if (!hosenode)
-               return -EINVAL;
-
-       laddr[0] = (hose->first_busno << 16) | (PCI_DEVFN(slot, 0) << 8);
-       laddr[1] = laddr[2] = 0;
-       of_irq_map_raw(hosenode, &pin, 1, laddr, &oirq);
-       DBG("mpc8544_ds: pci irq addr %x, slot %d, pin %d, irq %d\n",
-           laddr[0], slot, pin, oirq.specifier[0]);
-       return oirq.specifier[0];
-}
-
-/*8259*/
-static void __devinit quirk_uli1575(struct pci_dev *dev)
-{
-       unsigned short temp;
-       struct pci_controller *hose = pci_bus_to_host(dev->bus);
-       unsigned char irq2pin[16];
-       unsigned long pirq_map_word = 0;
-       u32 irq;
-       int i;
-
-       /*
-        * ULI1575 interrupts route setup
-        */
-       memset(irq2pin, 0, 16); /* Initialize default value 0 */
-
-       irq2pin[6]=PIRQA+3;     /* enabled mapping for IRQ6 to PIRQD, used by SATA */
-
-       /*
-        * PIRQE -> PIRQF mapping set manually
-        *
-        * IRQ pin   IRQ#
-        * PIRQE ---- 9
-        * PIRQF ---- 10
-        * PIRQG ---- 11
-        * PIRQH ---- 12
-        */
-       for (i = 0; i < 4; i++)
-               irq2pin[i + 9] = PIRQE + i;
-
-       /* Set IRQ-PIRQ Mapping to ULI1575 */
-       for (i = 0; i < 16; i++)
-               if (irq2pin[i])
-                       pirq_map_word |= (uli1575_irq_route_table[i] & 0xf)
-                           << ((irq2pin[i] - PIRQA) * 4);
-
-       pirq_map_word |= 1<<26; /* disable INTx in EP mode*/
-
-       /* ULI1575 IRQ mapping conf register default value is 0xb9317542 */
-       DBG("Setup ULI1575 IRQ mapping configuration register value = 0x%x\n",
-               (int)pirq_map_word);
-       pci_write_config_dword(dev, 0x48, pirq_map_word);
-
-#define ULI1575_SET_DEV_IRQ(slot, pin, reg)                            \
-       do {                                                            \
-               int irq;                                                \
-               irq = get_pci_irq_from_of(hose, slot, pin);             \
-               if (irq > 0 && irq < 16)                                \
-                       pci_write_config_byte(dev, reg, irq2pin[irq]);  \
-               else                                                    \
-                       printk(KERN_WARNING "ULI1575 device"            \
-                               "(slot %d, pin %d) irq %d is invalid.\n", \
-                               slot, pin, irq);                        \
-       } while(0)
-
-       /* USB 1.1 OHCI controller 1, slot 28, pin 1 */
-       ULI1575_SET_DEV_IRQ(28, 1, 0x86);
-
-       /* USB 1.1 OHCI controller 2, slot 28, pin 2 */
-       ULI1575_SET_DEV_IRQ(28, 2, 0x87);
-
-       /* USB 1.1 OHCI controller 3, slot 28, pin 3 */
-       ULI1575_SET_DEV_IRQ(28, 3, 0x88);
-
-       /* USB 2.0 controller, slot 28, pin 4 */
-       irq = get_pci_irq_from_of(hose, 28, 4);
-       if (irq >= 0 && irq <= 15)
-               pci_write_config_dword(dev, 0x74, uli1575_irq_route_table[irq]);
-
-       /* Audio controller, slot 29, pin 1 */
-       ULI1575_SET_DEV_IRQ(29, 1, 0x8a);
-
-       /* Modem controller, slot 29, pin 2 */
-       ULI1575_SET_DEV_IRQ(29, 2, 0x8b);
-
-       /* HD audio controller, slot 29, pin 3 */
-       ULI1575_SET_DEV_IRQ(29, 3, 0x8c);
-
-       /* SMB interrupt: slot 30, pin 1 */
-       ULI1575_SET_DEV_IRQ(30, 1, 0x8e);
-
-       /* PMU ACPI SCI interrupt: slot 30, pin 2 */
-       ULI1575_SET_DEV_IRQ(30, 2, 0x8f);
-
-       /* Serial ATA interrupt: slot 31, pin 1 */
-       ULI1575_SET_DEV_IRQ(31, 1, 0x8d);
-
-       /* Primary PATA IDE IRQ: 14
-        * Secondary PATA IDE IRQ: 15
-        */
-       pci_write_config_byte(dev, 0x44, 0x30 | uli1575_irq_route_table[14]);
-       pci_write_config_byte(dev, 0x75, uli1575_irq_route_table[15]);
-
-       /* Set IRQ14 and IRQ15 to legacy IRQs */
-       pci_read_config_word(dev, 0x46, &temp);
-       temp |= 0xc000;
-       pci_write_config_word(dev, 0x46, temp);
-
-       /* Set i8259 interrupt trigger
-        * IRQ 3:  Level
-        * IRQ 4:  Level
-        * IRQ 5:  Level
-        * IRQ 6:  Level
-        * IRQ 7:  Level
-        * IRQ 9:  Level
-        * IRQ 10: Level
-        * IRQ 11: Level
-        * IRQ 12: Level
-        * IRQ 14: Edge
-        * IRQ 15: Edge
-        */
-       outb(0xfa, 0x4d0);
-       outb(0x1e, 0x4d1);
-
-#undef ULI1575_SET_DEV_IRQ
-}
-
-/* SATA */
-static void __devinit quirk_uli5288(struct pci_dev *dev)
+static int mpc85xx_exclude_device(struct pci_controller *hose,
+                                  u_char bus, u_char devfn)
 {
-       unsigned char c;
-
-       pci_read_config_byte(dev, 0x83, &c);
-       c |= 0x80;              /* read/write lock */
-       pci_write_config_byte(dev, 0x83, c);
-
-       pci_write_config_byte(dev, 0x09, 0x01); /* Base class code: storage */
-       pci_write_config_byte(dev, 0x0a, 0x06); /* IDE disk */
+       struct device_node* node;       
+       struct resource rsrc;
 
-       pci_read_config_byte(dev, 0x83, &c);
-       c &= 0x7f;
-       pci_write_config_byte(dev, 0x83, c);
-
-       pci_read_config_byte(dev, 0x84, &c);
-       c |= 0x01;                              /* emulated PATA mode enabled */
-       pci_write_config_byte(dev, 0x84, c);
-}
+       node = (struct device_node *)hose->arch_data;
+       of_address_to_resource(node, 0, &rsrc);
 
-/* PATA */
-static void __devinit quirk_uli5229(struct pci_dev *dev)
-{
-       unsigned short temp;
-       pci_write_config_word(dev, 0x04, 0x0405);       /* MEM IO MSI */
-       pci_read_config_word(dev, 0x4a, &temp);
-       temp |= 0x1000;                         /* Enable Native IRQ 14/15 */
-       pci_write_config_word(dev, 0x4a, temp);
-}
+       if ((rsrc.start & 0xfffff) == 0xb000) {
+               return uli_exclude_device(hose, bus, devfn);
+       }
 
-/*Bridge*/
-static void __devinit early_uli5249(struct pci_dev *dev)
-{
-       unsigned char temp;
-       pci_write_config_word(dev, 0x04, 0x0007);       /* mem access */
-       pci_read_config_byte(dev, 0x7c, &temp);
-       pci_write_config_byte(dev, 0x7c, 0x80); /* R/W lock control */
-       pci_write_config_byte(dev, 0x09, 0x01); /* set as pci-pci bridge */
-       pci_write_config_byte(dev, 0x7c, temp); /* restore pci bus debug control */
-       dev->class |= 0x1;
+       return PCIBIOS_SUCCESSFUL;
 }
-
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_uli1575);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249);
 #endif /* CONFIG_PCI */
 
 /*
@@ -342,6 +156,8 @@ static void __init mpc8544_ds_setup_arch(void)
                else
                        fsl_add_bridge(np, 0);
        }
+       uses_fsl_uli_m1575 = 1;
+       ppc_md.pci_exclude_device = mpc85xx_exclude_device;
 #endif
 
        printk("MPC8544 DS board from Freescale Semiconductor\n");
index 343b76d0d793378fd83f3354ac9ebf20dfc7fc20..685b2fbbbe007609347593cc804af34a64928005 100644 (file)
@@ -7,6 +7,7 @@ config MPC8641_HPCN
        bool "Freescale MPC8641 HPCN"
        select PPC_I8259
        select DEFAULT_UIMAGE
+       select FSL_ULI1575
        help
          This option enables support for the MPC8641 HPCN board.
 
index e9eaa0749ae6405912d7d18fdd6615d75c412ff4..56b27caf7a27b7b050e144abff30b5ea8e2e819b 100644 (file)
@@ -107,220 +107,25 @@ mpc86xx_hpcn_init_irq(void)
 }
 
 #ifdef CONFIG_PCI
+extern int uses_fsl_uli_m1575;
+extern int uli_exclude_device(struct pci_controller *hose,
+                               u_char bus, u_char devfn);
 
-enum pirq{PIRQA = 8, PIRQB, PIRQC, PIRQD, PIRQE, PIRQF, PIRQG, PIRQH};
-const unsigned char uli1575_irq_route_table[16] = {
-       0,      /* 0: Reserved */
-       0x8,    /* 1: 0b1000 */
-       0,      /* 2: Reserved */
-       0x2,    /* 3: 0b0010 */
-       0x4,    /* 4: 0b0100 */
-       0x5,    /* 5: 0b0101 */
-       0x7,    /* 6: 0b0111 */
-       0x6,    /* 7: 0b0110 */
-       0,      /* 8: Reserved */
-       0x1,    /* 9: 0b0001 */
-       0x3,    /* 10: 0b0011 */
-       0x9,    /* 11: 0b1001 */
-       0xb,    /* 12: 0b1011 */
-       0,      /* 13: Reserved */
-       0xd,    /* 14, 0b1101 */
-       0xf,    /* 15, 0b1111 */
-};
-
-static int __devinit
-get_pci_irq_from_of(struct pci_controller *hose, int slot, int pin)
-{
-       struct of_irq oirq;
-       u32 laddr[3];
-       struct device_node *hosenode = hose ? hose->arch_data : NULL;
-
-       if (!hosenode) return -EINVAL;
-
-       laddr[0] = (hose->first_busno << 16) | (PCI_DEVFN(slot, 0) << 8);
-       laddr[1] = laddr[2] = 0;
-       of_irq_map_raw(hosenode, &pin, 1, laddr, &oirq);
-       DBG("mpc86xx_hpcn: pci irq addr %x, slot %d, pin %d, irq %d\n",
-                       laddr[0], slot, pin, oirq.specifier[0]);
-       return oirq.specifier[0];
-}
-
-static void __devinit quirk_uli1575(struct pci_dev *dev)
-{
-       unsigned short temp;
-       struct pci_controller *hose = pci_bus_to_host(dev->bus);
-       unsigned char irq2pin[16], c;
-       unsigned long pirq_map_word = 0;
-       u32 irq;
-       int i;
-
-       /*
-        * ULI1575 interrupts route setup
-        */
-       memset(irq2pin, 0, 16); /* Initialize default value 0 */
-
-       /*
-        * PIRQA -> PIRQD mapping read from OF-tree
-        *
-        * interrupts for PCI slot0 -- PIRQA / PIRQB / PIRQC / PIRQD
-        *                PCI slot1 -- PIRQB / PIRQC / PIRQD / PIRQA
-        */
-       for (i = 0; i < 4; i++){
-               irq = get_pci_irq_from_of(hose, 17, i + 1);
-               if (irq > 0 && irq < 16)
-                       irq2pin[irq] = PIRQA + i;
-               else
-                       printk(KERN_WARNING "ULI1575 device"
-                           "(slot %d, pin %d) irq %d is invalid.\n",
-                           17, i, irq);
-       }
-
-       /*
-        * PIRQE -> PIRQF mapping set manually
-        *
-        * IRQ pin   IRQ#
-        * PIRQE ---- 9
-        * PIRQF ---- 10
-        * PIRQG ---- 11
-        * PIRQH ---- 12
-        */
-       for (i = 0; i < 4; i++) irq2pin[i + 9] = PIRQE + i;
-
-       /* Set IRQ-PIRQ Mapping to ULI1575 */
-       for (i = 0; i < 16; i++)
-               if (irq2pin[i])
-                       pirq_map_word |= (uli1575_irq_route_table[i] & 0xf)
-                               << ((irq2pin[i] - PIRQA) * 4);
-
-       /* ULI1575 IRQ mapping conf register default value is 0xb9317542 */
-       DBG("Setup ULI1575 IRQ mapping configuration register value = 0x%x\n",
-                       pirq_map_word);
-       pci_write_config_dword(dev, 0x48, pirq_map_word);
-
-#define ULI1575_SET_DEV_IRQ(slot, pin, reg)                            \
-       do {                                                            \
-               int irq;                                                \
-               irq = get_pci_irq_from_of(hose, slot, pin);             \
-               if (irq > 0 && irq < 16)                                \
-                       pci_write_config_byte(dev, reg, irq2pin[irq]);  \
-               else                                                    \
-                       printk(KERN_WARNING "ULI1575 device"            \
-                           "(slot %d, pin %d) irq %d is invalid.\n",   \
-                           slot, pin, irq);                            \
-       } while(0)
-
-       /* USB 1.1 OHCI controller 1, slot 28, pin 1 */
-       ULI1575_SET_DEV_IRQ(28, 1, 0x86);
-
-       /* USB 1.1 OHCI controller 2, slot 28, pin 2 */
-       ULI1575_SET_DEV_IRQ(28, 2, 0x87);
-
-       /* USB 1.1 OHCI controller 3, slot 28, pin 3 */
-       ULI1575_SET_DEV_IRQ(28, 3, 0x88);
-
-       /* USB 2.0 controller, slot 28, pin 4 */
-       irq = get_pci_irq_from_of(hose, 28, 4);
-       if (irq >= 0 && irq <=15)
-               pci_write_config_dword(dev, 0x74, uli1575_irq_route_table[irq]);
-
-       /* Audio controller, slot 29, pin 1 */
-       ULI1575_SET_DEV_IRQ(29, 1, 0x8a);
-
-       /* Modem controller, slot 29, pin 2 */
-       ULI1575_SET_DEV_IRQ(29, 2, 0x8b);
-
-       /* HD audio controller, slot 29, pin 3 */
-       ULI1575_SET_DEV_IRQ(29, 3, 0x8c);
-
-       /* SMB interrupt: slot 30, pin 1 */
-       ULI1575_SET_DEV_IRQ(30, 1, 0x8e);
-
-       /* PMU ACPI SCI interrupt: slot 30, pin 2 */
-       ULI1575_SET_DEV_IRQ(30, 2, 0x8f);
-
-       /* Serial ATA interrupt: slot 31, pin 1 */
-       ULI1575_SET_DEV_IRQ(31, 1, 0x8d);
-
-       /* Primary PATA IDE IRQ: 14
-        * Secondary PATA IDE IRQ: 15
-        */
-       pci_write_config_byte(dev, 0x44, 0x30 | uli1575_irq_route_table[14]);
-       pci_write_config_byte(dev, 0x75, uli1575_irq_route_table[15]);
-
-       /* Set IRQ14 and IRQ15 to legacy IRQs */
-       pci_read_config_word(dev, 0x46, &temp);
-       temp |= 0xc000;
-       pci_write_config_word(dev, 0x46, temp);
-
-       /* Set i8259 interrupt trigger
-        * IRQ 3:  Level
-        * IRQ 4:  Level
-        * IRQ 5:  Level
-        * IRQ 6:  Level
-        * IRQ 7:  Level
-        * IRQ 9:  Level
-        * IRQ 10: Level
-        * IRQ 11: Level
-        * IRQ 12: Level
-        * IRQ 14: Edge
-        * IRQ 15: Edge
-        */
-       outb(0xfa, 0x4d0);
-       outb(0x1e, 0x4d1);
-
-#undef ULI1575_SET_DEV_IRQ
-
-       /* Disable the HD interface and enable the AC97 interface. */
-       pci_read_config_byte(dev, 0xb8, &c);
-       c &= 0x7f;
-       pci_write_config_byte(dev, 0xb8, c);
-}
-
-static void __devinit quirk_uli5288(struct pci_dev *dev)
+static int mpc86xx_exclude_device(struct pci_controller *hose,
+                                  u_char bus, u_char devfn)
 {
-       unsigned char c;
+       struct device_node* node;       
+       struct resource rsrc;
 
-       pci_read_config_byte(dev,0x83,&c);
-       c |= 0x80;
-       pci_write_config_byte(dev, 0x83, c);
+       node = (struct device_node *)hose->arch_data;
+       of_address_to_resource(node, 0, &rsrc);
 
-       pci_write_config_byte(dev, 0x09, 0x01);
-       pci_write_config_byte(dev, 0x0a, 0x06);
-
-       pci_read_config_byte(dev,0x83,&c);
-       c &= 0x7f;
-       pci_write_config_byte(dev, 0x83, c);
-
-       pci_read_config_byte(dev,0x84,&c);
-       c |= 0x01;
-       pci_write_config_byte(dev, 0x84, c);
-}
-
-static void __devinit quirk_uli5229(struct pci_dev *dev)
-{
-       unsigned short temp;
-       pci_write_config_word(dev, 0x04, 0x0405);
-       dev->class &= ~0x5;
-       pci_read_config_word(dev, 0x4a, &temp);
-       temp |= 0x1000;
-       pci_write_config_word(dev, 0x4a, temp);
-}
+       if ((rsrc.start & 0xfffff) == 0x8000) {
+               return uli_exclude_device(hose, bus, devfn);
+       }
 
-static void __devinit early_uli5249(struct pci_dev *dev)
-{
-       unsigned char temp;
-       pci_write_config_word(dev, 0x04, 0x0007);
-       pci_read_config_byte(dev, 0x7c, &temp);
-       pci_write_config_byte(dev, 0x7c, 0x80);
-       pci_write_config_byte(dev, 0x09, 0x01);
-       pci_write_config_byte(dev, 0x7c, temp);
-       dev->class |= 0x1;
+       return PCIBIOS_SUCCESSFUL;
 }
-
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_uli1575);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288);
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249);
 #endif /* CONFIG_PCI */
 
 
@@ -353,6 +158,9 @@ mpc86xx_hpcn_setup_arch(void)
                else
                        fsl_add_bridge(np, 0);
        }
+       uses_fsl_uli_m1575 = 1;
+       ppc_md.pci_exclude_device = mpc86xx_exclude_device;
+
 #endif
 
        printk("MPC86xx HPCN board from Freescale Semiconductor\n");
index 932538a93c2bb63c9b31ed677cddd5c4364a97e6..cfc2497415928df5b47a2b7b0ae9ee9d775e90ec 100644 (file)
@@ -282,4 +282,12 @@ config AXON_RAM
          minor numbers are available in /proc/devices, /proc/partitions or
          in /sys/block/axonram?/dev.
 
+config FSL_ULI1575
+       bool
+       default n
+       help
+         Supports for the ULI1575 PCIe south bridge that exists on some
+         Freescale reference boards. The boards all use the ULI in pretty
+         much the same way.
+
 endmenu
index d6e041a46d25ee21e148a1ef153d2e04f6fcee5d..d44e832b01f2c0b3bb782c64161ade8842f6750f 100644 (file)
@@ -1,3 +1,6 @@
+
+obj-$(CONFIG_FSL_ULI1575)      += fsl_uli1575.o
+
 ifeq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_PMAC)         += powermac/
 else
index dd2c6688c8aaa6f0bad47ab8b160856b24c34290..027ac32cc63659c8c2af89270041742dcb96e345 100644 (file)
@@ -45,6 +45,7 @@ asmlinkage long sys_spu_create(const char __user *name,
        if (owner && try_module_get(owner)) {
                if (flags & SPU_CREATE_AFFINITY_SPU) {
                        neighbor = fget_light(neighbor_fd, &fput_needed);
+                       ret = -EBADF;
                        if (neighbor) {
                                ret = spufs_calls.create_thread(name, flags,
                                                                mode, neighbor);
diff --git a/arch/powerpc/platforms/fsl_uli1575.c b/arch/powerpc/platforms/fsl_uli1575.c
new file mode 100644 (file)
index 0000000..afc9141
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * ULI M1575 setup code - specific to Freescale boards
+ *
+ * Copyright 2007 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/mc146818rtc.h>
+
+#include <asm/system.h>
+#include <asm/pci-bridge.h>
+
+#define ULI_PIRQA      0x08
+#define ULI_PIRQB      0x09
+#define ULI_PIRQC      0x0a
+#define ULI_PIRQD      0x0b
+#define ULI_PIRQE      0x0c
+#define ULI_PIRQF      0x0d
+#define ULI_PIRQG      0x0e
+
+#define ULI_8259_NONE  0x00
+#define ULI_8259_IRQ1  0x08
+#define ULI_8259_IRQ3  0x02
+#define ULI_8259_IRQ4  0x04
+#define ULI_8259_IRQ5  0x05
+#define ULI_8259_IRQ6  0x07
+#define ULI_8259_IRQ7  0x06
+#define ULI_8259_IRQ9  0x01
+#define ULI_8259_IRQ10 0x03
+#define ULI_8259_IRQ11 0x09
+#define ULI_8259_IRQ12 0x0b
+#define ULI_8259_IRQ14 0x0d
+#define ULI_8259_IRQ15 0x0f
+
+u8 uli_pirq_to_irq[8] = {
+       ULI_8259_IRQ9,          /* PIRQA */
+       ULI_8259_IRQ10,         /* PIRQB */
+       ULI_8259_IRQ11,         /* PIRQC */
+       ULI_8259_IRQ12,         /* PIRQD */
+       ULI_8259_IRQ5,          /* PIRQE */
+       ULI_8259_IRQ6,          /* PIRQF */
+       ULI_8259_IRQ7,          /* PIRQG */
+       ULI_8259_NONE,          /* PIRQH */
+};
+
+/* set in board code if you want this quirks to do something */
+int uses_fsl_uli_m1575;
+
+/* Bridge */
+static void __devinit early_uli5249(struct pci_dev *dev)
+{
+       unsigned char temp;
+
+       if (!uses_fsl_uli_m1575)
+               return;
+
+       pci_write_config_word(dev, PCI_COMMAND, PCI_COMMAND_IO |
+                PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
+
+       /* read/write lock */
+       pci_read_config_byte(dev, 0x7c, &temp);
+       pci_write_config_byte(dev, 0x7c, 0x80);
+
+       /* set as P2P bridge */
+       pci_write_config_byte(dev, PCI_CLASS_PROG, 0x01);
+       dev->class |= 0x1;
+
+       /* restore lock */
+       pci_write_config_byte(dev, 0x7c, temp);
+}
+
+
+static void __devinit quirk_uli1575(struct pci_dev *dev)
+{
+       int i;
+
+       if (!uses_fsl_uli_m1575)
+               return;
+
+       /*
+        * ULI1575 interrupts route setup
+        */
+
+       /* ULI1575 IRQ mapping conf register maps PIRQx to IRQn */
+       for (i = 0; i < 4; i++) {
+               u8 val = uli_pirq_to_irq[i*2] | (uli_pirq_to_irq[i*2+1] << 4);
+               pci_write_config_byte(dev, 0x48 + i, val);
+       }
+
+       /* USB 1.1 OHCI controller 1: dev 28, func 0 - IRQ12 */
+       pci_write_config_byte(dev, 0x86, ULI_PIRQD);
+
+       /* USB 1.1 OHCI controller 2: dev 28, func 1 - IRQ9 */
+       pci_write_config_byte(dev, 0x87, ULI_PIRQA);
+
+       /* USB 1.1 OHCI controller 3: dev 28, func 2 - IRQ10 */
+       pci_write_config_byte(dev, 0x88, ULI_PIRQB);
+
+       /* Lan controller: dev 27, func 0 - IRQ6 */
+       pci_write_config_byte(dev, 0x89, ULI_PIRQF);
+
+       /* AC97 Audio controller: dev 29, func 0 - IRQ6 */
+       pci_write_config_byte(dev, 0x8a, ULI_PIRQF);
+
+       /* Modem controller: dev 29, func 1 - IRQ6 */
+       pci_write_config_byte(dev, 0x8b, ULI_PIRQF);
+
+       /* HD Audio controller: dev 29, func 2 - IRQ6 */
+       pci_write_config_byte(dev, 0x8c, ULI_PIRQF);
+
+       /* SATA controller: dev 31, func 1 - IRQ5 */
+       pci_write_config_byte(dev, 0x8d, ULI_PIRQE);
+
+       /* SMB interrupt: dev 30, func 1 - IRQ7 */
+       pci_write_config_byte(dev, 0x8e, ULI_PIRQG);
+
+       /* PMU ACPI SCI interrupt: dev 30, func 2 - IRQ7 */
+       pci_write_config_byte(dev, 0x8f, ULI_PIRQG);
+
+       /* USB 2.0 controller: dev 28, func 3 */
+       pci_write_config_byte(dev, 0x74, ULI_8259_IRQ11);
+
+       /* Primary PATA IDE IRQ: 14
+        * Secondary PATA IDE IRQ: 15
+        */
+       pci_write_config_byte(dev, 0x44, 0x30 | ULI_8259_IRQ14);
+       pci_write_config_byte(dev, 0x75, ULI_8259_IRQ15);
+}
+
+static void __devinit quirk_final_uli1575(struct pci_dev *dev)
+{
+       /* Set i8259 interrupt trigger
+        * IRQ 3:  Level
+        * IRQ 4:  Level
+        * IRQ 5:  Level
+        * IRQ 6:  Level
+        * IRQ 7:  Level
+        * IRQ 9:  Level
+        * IRQ 10: Level
+        * IRQ 11: Level
+        * IRQ 12: Level
+        * IRQ 14: Edge
+        * IRQ 15: Edge
+        */
+       if (!uses_fsl_uli_m1575)
+               return;
+
+       outb(0xfa, 0x4d0);
+       outb(0x1e, 0x4d1);
+
+       /* setup RTC */
+       CMOS_WRITE(RTC_SET, RTC_CONTROL);
+       CMOS_WRITE(RTC_24H, RTC_CONTROL);
+
+       /* ensure month, date, and week alarm fields are ignored */
+       CMOS_WRITE(0, RTC_VALID);
+
+       outb_p(0x7c, 0x72);
+       outb_p(RTC_ALARM_DONT_CARE, 0x73);
+
+       outb_p(0x7d, 0x72);
+       outb_p(RTC_ALARM_DONT_CARE, 0x73);
+}
+
+/* SATA */
+static void __devinit quirk_uli5288(struct pci_dev *dev)
+{
+       unsigned char c;
+       unsigned int d;
+
+       if (!uses_fsl_uli_m1575)
+               return;
+
+       /* read/write lock */
+       pci_read_config_byte(dev, 0x83, &c);
+       pci_write_config_byte(dev, 0x83, c|0x80);
+
+       pci_read_config_dword(dev, PCI_CLASS_REVISION, &d);
+       d = (d & 0xff) | (PCI_CLASS_STORAGE_SATA_AHCI << 8);
+       pci_write_config_dword(dev, PCI_CLASS_REVISION, d);
+
+       /* restore lock */
+       pci_write_config_byte(dev, 0x83, c);
+
+       /* disable emulated PATA mode enabled */
+       pci_read_config_byte(dev, 0x84, &c);
+       pci_write_config_byte(dev, 0x84, c & ~0x01);
+}
+
+/* PATA */
+static void __devinit quirk_uli5229(struct pci_dev *dev)
+{
+       unsigned short temp;
+
+       if (!uses_fsl_uli_m1575)
+               return;
+
+       pci_write_config_word(dev, PCI_COMMAND, PCI_COMMAND_INTX_DISABLE |
+               PCI_COMMAND_MASTER | PCI_COMMAND_IO);
+
+       /* Enable Native IRQ 14/15 */
+       pci_read_config_word(dev, 0x4a, &temp);
+       pci_write_config_word(dev, 0x4a, temp | 0x1000);
+}
+
+/* We have to do a dummy read on the P2P for the RTC to work, WTF */
+static void __devinit quirk_final_uli5249(struct pci_dev *dev)
+{
+       int i;
+       u8 *dummy;
+       struct pci_bus *bus = dev->bus;
+
+       for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
+               if ((bus->resource[i]) &&
+                       (bus->resource[i]->flags & IORESOURCE_MEM)) {
+                       dummy = ioremap(bus->resource[i]->start, 0x4);
+                       if (dummy) {
+                               in_8(dummy);
+                               iounmap(dummy);
+                       }
+                       break;
+               }
+       }
+}
+
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AL, 0x5249, early_uli5249);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_uli1575);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5249, quirk_final_uli5249);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x1575, quirk_final_uli1575);
+
+int uli_exclude_device(struct pci_controller *hose,
+                       u_char bus, u_char devfn)
+{
+       if (bus == (hose->first_busno + 2)) {
+               /* exclude Modem controller */
+               if ((PCI_SLOT(devfn) == 29) && (PCI_FUNC(devfn) == 1))
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+
+               /* exclude HD Audio controller */
+               if ((PCI_SLOT(devfn) == 29) && (PCI_FUNC(devfn) == 2))
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
index e23a5a874ad39ae436152ad0475df49a1f48ae8d..ce15cada88d4ed992b478d828e8f896b0e6f85be 100644 (file)
@@ -372,7 +372,7 @@ static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
                    notify_event->dev_type == repo->dev_type) {
                        pr_debug("%s:%u: device ready: dev_id %u\n", __func__,
                                 __LINE__, repo->dev_id);
-                       result = 0;
+                       error = 0;
                        break;
                }
 
index 9fb0ce5c71766c5807467ad76a906fe9a15744d4..114c90f8f560e74eee8cd6560f3d5f40e4bb6221 100644 (file)
@@ -251,6 +251,8 @@ DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_transpare
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_transparent);
+DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_transparent);
+DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_transparent);
index 727453d3e8b919cac9d5d435a5980842abc46cbd..1cf29c9d4408dbb4cfa863b16abb441a15b6cc07 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/platform_device.h>
+#include <linux/of_platform.h>
 #include <linux/phy.h>
 #include <linux/fsl_devices.h>
 #include <linux/fs_enet_pd.h>
index e276048b8c5faa6053717ae2e05379b82db6461e..0c9ac7ee08fbf98e00ae592884a5b85411907575 100644 (file)
@@ -20,14 +20,16 @@ static int  __init add_rtc(void)
 {
        struct device_node *np;
        struct platform_device *pd;
-       struct resource res;
+       struct resource res[2];
        int ret;
 
+       memset(&res, 0, sizeof(res));
+
        np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00");
        if (!np)
                return -ENODEV;
 
-       ret = of_address_to_resource(np, 0, &res);
+       ret = of_address_to_resource(np, 0, &res[0]);
        of_node_put(np);
        if (ret)
                return ret;
@@ -36,11 +38,18 @@ static int  __init add_rtc(void)
         * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h.  Verify that the
         * address provided by the device node matches.
         */
-       if (res.start != RTC_PORT(0))
+       if (res[0].start != RTC_PORT(0))
                return -EINVAL;
 
+       /* Use a fixed interrupt value of 8 since on PPC if we are using this
+        * its off an i8259 which we ensure has interrupt numbers 0..15. */
+       res[1].start = 8;
+       res[1].end = 8;
+       res[1].flags = IORESOURCE_IRQ;
+
        pd = platform_device_register_simple("rtc_cmos", -1,
-                                            &res, 1);
+                                            &res[0], 2);
+
        if (IS_ERR(pd))
                return PTR_ERR(pd);
 
index 0da55368655c90a0018504d79c0125fd51326e25..a22e1f4d94c82edd1c3ee92d7ea491b82a716b30 100644 (file)
@@ -237,9 +237,19 @@ _GLOBAL(_tlbie)
        mfspr   r4,SPRN_MMUCR
        mfspr   r5,SPRN_PID                     /* Get PID */
        rlwimi  r4,r5,0,24,31                   /* Set TID */
-       mtspr   SPRN_MMUCR,r4
 
+       /* We have to run the search with interrupts disabled, even critical
+        * and debug interrupts (in fact the only critical exceptions we have
+        * are debug and machine check).  Otherwise  an interrupt which causes
+        * a TLB miss can clobber the MMUCR between the mtspr and the tlbsx. */
+       mfmsr   r5
+       lis     r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@ha
+       addi    r6,r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@l
+       andc    r6,r5,r6
+       mtmsr   r6
+       mtspr   SPRN_MMUCR,r4
        tlbsx.  r3, 0, r3
+       mtmsr   r5
        bne     10f
        sync
        /* There are only 64 TLB entries, so r3 < 64,
index ad4ca75c0f044dd66b7fdbbfc502f5cd4d0a7adb..5245717295b82f5e9a42d07af8a6c160c6367cbf 100644 (file)
@@ -60,17 +60,28 @@ static void hypfs_add_dentry(struct dentry *dentry)
        hypfs_last_dentry = dentry;
 }
 
+static inline int hypfs_positive(struct dentry *dentry)
+{
+       return dentry->d_inode && !d_unhashed(dentry);
+}
+
 static void hypfs_remove(struct dentry *dentry)
 {
        struct dentry *parent;
 
        parent = dentry->d_parent;
-       if (S_ISDIR(dentry->d_inode->i_mode))
-               simple_rmdir(parent->d_inode, dentry);
-       else
-               simple_unlink(parent->d_inode, dentry);
+       if (!parent || !parent->d_inode)
+               return;
+       mutex_lock(&parent->d_inode->i_mutex);
+       if (hypfs_positive(dentry)) {
+               if (S_ISDIR(dentry->d_inode->i_mode))
+                       simple_rmdir(parent->d_inode, dentry);
+               else
+                       simple_unlink(parent->d_inode, dentry);
+       }
        d_delete(dentry);
        dput(dentry);
+       mutex_unlock(&parent->d_inode->i_mutex);
 }
 
 static void hypfs_delete_tree(struct dentry *root)
@@ -315,6 +326,7 @@ static int hypfs_fill_super(struct super_block *sb, void *data, int silent)
        }
        hypfs_update_update(sb);
        sb->s_root = root_dentry;
+       printk(KERN_INFO "hypfs: Hypervisor filesystem mounted\n");
        return 0;
 
 err_tree:
@@ -356,13 +368,17 @@ static struct dentry *hypfs_create_file(struct super_block *sb,
        qname.name = name;
        qname.len = strlen(name);
        qname.hash = full_name_hash(name, qname.len);
+       mutex_lock(&parent->d_inode->i_mutex);
        dentry = lookup_one_len(name, parent, strlen(name));
-       if (IS_ERR(dentry))
-               return ERR_PTR(-ENOMEM);
+       if (IS_ERR(dentry)) {
+               dentry = ERR_PTR(-ENOMEM);
+               goto fail;
+       }
        inode = hypfs_make_inode(sb, mode);
        if (!inode) {
                dput(dentry);
-               return ERR_PTR(-ENOMEM);
+               dentry = ERR_PTR(-ENOMEM);
+               goto fail;
        }
        if (mode & S_IFREG) {
                inode->i_fop = &hypfs_file_ops;
@@ -379,6 +395,8 @@ static struct dentry *hypfs_create_file(struct super_block *sb,
        inode->i_private = data;
        d_instantiate(dentry, inode);
        dget(dentry);
+fail:
+       mutex_unlock(&parent->d_inode->i_mutex);
        return dentry;
 }
 
@@ -391,7 +409,6 @@ struct dentry *hypfs_mkdir(struct super_block *sb, struct dentry *parent,
        if (IS_ERR(dentry))
                return dentry;
        hypfs_add_dentry(dentry);
-       parent->d_inode->i_nlink++;
        return dentry;
 }
 
index 3195d375bd51b782b9567b0ce82d46e60869fed2..56cb71007cd9a26277c4bc6c3a7873fe357e291e 100644 (file)
@@ -6,7 +6,7 @@ EXTRA_AFLAGS    := -traditional
 
 obj-y  :=  bitmap.o traps.o time.o process.o base.o early.o \
             setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
-           semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o
+           semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o
 
 obj-y  += $(if $(CONFIG_64BIT),entry64.o,entry.o)
 obj-y  += $(if $(CONFIG_64BIT),reipl64.o,reipl.o)
diff --git a/arch/s390/kernel/diag.c b/arch/s390/kernel/diag.c
new file mode 100644 (file)
index 0000000..c032d11
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Implementation of s390 diagnose codes
+ *
+ * Copyright IBM Corp. 2007
+ * Author(s): Michael Holzheu <holzheu@de.ibm.com>
+ */
+
+#include <linux/module.h>
+#include <asm/diag.h>
+
+/*
+ * Diagnose 10: Release pages
+ */
+void diag10(unsigned long addr)
+{
+       if (addr >= 0x7ff00000)
+               return;
+       asm volatile(
+#ifdef CONFIG_64BIT
+               "       sam31\n"
+               "       diag    %0,%0,0x10\n"
+               "0:     sam64\n"
+#else
+               "       diag    %0,%0,0x10\n"
+               "0:\n"
+#endif
+               EX_TABLE(0b, 0b)
+               : : "a" (addr));
+}
+EXPORT_SYMBOL(diag10);
+
+/*
+ * Diagnose 14: Input spool file manipulation
+ */
+int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode)
+{
+       register unsigned long _ry1 asm("2") = ry1;
+       register unsigned long _ry2 asm("3") = subcode;
+       int rc = 0;
+
+       asm volatile(
+#ifdef CONFIG_64BIT
+               "   sam31\n"
+               "   diag    %2,2,0x14\n"
+               "   sam64\n"
+#else
+               "   diag    %2,2,0x14\n"
+#endif
+               "   ipm     %0\n"
+               "   srl     %0,28\n"
+               : "=d" (rc), "+d" (_ry2)
+               : "d" (rx), "d" (_ry1)
+               : "cc");
+
+       return rc;
+}
+EXPORT_SYMBOL(diag14);
+
+/*
+ * Diagnose 210: Get information about a virtual device
+ */
+int diag210(struct diag210 *addr)
+{
+       /*
+        * diag 210 needs its data below the 2GB border, so we
+        * use a static data area to be sure
+        */
+       static struct diag210 diag210_tmp;
+       static DEFINE_SPINLOCK(diag210_lock);
+       unsigned long flags;
+       int ccode;
+
+       spin_lock_irqsave(&diag210_lock, flags);
+       diag210_tmp = *addr;
+
+#ifdef CONFIG_64BIT
+       asm volatile(
+               "       lhi     %0,-1\n"
+               "       sam31\n"
+               "       diag    %1,0,0x210\n"
+               "0:     ipm     %0\n"
+               "       srl     %0,28\n"
+               "1:     sam64\n"
+               EX_TABLE(0b, 1b)
+               : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
+#else
+       asm volatile(
+               "       lhi     %0,-1\n"
+               "       diag    %1,0,0x210\n"
+               "0:     ipm     %0\n"
+               "       srl     %0,28\n"
+               "1:\n"
+               EX_TABLE(0b, 1b)
+               : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
+#endif
+
+       *addr = diag210_tmp;
+       spin_unlock_irqrestore(&diag210_lock, flags);
+
+       return ccode;
+}
+EXPORT_SYMBOL(diag210);
index d3057318f2bfc21e0f20524b3a9e1830e077c1eb..50d2235df732456482201077904cddad27e99970 100644 (file)
@@ -577,7 +577,7 @@ static struct insn opcode_b2[] = {
        { "esta", 0x4a, INSTR_RRE_RR },
        { "lura", 0x4b, INSTR_RRE_RR },
        { "tar", 0x4c, INSTR_RRE_AR },
-       { "cpya", INSTR_RRE_AA },
+       { "cpya", 0x4d, INSTR_RRE_AA },
        { "sar", 0x4e, INSTR_RRE_AR },
        { "ear", 0x4f, INSTR_RRE_RA },
        { "csp", 0x50, INSTR_RRE_RR },
index 358d2bbbc48105854d67fac55c33f2ce943bbbb0..e40373d9fbce7ba975f3cbba412c70368988273d 100644 (file)
@@ -85,7 +85,7 @@ void __kprobes get_instruction_type(struct arch_specific_insn *ainsn)
        ainsn->reg = (*ainsn->insn & 0xf0) >> 4;
 
        /* save the instruction length (pop 5-5) in bytes */
-       switch (*(__u8 *) (ainsn->insn) >> 4) {
+       switch (*(__u8 *) (ainsn->insn) >> 6) {
        case 0:
                ainsn->ilen = 2;
                break;
index 90b5ef529eb7e881acf62b7a1e45386c8e074ba8..7234c737f8250b72ebb7eb2f8a5683472c34a502 100644 (file)
@@ -25,7 +25,6 @@ EXPORT_SYMBOL(_oi_bitmap);
 EXPORT_SYMBOL(_ni_bitmap);
 EXPORT_SYMBOL(_zb_findmap);
 EXPORT_SYMBOL(_sb_findmap);
-EXPORT_SYMBOL(diag10);
 
 /*
  * semaphore ops
index c5b2f4f078bc7fbd3f58ac9c6eb58ad05f3b4e82..fabc50adc46a4f9447466861883e1b3601b261a1 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <asm/pgalloc.h>
 #include <asm/uaccess.h>
+#include <asm/diag.h>
 
 static char *sender = "VMRMSVM";
 module_param(sender, charp, 0400);
index 9098531a26714050ddcabbf28510712f002bba09..3a25bbf2eb0ac922fc0010e0336c1ef6ad387538 100644 (file)
@@ -42,23 +42,6 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE)));
 char  empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
 
-void diag10(unsigned long addr)
-{
-        if (addr >= 0x7ff00000)
-                return;
-       asm volatile(
-#ifdef CONFIG_64BIT
-               "       sam31\n"
-               "       diag    %0,%0,0x10\n"
-               "0:     sam64\n"
-#else
-               "       diag    %0,%0,0x10\n"
-               "0:\n"
-#endif
-               EX_TABLE(0b,0b)
-               : : "a" (addr));
-}
-
 void show_mem(void)
 {
        int i, total = 0, reserved = 0;
index 3d211aa33cd8066efe02b9ffb4dd2ac9b48e5569..97ac58682d0fc10726b292093a92e1d5c99e3450 100644 (file)
@@ -34,6 +34,8 @@ isa-y                 := $(isa-y)-nofpu
 endif
 endif
 
+isa-y                  := $(isa-y)-up
+
 cflags-$(CONFIG_CPU_SH2)               := $(call cc-option,-m2,)
 cflags-$(CONFIG_CPU_SH2A)              += $(call cc-option,-m2a,) \
                                           $(call cc-option,-m2a-nofpu,)
@@ -46,7 +48,20 @@ cflags-$(CONFIG_CPU_SH4A)            += $(call cc-option,-m4a,) \
 cflags-$(CONFIG_CPU_BIG_ENDIAN)                += -mb
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     += -ml
 
-cflags-y       += $(call as-option,-Wa$(comma)-isa=$(isa-y),) -ffreestanding
+#
+# -Wa,-isa= tuning implies -Wa,-dsp for the versions of binutils that
+# support it, while -Wa,-dsp by itself limits the range of usable opcodes
+# on certain CPU subtypes. Try the ISA variant first, and if that fails,
+# fall back on -Wa,-dsp for the old binutils versions. Even without DSP
+# opcodes, we always want the best ISA tuning the version of binutils
+# will provide.
+#
+isaflags-y     := $(call as-option,-Wa$(comma)-isa=$(isa-y),)
+
+isaflags-$(CONFIG_SH_DSP)              := \
+       $(call as-option,-Wa$(comma)-isa=$(isa-y),-Wa$(comma)-dsp)
+
+cflags-y       += $(isaflags-y) -ffreestanding
 
 cflags-$(CONFIG_MORE_COMPILE_OPTIONS)  += \
        $(shell echo $(CONFIG_COMPILE_OPTIONS) | sed -e 's/"//g')
index 6e4e9654135816e1a64ee8e71b647c08e0fcf41f..dab193293f2034c37f36090c1672540da299db0e 100644 (file)
@@ -41,3 +41,8 @@ static int __init sh4202_devices_setup(void)
                                    ARRAY_SIZE(sh4202_devices));
 }
 __initcall(sh4202_devices_setup);
+
+void __init plat_irq_setup(void)
+{
+       /* do nothing - all IRL interrupts are handled by the board code */
+}
index 9833493d8867a097549182ba55aec047df4ee526..80b637c302035995ef6823d85b7186174d7060d6 100644 (file)
@@ -76,7 +76,7 @@ static void scif_sercon_putc(int c)
        sci_in(&scif_port, SCxSR);
        sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40));
 
-       while ((sci_in(&scif_port, SCxSR) & 0x40) == 0);
+       while ((sci_in(&scif_port, SCxSR) & 0x40) == 0)
                ;
 
        if (c == '\n')
index 23c5948f0124675862511d4e7fcb995399ce2a86..129b2cfd18a84db251d5791e17bb7c4360f869ae 100644 (file)
@@ -90,6 +90,13 @@ void __init sh_mv_setup(void)
                machvec_size = ((unsigned long)&__machvec_end -
                                (unsigned long)&__machvec_start);
 
+               /*
+                * Sanity check for machvec section alignment. Ensure
+                * __initmv hasn't been misused.
+                */
+               if (machvec_size % sizeof(struct sh_machine_vector))
+                       panic("machvec misaligned, invalid __initmv use?");
+
                /*
                 * If the machvec hasn't been preselected, use the first
                 * vector (usually the only one) from .machvec.init.
index 891d1d46c902dba4850f950539951b7bc2ec4b2a..f64a2d2416d4a364e0330ae5cab5e64666a65e54 100644 (file)
@@ -93,6 +93,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        case PTRACE_PEEKTEXT: /* read word at location addr. */
        case PTRACE_PEEKDATA:
                ret = generic_ptrace_peekdata(child, addr, data);
+               break;
 
        /* read the word at location addr in the USER area. */
        case PTRACE_PEEKUSR: {
index 53e9d20a874a4c6b75c44d949763261f87525893..2b7264c0c6f71827dad142aa1d43db000ebdbc0c 100644 (file)
 #include <asm/setup.h>
 #include <asm/smp.h>
 
-#ifdef CONFIG_VT
-#include <linux/console.h>
-#endif
-
 struct screen_info screen_info;
 
 #ifdef CONFIG_BLK_DEV_RAM
index 0bb4a8f94276ea80c1d7b3731d3c2ce08c13816e..79fc48cf54c625999b7f14b5fa2cac7a56114752 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/stddef.h>
-#include <linux/personality.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
index ac352eb6dff3beb4753cefc885078c87284c053e..e2d02fd13f35f6284d7f54fe4352d60b9279dd12 100644 (file)
@@ -238,6 +238,7 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d
        sd = &dev->ofdev.dev.archdata;
        sd->prom_node = dp;
        sd->op = &dev->ofdev;
+       sd->iommu = dev->bus->ofdev.dev.parent->archdata.iommu;
 
        dev->ofdev.node = dp;
        dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
index 4ccda77d08d6bf7d180036f09d452b2813784676..7c89893b1fe8789e71a05694660540ac943bb4c8 100644 (file)
@@ -66,7 +66,7 @@ iounit_init(int sbi_node, int io_node, struct sbus_bus *sbus)
        }
        if(!xpt) panic("Cannot map External Page Table.");
        
-       sbus->iommu = (struct iommu_struct *)iounit;
+       sbus->ofdev.dev.archdata.iommu = iounit;
        iounit->page_table = xpt;
        spin_lock_init(&iounit->lock);
        
@@ -127,7 +127,7 @@ nexti:      scan = find_next_zero_bit(iounit->bmap, limit, scan);
 static __u32 iounit_get_scsi_one(char *vaddr, unsigned long len, struct sbus_bus *sbus)
 {
        unsigned long ret, flags;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
        
        spin_lock_irqsave(&iounit->lock, flags);
        ret = iounit_get_area(iounit, (unsigned long)vaddr, len);
@@ -138,7 +138,7 @@ static __u32 iounit_get_scsi_one(char *vaddr, unsigned long len, struct sbus_bus
 static void iounit_get_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus *sbus)
 {
        unsigned long flags;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
 
        /* FIXME: Cache some resolved pages - often several sg entries are to the same page */
        spin_lock_irqsave(&iounit->lock, flags);
@@ -153,7 +153,7 @@ static void iounit_get_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_bus
 static void iounit_release_scsi_one(__u32 vaddr, unsigned long len, struct sbus_bus *sbus)
 {
        unsigned long flags;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
        
        spin_lock_irqsave(&iounit->lock, flags);
        len = ((vaddr & ~PAGE_MASK) + len + (PAGE_SIZE-1)) >> PAGE_SHIFT;
@@ -168,7 +168,7 @@ static void iounit_release_scsi_sgl(struct scatterlist *sg, int sz, struct sbus_
 {
        unsigned long flags;
        unsigned long vaddr, len;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
 
        spin_lock_irqsave(&iounit->lock, flags);
        while (sz != 0) {
@@ -211,7 +211,7 @@ static int iounit_map_dma_area(dma_addr_t *pba, unsigned long va, __u32 addr, in
                        i = ((addr - IOUNIT_DMA_BASE) >> PAGE_SHIFT);
 
                        for_each_sbus(sbus) {
-                               struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+                               struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
 
                                iopte = (iopte_t *)(iounit->page_table + i);
                                *iopte = MKIOPTE(__pa(page));
@@ -235,7 +235,7 @@ static void iounit_unmap_dma_area(unsigned long addr, int len)
 static struct page *iounit_translate_dvma(unsigned long addr)
 {
        struct sbus_bus *sbus = sbus_root;      /* They are all the same */
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
        int i;
        iopte_t *iopte;
 
@@ -279,7 +279,7 @@ __u32 iounit_map_dma_init(struct sbus_bus *sbus, int size)
        unsigned long rotor, scan, limit;
        unsigned long flags;
        __u32 ret;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
 
         npages = (size + (PAGE_SIZE-1)) >> PAGE_SHIFT;
        i = 0x0213;
@@ -315,7 +315,7 @@ nexti:      scan = find_next_zero_bit(iounit->bmap, limit, scan);
 __u32 iounit_map_dma_page(__u32 vaddr, void *addr, struct sbus_bus *sbus)
 {
        int scan = (vaddr - IOUNIT_DMA_BASE) >> PAGE_SHIFT;
-       struct iounit_struct *iounit = (struct iounit_struct *)sbus->iommu;
+       struct iounit_struct *iounit = sbus->ofdev.dev.archdata.iommu;
        
        iounit->page_table[scan] = MKIOPTE(__pa(((unsigned long)addr) & PAGE_MASK));
        return vaddr + (((unsigned long)addr) & ~PAGE_MASK);
index be042efd1ba4311b6060a92f565f492e6fe04c6d..52e907af9d29e7b248a09b60987432cfe017cb9a 100644 (file)
@@ -132,7 +132,7 @@ iommu_init(int iommund, struct sbus_bus *sbus)
            impl, vers, iommu->page_table,
            (int)(IOMMU_NPTES*sizeof(iopte_t)), (int)IOMMU_NPTES);
 
-       sbus->iommu = iommu;
+       sbus->ofdev.dev.archdata.iommu = iommu;
 }
 
 /* This begs to be btfixup-ed by srmmu. */
@@ -166,7 +166,7 @@ static void iommu_flush_iotlb(iopte_t *iopte, unsigned int niopte)
 
 static u32 iommu_get_one(struct page *page, int npages, struct sbus_bus *sbus)
 {
-       struct iommu_struct *iommu = sbus->iommu;
+       struct iommu_struct *iommu = sbus->ofdev.dev.archdata.iommu;
        int ioptex;
        iopte_t *iopte, *iopte0;
        unsigned int busa, busa0;
@@ -291,7 +291,7 @@ static void iommu_get_scsi_sgl_pflush(struct scatterlist *sg, int sz, struct sbu
 
 static void iommu_release_one(u32 busa, int npages, struct sbus_bus *sbus)
 {
-       struct iommu_struct *iommu = sbus->iommu;
+       struct iommu_struct *iommu = sbus->ofdev.dev.archdata.iommu;
        int ioptex;
        int i;
 
@@ -334,7 +334,7 @@ static int iommu_map_dma_area(dma_addr_t *pba, unsigned long va,
     unsigned long addr, int len)
 {
        unsigned long page, end;
-       struct iommu_struct *iommu = sbus_root->iommu;
+       struct iommu_struct *iommu = sbus_root->ofdev.dev.archdata.iommu;
        iopte_t *iopte = iommu->page_table;
        iopte_t *first;
        int ioptex;
@@ -399,7 +399,7 @@ static int iommu_map_dma_area(dma_addr_t *pba, unsigned long va,
 
 static void iommu_unmap_dma_area(unsigned long busa, int len)
 {
-       struct iommu_struct *iommu = sbus_root->iommu;
+       struct iommu_struct *iommu = sbus_root->ofdev.dev.archdata.iommu;
        iopte_t *iopte = iommu->page_table;
        unsigned long end;
        int ioptex = (busa - iommu->start) >> PAGE_SHIFT;
@@ -420,7 +420,7 @@ static void iommu_unmap_dma_area(unsigned long busa, int len)
 
 static struct page *iommu_translate_dvma(unsigned long busa)
 {
-       struct iommu_struct *iommu = sbus_root->iommu;
+       struct iommu_struct *iommu = sbus_root->ofdev.dev.archdata.iommu;
        iopte_t *iopte = iommu->page_table;
 
        iopte += ((busa - iommu->start) >> PAGE_SHIFT);
index 79d60d86f6f8785b11dbf09c75bb8ef6ecc5f3ae..005a3e72d4f2dbf468b6a31a47d85c8ed507ebab 100644 (file)
@@ -268,7 +268,6 @@ static inline void sun4c_init_clean_mmu(unsigned long kernel_end)
        unsigned char savectx, ctx;
 
        savectx = sun4c_get_context();
-       kernel_end = SUN4C_REAL_PGDIR_ALIGN(kernel_end);
        for (ctx = 0; ctx < num_contexts; ctx++) {
                sun4c_set_context(ctx);
                for (vaddr = 0; vaddr < 0x20000000; vaddr += SUN4C_REAL_PGDIR_SIZE)
@@ -2064,7 +2063,6 @@ void __init sun4c_paging_init(void)
        unsigned long end_pfn, pages_avail;
 
        kernel_end = (unsigned long) &end;
-       kernel_end += (SUN4C_REAL_PGDIR_SIZE * 4);
        kernel_end = SUN4C_REAL_PGDIR_ALIGN(kernel_end);
 
        pages_avail = 0;
index ac18bd8e273f5badb0df5bcd5d467f5349e50568..63144ad476f6663c1ab3ed98fd252503fc89ebdb 100644 (file)
@@ -501,7 +501,7 @@ niagara_tlb_fixup:
        cmp     %g1, SUN4V_CHIP_NIAGARA1
        be,pt   %xcc, niagara_patch
         cmp    %g1, SUN4V_CHIP_NIAGARA2
-       be,pt   %xcc, niagara_patch
+       be,pt   %xcc, niagara2_patch
         nop
 
        call    generic_patch_copyops
@@ -512,6 +512,15 @@ niagara_tlb_fixup:
         nop
 
        ba,a,pt %xcc, 80f
+niagara2_patch:
+       call    niagara2_patch_copyops
+        nop
+       call    niagara_patch_bzero
+        nop
+       call    niagara2_patch_pageops
+        nop
+
+       ba,a,pt %xcc, 80f
 
 niagara_patch:
        call    niagara_patch_copyops
@@ -706,12 +715,13 @@ setup_trap_table:
 
        membar  #Sync
 
+       BRANCH_IF_SUN4V(o2, 1f)
+
        /* Kill PROM timer */
        sethi   %hi(0x80000000), %o2
        sllx    %o2, 32, %o2
        wr      %o2, 0, %tick_cmpr
 
-       BRANCH_IF_SUN4V(o2, 1f)
        BRANCH_IF_ANY_CHEETAH(o2, o3, 1f)
 
        ba,pt   %xcc, 2f
index 95059c2ec414804e50d63681b60ddd2ccfaa4be4..9f22e4ff6015771e8c39106f7df2baff3c315633 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/list.h>
 #include <linux/slab.h>
 #include <linux/mm.h>
+#include <linux/miscdevice.h>
 
 #include <asm/hypervisor.h>
 #include <asm/mdesc.h>
@@ -836,6 +837,43 @@ void __devinit mdesc_fill_in_cpu_data(cpumask_t mask)
        mdesc_release(hp);
 }
 
+static ssize_t mdesc_read(struct file *file, char __user *buf,
+                         size_t len, loff_t *offp)
+{
+       struct mdesc_handle *hp = mdesc_grab();
+       int err;
+
+       if (!hp)
+               return -ENODEV;
+
+       err = hp->handle_size;
+       if (len < hp->handle_size)
+               err = -EMSGSIZE;
+       else if (copy_to_user(buf, &hp->mdesc, hp->handle_size))
+               err = -EFAULT;
+       mdesc_release(hp);
+
+       return err;
+}
+
+static const struct file_operations mdesc_fops = {
+       .read   = mdesc_read,
+       .owner  = THIS_MODULE,
+};
+
+static struct miscdevice mdesc_misc = {
+       .minor  = MISC_DYNAMIC_MINOR,
+       .name   = "mdesc",
+       .fops   = &mdesc_fops,
+};
+
+static int __init mdesc_misc_init(void)
+{
+       return misc_register(&mdesc_misc);
+}
+
+__initcall(mdesc_misc_init);
+
 void __init sun4v_mdesc_init(void)
 {
        struct mdesc_handle *hp;
index 9448595f9063f346202575ee5a0a2d72caef797b..9533a25ce5d2191f9ceb251695c0141acc78071c 100644 (file)
@@ -95,14 +95,13 @@ spitfire_startup:
        membar          #Sync
 
 startup_continue:
+       mov             %o0, %l0
+       BRANCH_IF_SUN4V(g1, niagara_lock_tlb)
+
        sethi           %hi(0x80000000), %g2
        sllx            %g2, 32, %g2
        wr              %g2, 0, %tick_cmpr
 
-       mov             %o0, %l0
-
-       BRANCH_IF_SUN4V(g1, niagara_lock_tlb)
-
        /* Call OBP by hand to lock KERNBASE into i/d tlbs.
         * We lock 2 consequetive entries if we are 'bigkernel'.
         */
index f95fbfa3eeb86b8a9389eb273514226c7b1a5bd5..f095e13910bc9ebf69646cec413297c89f08ff08 100644 (file)
@@ -13,6 +13,8 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \
         U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \
         NGmemcpy.o NGcopy_from_user.o NGcopy_to_user.o NGpatch.o \
         NGpage.o NGbzero.o \
+        NG2memcpy.o NG2copy_from_user.o NG2copy_to_user.o NG2patch.o \
+        NG2page.o \
         GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o GENpatch.o \
         GENpage.o GENbzero.o \
         copy_in_user.o user_fixup.o memmove.o \
diff --git a/arch/sparc64/lib/NG2copy_from_user.S b/arch/sparc64/lib/NG2copy_from_user.S
new file mode 100644 (file)
index 0000000..c77ef5f
--- /dev/null
@@ -0,0 +1,40 @@
+/* NG2copy_from_user.S: Niagara-2 optimized copy from userspace.
+ *
+ * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
+ */
+
+#define EX_LD(x)               \
+98:    x;                      \
+       .section .fixup;        \
+       .align 4;               \
+99:    wr      %g0, ASI_AIUS, %asi;\
+       retl;                   \
+        mov    1, %o0;         \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, 99b;         \
+       .text;                  \
+       .align 4;
+
+#ifndef ASI_AIUS
+#define ASI_AIUS       0x11
+#endif
+
+#ifndef ASI_BLK_AIUS_4V
+#define ASI_BLK_AIUS_4V        0x17
+#endif
+
+#define FUNC_NAME              NG2copy_from_user
+#define LOAD(type,addr,dest)   type##a [addr] %asi, dest
+#define LOAD_BLK(addr,dest)    ldda [addr] ASI_BLK_AIUS_4V, dest
+#define EX_RETVAL(x)           0
+
+#ifdef __KERNEL__
+#define PREAMBLE                                       \
+       rd              %asi, %g1;                      \
+       cmp             %g1, ASI_AIUS;                  \
+       bne,pn          %icc, memcpy_user_stub;         \
+        nop
+#endif
+
+#include "NG2memcpy.S"
diff --git a/arch/sparc64/lib/NG2copy_to_user.S b/arch/sparc64/lib/NG2copy_to_user.S
new file mode 100644 (file)
index 0000000..4bd4093
--- /dev/null
@@ -0,0 +1,49 @@
+/* NG2copy_to_user.S: Niagara-2 optimized copy to userspace.
+ *
+ * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
+ */
+
+#define EX_ST(x)               \
+98:    x;                      \
+       .section .fixup;        \
+       .align 4;               \
+99:    wr      %g0, ASI_AIUS, %asi;\
+       retl;                   \
+        mov    1, %o0;         \
+       .section __ex_table,"a";\
+       .align 4;               \
+       .word 98b, 99b;         \
+       .text;                  \
+       .align 4;
+
+#ifndef ASI_AIUS
+#define ASI_AIUS       0x11
+#endif
+
+#ifndef ASI_BLK_AIUS_4V
+#define ASI_BLK_AIUS_4V        0x17
+#endif
+
+#ifndef ASI_BLK_INIT_QUAD_LDD_AIUS
+#define ASI_BLK_INIT_QUAD_LDD_AIUS 0x23
+#endif
+
+#define FUNC_NAME              NG2copy_to_user
+#define STORE(type,src,addr)   type##a src, [addr] ASI_AIUS
+#define STORE_ASI              ASI_BLK_INIT_QUAD_LDD_AIUS
+#define STORE_BLK(src,addr)    stda src, [addr] ASI_BLK_AIUS_4V
+#define EX_RETVAL(x)           0
+
+#ifdef __KERNEL__
+       /* Writing to %asi is _expensive_ so we hardcode it.
+        * Reading %asi to check for KERNEL_DS is comparatively
+        * cheap.
+        */
+#define PREAMBLE                                       \
+       rd              %asi, %g1;                      \
+       cmp             %g1, ASI_AIUS;                  \
+       bne,pn          %icc, memcpy_user_stub;         \
+        nop
+#endif
+
+#include "NG2memcpy.S"
diff --git a/arch/sparc64/lib/NG2memcpy.S b/arch/sparc64/lib/NG2memcpy.S
new file mode 100644 (file)
index 0000000..0aed756
--- /dev/null
@@ -0,0 +1,520 @@
+/* NG2memcpy.S: Niagara-2 optimized memcpy.
+ *
+ * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
+ */
+
+#ifdef __KERNEL__
+#include <asm/visasm.h>
+#include <asm/asi.h>
+#define GLOBAL_SPARE   %g7
+#else
+#define ASI_PNF 0x82
+#define ASI_BLK_P 0xf0
+#define ASI_BLK_INIT_QUAD_LDD_P 0xe2
+#define FPRS_FEF  0x04
+#ifdef MEMCPY_DEBUG
+#define VISEntryHalf rd %fprs, %o5; wr %g0, FPRS_FEF, %fprs; \
+                    clr %g1; clr %g2; clr %g3; subcc %g0, %g0, %g0;
+#define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs
+#else
+#define VISEntryHalf rd %fprs, %o5; wr %g0, FPRS_FEF, %fprs
+#define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs
+#endif
+#define GLOBAL_SPARE   %g5
+#endif
+
+#ifndef STORE_ASI
+#ifndef SIMULATE_NIAGARA_ON_NON_NIAGARA
+#define STORE_ASI      ASI_BLK_INIT_QUAD_LDD_P
+#else
+#define STORE_ASI      0x80            /* ASI_P */
+#endif
+#endif
+
+#ifndef EX_LD
+#define EX_LD(x)       x
+#endif
+
+#ifndef EX_ST
+#define EX_ST(x)       x
+#endif
+
+#ifndef EX_RETVAL
+#define EX_RETVAL(x)   x
+#endif
+
+#ifndef LOAD
+#define LOAD(type,addr,dest)   type [addr], dest
+#endif
+
+#ifndef LOAD_BLK
+#define LOAD_BLK(addr,dest)    ldda [addr] ASI_BLK_P, dest
+#endif
+
+#ifndef STORE
+#ifndef MEMCPY_DEBUG
+#define STORE(type,src,addr)   type src, [addr]
+#else
+#define STORE(type,src,addr)   type##a src, [addr] 0x80
+#endif
+#endif
+
+#ifndef STORE_BLK
+#define STORE_BLK(src,addr)    stda src, [addr] ASI_BLK_P
+#endif
+
+#ifndef STORE_INIT
+#define STORE_INIT(src,addr)   stxa src, [addr] STORE_ASI
+#endif
+
+#ifndef FUNC_NAME
+#define FUNC_NAME      NG2memcpy
+#endif
+
+#ifndef PREAMBLE
+#define PREAMBLE
+#endif
+
+#ifndef XCC
+#define XCC xcc
+#endif
+
+#define FREG_FROB(x0, x1, x2, x3, x4, x5, x6, x7, x8) \
+       faligndata      %x0, %x1, %f0; \
+       faligndata      %x1, %x2, %f2; \
+       faligndata      %x2, %x3, %f4; \
+       faligndata      %x3, %x4, %f6; \
+       faligndata      %x4, %x5, %f8; \
+       faligndata      %x5, %x6, %f10; \
+       faligndata      %x6, %x7, %f12; \
+       faligndata      %x7, %x8, %f14;
+
+#define FREG_MOVE_1(x0) \
+       fmovd           %x0, %f0;
+#define FREG_MOVE_2(x0, x1) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2;
+#define FREG_MOVE_3(x0, x1, x2) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4;
+#define FREG_MOVE_4(x0, x1, x2, x3) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4; \
+       fmovd           %x3, %f6;
+#define FREG_MOVE_5(x0, x1, x2, x3, x4) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4; \
+       fmovd           %x3, %f6; \
+       fmovd           %x4, %f8;
+#define FREG_MOVE_6(x0, x1, x2, x3, x4, x5) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4; \
+       fmovd           %x3, %f6; \
+       fmovd           %x4, %f8; \
+       fmovd           %x5, %f10;
+#define FREG_MOVE_7(x0, x1, x2, x3, x4, x5, x6) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4; \
+       fmovd           %x3, %f6; \
+       fmovd           %x4, %f8; \
+       fmovd           %x5, %f10; \
+       fmovd           %x6, %f12;
+#define FREG_MOVE_8(x0, x1, x2, x3, x4, x5, x6, x7) \
+       fmovd           %x0, %f0; \
+       fmovd           %x1, %f2; \
+       fmovd           %x2, %f4; \
+       fmovd           %x3, %f6; \
+       fmovd           %x4, %f8; \
+       fmovd           %x5, %f10; \
+       fmovd           %x6, %f12; \
+       fmovd           %x7, %f14;
+#define FREG_LOAD_1(base, x0) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0))
+#define FREG_LOAD_2(base, x0, x1) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1));
+#define FREG_LOAD_3(base, x0, x1, x2) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD(LOAD(ldd, base + 0x10, %x2));
+#define FREG_LOAD_4(base, x0, x1, x2, x3) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD(LOAD(ldd, base + 0x18, %x3));
+#define FREG_LOAD_5(base, x0, x1, x2, x3, x4) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD(LOAD(ldd, base + 0x20, %x4));
+#define FREG_LOAD_6(base, x0, x1, x2, x3, x4, x5) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD(LOAD(ldd, base + 0x20, %x4)); \
+       EX_LD(LOAD(ldd, base + 0x28, %x5));
+#define FREG_LOAD_7(base, x0, x1, x2, x3, x4, x5, x6) \
+       EX_LD(LOAD(ldd, base + 0x00, %x0)); \
+       EX_LD(LOAD(ldd, base + 0x08, %x1)); \
+       EX_LD(LOAD(ldd, base + 0x10, %x2)); \
+       EX_LD(LOAD(ldd, base + 0x18, %x3)); \
+       EX_LD(LOAD(ldd, base + 0x20, %x4)); \
+       EX_LD(LOAD(ldd, base + 0x28, %x5)); \
+       EX_LD(LOAD(ldd, base + 0x30, %x6));
+
+       .register       %g2,#scratch
+       .register       %g3,#scratch
+
+       .text
+       .align          64
+
+       .globl  FUNC_NAME
+       .type   FUNC_NAME,#function
+FUNC_NAME:     /* %o0=dst, %o1=src, %o2=len */
+       srlx            %o2, 31, %g2
+       cmp             %g2, 0
+       tne             %xcc, 5
+       PREAMBLE
+       mov             %o0, GLOBAL_SPARE
+       cmp             %o2, 0
+       be,pn           %XCC, 85f
+        or             %o0, %o1, %o3
+       cmp             %o2, 16
+       blu,a,pn        %XCC, 80f
+        or             %o3, %o2, %o3
+
+       /* 2 blocks (128 bytes) is the minimum we can do the block
+        * copy with.  We need to ensure that we'll iterate at least
+        * once in the block copy loop.  At worst we'll need to align
+        * the destination to a 64-byte boundary which can chew up
+        * to (64 - 1) bytes from the length before we perform the
+        * block copy loop.
+        *
+        * However, the cut-off point, performance wise, is around
+        * 4 64-byte blocks.
+        */
+       cmp             %o2, (4 * 64)
+       blu,pt          %XCC, 75f
+        andcc          %o3, 0x7, %g0
+
+       /* %o0: dst
+        * %o1: src
+        * %o2: len  (known to be >= 128)
+        *
+        * The block copy loops can use %o4, %g2, %g3 as
+        * temporaries while copying the data.  %o5 must
+        * be preserved between VISEntryHalf and VISExitHalf
+        */
+
+       LOAD(prefetch, %o1 + 0x000, #one_read)
+       LOAD(prefetch, %o1 + 0x040, #one_read)
+       LOAD(prefetch, %o1 + 0x080, #one_read)
+
+       /* Align destination on 64-byte boundary.  */
+       andcc           %o0, (64 - 1), %o4
+       be,pt           %XCC, 2f
+        sub            %o4, 64, %o4
+       sub             %g0, %o4, %o4   ! bytes to align dst
+       sub             %o2, %o4, %o2
+1:     subcc           %o4, 1, %o4
+       EX_LD(LOAD(ldub, %o1, %g1))
+       EX_ST(STORE(stb, %g1, %o0))
+       add             %o1, 1, %o1
+       bne,pt          %XCC, 1b
+       add             %o0, 1, %o0
+
+2:
+       /* Clobbers o5/g1/g2/g3/g7/icc/xcc.  We must preserve
+        * o5 from here until we hit VISExitHalf.
+        */
+       VISEntryHalf
+
+       alignaddr       %o1, %g0, %g0
+
+       add             %o1, (64 - 1), %o4
+       andn            %o4, (64 - 1), %o4
+       andn            %o2, (64 - 1), %g1
+       sub             %o2, %g1, %o2
+
+       and             %o1, (64 - 1), %g2
+       add             %o1, %g1, %o1
+       sub             %o0, %o4, %g3
+       brz,pt          %g2, 190f
+        cmp            %g2, 32
+       blu,a           5f
+        cmp            %g2, 16
+       cmp             %g2, 48
+       blu,a           4f
+        cmp            %g2, 40
+       cmp             %g2, 56
+       blu             170f
+        nop
+       ba,a,pt         %xcc, 180f
+
+4:     /* 32 <= low bits < 48 */
+       blu             150f
+        nop
+       ba,a,pt         %xcc, 160f
+5:     /* 0 < low bits < 32 */
+       blu,a           6f
+        cmp            %g2, 8
+       cmp             %g2, 24
+       blu             130f
+        nop
+       ba,a,pt         %xcc, 140f
+6:     /* 0 < low bits < 16 */
+       bgeu            120f
+        nop
+       /* fall through for 0 < low bits < 8 */
+110:   sub             %o4, 64, %g2
+       EX_LD(LOAD_BLK(%g2, %f0))
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f14, f16)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_8(f16, f18, f20, f22, f24, f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+120:   sub             %o4, 56, %g2
+       FREG_LOAD_7(%g2, f0, f2, f4, f6, f8, f10, f12)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f6, f8, f10, f12, f16, f18)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_7(f18, f20, f22, f24, f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+130:   sub             %o4, 48, %g2
+       FREG_LOAD_6(%g2, f0, f2, f4, f6, f8, f10)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f6, f8, f10, f16, f18, f20)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_6(f20, f22, f24, f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+140:   sub             %o4, 40, %g2
+       FREG_LOAD_5(%g2, f0, f2, f4, f6, f8)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f6, f8, f16, f18, f20, f22)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_5(f22, f24, f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+150:   sub             %o4, 32, %g2
+       FREG_LOAD_4(%g2, f0, f2, f4, f6)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f6, f16, f18, f20, f22, f24)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_4(f24, f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+160:   sub             %o4, 24, %g2
+       FREG_LOAD_3(%g2, f0, f2, f4)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f4, f16, f18, f20, f22, f24, f26)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_3(f26, f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+170:   sub             %o4, 16, %g2
+       FREG_LOAD_2(%g2, f0, f2)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f2, f16, f18, f20, f22, f24, f26, f28)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_2(f28, f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+180:   sub             %o4, 8, %g2
+       FREG_LOAD_1(%g2, f0)
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       EX_LD(LOAD_BLK(%o4, %f16))
+       FREG_FROB(f0, f16, f18, f20, f22, f24, f26, f28, f30)
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       FREG_MOVE_1(f30)
+       subcc           %g1, 64, %g1
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+       ba,pt           %xcc, 195f
+        nop
+
+190:
+1:     EX_ST(STORE_INIT(%g0, %o4 + %g3))
+       subcc           %g1, 64, %g1
+       EX_LD(LOAD_BLK(%o4, %f0))
+       EX_ST(STORE_BLK(%f0, %o4 + %g3))
+       add             %o4, 64, %o4
+       bne,pt          %xcc, 1b
+        LOAD(prefetch, %o4 + 64, #one_read)
+
+195:
+       add             %o4, %g3, %o0
+       membar          #Sync
+
+       VISExitHalf
+
+       /* %o2 contains any final bytes still needed to be copied
+        * over. If anything is left, we copy it one byte at a time.
+        */
+       brz,pt          %o2, 85f
+        sub            %o0, %o1, %o3
+       ba,a,pt         %XCC, 90f
+
+       .align          64
+75: /* 16 < len <= 64 */
+       bne,pn          %XCC, 75f
+        sub            %o0, %o1, %o3
+
+72:
+       andn            %o2, 0xf, %o4
+       and             %o2, 0xf, %o2
+1:     subcc           %o4, 0x10, %o4
+       EX_LD(LOAD(ldx, %o1, %o5))
+       add             %o1, 0x08, %o1
+       EX_LD(LOAD(ldx, %o1, %g1))
+       sub             %o1, 0x08, %o1
+       EX_ST(STORE(stx, %o5, %o1 + %o3))
+       add             %o1, 0x8, %o1
+       EX_ST(STORE(stx, %g1, %o1 + %o3))
+       bgu,pt          %XCC, 1b
+        add            %o1, 0x8, %o1
+73:    andcc           %o2, 0x8, %g0
+       be,pt           %XCC, 1f
+        nop
+       sub             %o2, 0x8, %o2
+       EX_LD(LOAD(ldx, %o1, %o5))
+       EX_ST(STORE(stx, %o5, %o1 + %o3))
+       add             %o1, 0x8, %o1
+1:     andcc           %o2, 0x4, %g0
+       be,pt           %XCC, 1f
+        nop
+       sub             %o2, 0x4, %o2
+       EX_LD(LOAD(lduw, %o1, %o5))
+       EX_ST(STORE(stw, %o5, %o1 + %o3))
+       add             %o1, 0x4, %o1
+1:     cmp             %o2, 0
+       be,pt           %XCC, 85f
+        nop
+       ba,pt           %xcc, 90f
+        nop
+
+75:
+       andcc           %o0, 0x7, %g1
+       sub             %g1, 0x8, %g1
+       be,pn           %icc, 2f
+        sub            %g0, %g1, %g1
+       sub             %o2, %g1, %o2
+
+1:     subcc           %g1, 1, %g1
+       EX_LD(LOAD(ldub, %o1, %o5))
+       EX_ST(STORE(stb, %o5, %o1 + %o3))
+       bgu,pt          %icc, 1b
+        add            %o1, 1, %o1
+
+2:     add             %o1, %o3, %o0
+       andcc           %o1, 0x7, %g1
+       bne,pt          %icc, 8f
+        sll            %g1, 3, %g1
+
+       cmp             %o2, 16
+       bgeu,pt         %icc, 72b
+        nop
+       ba,a,pt         %xcc, 73b
+
+8:     mov             64, %o3
+       andn            %o1, 0x7, %o1
+       EX_LD(LOAD(ldx, %o1, %g2))
+       sub             %o3, %g1, %o3
+       andn            %o2, 0x7, %o4
+       sllx            %g2, %g1, %g2
+1:     add             %o1, 0x8, %o1
+       EX_LD(LOAD(ldx, %o1, %g3))
+       subcc           %o4, 0x8, %o4
+       srlx            %g3, %o3, %o5
+       or              %o5, %g2, %o5
+       EX_ST(STORE(stx, %o5, %o0))
+       add             %o0, 0x8, %o0
+       bgu,pt          %icc, 1b
+        sllx           %g3, %g1, %g2
+
+       srl             %g1, 3, %g1
+       andcc           %o2, 0x7, %o2
+       be,pn           %icc, 85f
+        add            %o1, %g1, %o1
+       ba,pt           %xcc, 90f
+        sub            %o0, %o1, %o3
+
+       .align          64
+80: /* 0 < len <= 16 */
+       andcc           %o3, 0x3, %g0
+       bne,pn          %XCC, 90f
+        sub            %o0, %o1, %o3
+
+1:
+       subcc           %o2, 4, %o2
+       EX_LD(LOAD(lduw, %o1, %g1))
+       EX_ST(STORE(stw, %g1, %o1 + %o3))
+       bgu,pt          %XCC, 1b
+        add            %o1, 4, %o1
+
+85:    retl
+        mov            EX_RETVAL(GLOBAL_SPARE), %o0
+
+       .align          32
+90:
+       subcc           %o2, 1, %o2
+       EX_LD(LOAD(ldub, %o1, %g1))
+       EX_ST(STORE(stb, %g1, %o1 + %o3))
+       bgu,pt          %XCC, 90b
+        add            %o1, 1, %o1
+       retl
+        mov            EX_RETVAL(GLOBAL_SPARE), %o0
+
+       .size           FUNC_NAME, .-FUNC_NAME
diff --git a/arch/sparc64/lib/NG2page.S b/arch/sparc64/lib/NG2page.S
new file mode 100644 (file)
index 0000000..73b6b7c
--- /dev/null
@@ -0,0 +1,61 @@
+/* NG2page.S: Niagara-2 optimized clear and copy page.
+ *
+ * Copyright (C) 2007 (davem@davemloft.net)
+ */
+
+#include <asm/asi.h>
+#include <asm/page.h>
+#include <asm/visasm.h>
+
+       .text
+       .align  32
+
+       /* This is heavily simplified from the sun4u variants
+        * because Niagara-2 does not have any D-cache aliasing issues.
+        */
+NG2copy_user_page:     /* %o0=dest, %o1=src, %o2=vaddr */
+       prefetch        [%o1 + 0x00], #one_read
+       prefetch        [%o1 + 0x40], #one_read
+       VISEntryHalf
+       set             PAGE_SIZE, %g7
+       sub             %o0, %o1, %g3
+1:     stxa            %g0, [%o1 + %g3] ASI_BLK_INIT_QUAD_LDD_P
+       subcc           %g7, 64, %g7
+       ldda            [%o1] ASI_BLK_P, %f0
+       stda            %f0, [%o1 + %g3] ASI_BLK_P
+       add             %o1, 64, %o1
+       bne,pt          %xcc, 1b
+        prefetch       [%o1 + 0x40], #one_read
+       membar          #Sync
+       VISExitHalf
+       retl
+        nop
+
+#define BRANCH_ALWAYS  0x10680000
+#define NOP            0x01000000
+#define NG_DO_PATCH(OLD, NEW)  \
+       sethi   %hi(NEW), %g1; \
+       or      %g1, %lo(NEW), %g1; \
+       sethi   %hi(OLD), %g2; \
+       or      %g2, %lo(OLD), %g2; \
+       sub     %g1, %g2, %g1; \
+       sethi   %hi(BRANCH_ALWAYS), %g3; \
+       sll     %g1, 11, %g1; \
+       srl     %g1, 11 + 2, %g1; \
+       or      %g3, %lo(BRANCH_ALWAYS), %g3; \
+       or      %g3, %g1, %g3; \
+       stw     %g3, [%g2]; \
+       sethi   %hi(NOP), %g3; \
+       or      %g3, %lo(NOP), %g3; \
+       stw     %g3, [%g2 + 0x4]; \
+       flush   %g2;
+
+       .globl  niagara2_patch_pageops
+       .type   niagara2_patch_pageops,#function
+niagara2_patch_pageops:
+       NG_DO_PATCH(copy_user_page, NG2copy_user_page)
+       NG_DO_PATCH(_clear_page, NGclear_page)
+       NG_DO_PATCH(clear_user_page, NGclear_user_page)
+       retl
+        nop
+       .size   niagara2_patch_pageops,.-niagara2_patch_pageops
diff --git a/arch/sparc64/lib/NG2patch.S b/arch/sparc64/lib/NG2patch.S
new file mode 100644 (file)
index 0000000..28c36f0
--- /dev/null
@@ -0,0 +1,33 @@
+/* NG2patch.S: Patch Ultra-I routines with Niagara-2 variant.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#define BRANCH_ALWAYS  0x10680000
+#define NOP            0x01000000
+#define NG_DO_PATCH(OLD, NEW)  \
+       sethi   %hi(NEW), %g1; \
+       or      %g1, %lo(NEW), %g1; \
+       sethi   %hi(OLD), %g2; \
+       or      %g2, %lo(OLD), %g2; \
+       sub     %g1, %g2, %g1; \
+       sethi   %hi(BRANCH_ALWAYS), %g3; \
+       sll     %g1, 11, %g1; \
+       srl     %g1, 11 + 2, %g1; \
+       or      %g3, %lo(BRANCH_ALWAYS), %g3; \
+       or      %g3, %g1, %g3; \
+       stw     %g3, [%g2]; \
+       sethi   %hi(NOP), %g3; \
+       or      %g3, %lo(NOP), %g3; \
+       stw     %g3, [%g2 + 0x4]; \
+       flush   %g2;
+
+       .globl  niagara2_patch_copyops
+       .type   niagara2_patch_copyops,#function
+niagara2_patch_copyops:
+       NG_DO_PATCH(memcpy, NG2memcpy)
+       NG_DO_PATCH(___copy_from_user, NG2copy_from_user)
+       NG_DO_PATCH(___copy_to_user, NG2copy_to_user)
+       retl
+        nop
+       .size   niagara2_patch_copyops,.-niagara2_patch_copyops
index 8ce3a0c9c537ed4ac862afda0cca7f41ed4c0b98..428920de05baeb4f87b80a93d3a09480ef19ffec 100644 (file)
@@ -45,6 +45,7 @@ NGcopy_user_page:     /* %o0=dest, %o1=src, %o2=vaddr */
        retl
         nop
 
+       .globl          NGclear_page, NGclear_user_page
 NGclear_page:          /* %o0=dest */
 NGclear_user_page:     /* %o0=dest, %o1=vaddr */
        mov             8, %g1
index aff661fe2ee1de6cee57f58c9f9d72fb1323dde5..0eabe73c964dc04732baa35cfaec864e34b41599 100644 (file)
@@ -612,6 +612,8 @@ static int ubd_open_dev(struct ubd *ubd_dev)
        ubd_dev->fd = fd;
 
        if(ubd_dev->cow.file != NULL){
+               blk_queue_max_sectors(ubd_dev->queue, 8 * sizeof(long));
+
                err = -ENOMEM;
                ubd_dev->cow.bitmap = (void *) vmalloc(ubd_dev->cow.bitmap_len);
                if(ubd_dev->cow.bitmap == NULL){
@@ -712,8 +714,6 @@ static int ubd_add(int n, char **error_out)
        ubd_dev->queue->queuedata = ubd_dev;
 
        blk_queue_max_hw_segments(ubd_dev->queue, MAX_SG);
-       if(ubd_dev->cow.file != NULL)
-               blk_queue_max_sectors(ubd_dev->queue, 8 * sizeof(long));
        err = ubd_disk_register(MAJOR_NR, ubd_dev->size, n, &ubd_gendisk[n]);
        if(err){
                *error_out = "Failed to register device";
index 128561d3e876f13b4d84b70dbdc0d5a8b6039d15..b024e4a86895cea767fa5090074f75b60e0d7078 100644 (file)
@@ -57,8 +57,8 @@ cflags-y += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,)
 cflags-y += -maccumulate-outgoing-args
 
 # do binutils support CFI?
-cflags-y += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
-AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
+cflags-y += $(call as-instr,.cfi_startproc\n.cfi_rel_offset rsp${comma}0\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
+AFLAGS += $(call as-instr,.cfi_startproc\n.cfi_rel_offset rsp${comma}0\n.cfi_endproc,-DCONFIG_AS_CFI=1,)
 
 # is .cfi_signal_frame supported too?
 cflags-y += $(call as-instr,.cfi_startproc\n.cfi_signal_frame\n.cfi_endproc,-DCONFIG_AS_CFI_SIGNAL_FRAME=1,)
index e89abcdbdde8172e25d6dff0ddb8323471495c66..b6167fe3330e22aec72abc9f534de07d19fcb614 100644 (file)
@@ -345,8 +345,7 @@ NEXT_PAGE(level2_kernel_pgt)
        /* 40MB kernel mapping. The kernel code cannot be bigger than that.
           When you change this change KERNEL_TEXT_SIZE in page.h too. */
        /* (2^48-(2*1024*1024*1024)-((2^39)*511)-((2^30)*510)) = 0 */
-       PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL,
-               KERNEL_TEXT_SIZE/PMD_SIZE)
+       PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL, KERNEL_TEXT_SIZE/PMD_SIZE)
        /* Module mapping starts here */
        .fill   (PTRS_PER_PMD - (KERNEL_TEXT_SIZE/PMD_SIZE)),8,0
 
index cb8ee9d02f8682d4e52374aae1847a4daf03292a..0ec6d2ddb931f48a2cbeef6daf09503907328638 100644 (file)
@@ -85,7 +85,7 @@ int __init check_nmi_watchdog (void)
        int *counts;
        int cpu;
 
-       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
+       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DISABLED)) 
                return 0;
 
        if (!atomic_read(&nmi_active))
@@ -442,7 +442,7 @@ int proc_nmi_enabled(struct ctl_table *table, int write, struct file *file,
        if (!!old_state == !!nmi_watchdog_enabled)
                return 0;
 
-       if (atomic_read(&nmi_active) < 0) {
+       if (atomic_read(&nmi_active) < 0 || nmi_watchdog == NMI_DISABLED) {
                printk( KERN_WARNING "NMI watchdog is permanently disabled\n");
                return -EIO;
        }
index 05d745ede561320a6c50d0a47c5a3cbb26cdf1f1..29711445c8187464c6c00b14938451c23732df3e 100644 (file)
@@ -82,6 +82,10 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
        if (dma_mask == 0)
                dma_mask = DMA_32BIT_MASK;
 
+       /* Device not DMA able */
+       if (dev->dma_mask == NULL)
+               return NULL;
+
        /* Don't invoke OOM killer */
        gfp |= __GFP_NORETRY;
 
index a8634a0655fca429b0a52f3c43b8d57a8ccc3095..d9b8af763e1ec59e64671655fda51e0601b55da9 100644 (file)
@@ -63,6 +63,7 @@
 ACPI_MODULE_NAME("processor_idle");
 #define ACPI_PROCESSOR_FILE_POWER      "power"
 #define US_TO_PM_TIMER_TICKS(t)                ((t * (PM_TIMER_FREQUENCY/1000)) / 1000)
+#define PM_TIMER_TICK_NS               (1000000000ULL/PM_TIMER_FREQUENCY)
 #define C2_OVERHEAD                    4       /* 1us (3.579 ticks per us) */
 #define C3_OVERHEAD                    4       /* 1us (3.579 ticks per us) */
 static void (*pm_idle_save) (void) __read_mostly;
@@ -462,6 +463,9 @@ static void acpi_processor_idle(void)
                 * TBD: Can't get time duration while in C1, as resumes
                 *      go to an ISR rather than here.  Need to instrument
                 *      base interrupt handler.
+                *
+                * Note: the TSC better not stop in C1, sched_clock() will
+                *       skew otherwise.
                 */
                sleep_ticks = 0xFFFFFFFF;
                break;
@@ -469,6 +473,8 @@ static void acpi_processor_idle(void)
        case ACPI_STATE_C2:
                /* Get start time (ticks) */
                t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
+               /* Tell the scheduler that we are going deep-idle: */
+               sched_clock_idle_sleep_event();
                /* Invoke C2 */
                acpi_state_timer_broadcast(pr, cx, 1);
                acpi_cstate_enter(cx);
@@ -479,17 +485,22 @@ static void acpi_processor_idle(void)
                /* TSC halts in C2, so notify users */
                mark_tsc_unstable("possible TSC halt in C2");
 #endif
+               /* Compute time (ticks) that we were actually asleep */
+               sleep_ticks = ticks_elapsed(t1, t2);
+
+               /* Tell the scheduler how much we idled: */
+               sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
+
                /* Re-enable interrupts */
                local_irq_enable();
+               /* Do not account our idle-switching overhead: */
+               sleep_ticks -= cx->latency_ticks + C2_OVERHEAD;
+
                current_thread_info()->status |= TS_POLLING;
-               /* Compute time (ticks) that we were actually asleep */
-               sleep_ticks =
-                   ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
                acpi_state_timer_broadcast(pr, cx, 0);
                break;
 
        case ACPI_STATE_C3:
-
                /*
                 * disable bus master
                 * bm_check implies we need ARB_DIS
@@ -518,6 +529,8 @@ static void acpi_processor_idle(void)
                t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
                /* Invoke C3 */
                acpi_state_timer_broadcast(pr, cx, 1);
+               /* Tell the scheduler that we are going deep-idle: */
+               sched_clock_idle_sleep_event();
                acpi_cstate_enter(cx);
                /* Get end time (ticks) */
                t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
@@ -531,12 +544,17 @@ static void acpi_processor_idle(void)
                /* TSC halts in C3, so notify users */
                mark_tsc_unstable("TSC halts in C3");
 #endif
+               /* Compute time (ticks) that we were actually asleep */
+               sleep_ticks = ticks_elapsed(t1, t2);
+               /* Tell the scheduler how much we idled: */
+               sched_clock_idle_wakeup_event(sleep_ticks*PM_TIMER_TICK_NS);
+
                /* Re-enable interrupts */
                local_irq_enable();
+               /* Do not account our idle-switching overhead: */
+               sleep_ticks -= cx->latency_ticks + C3_OVERHEAD;
+
                current_thread_info()->status |= TS_POLLING;
-               /* Compute time (ticks) that we were actually asleep */
-               sleep_ticks =
-                   ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
                acpi_state_timer_broadcast(pr, cx, 0);
                break;
 
index a78832ea81fa0f5cc9460cca362f498307820cb1..071d274afaabcf6a971831019c44e50900d306c9 100644 (file)
@@ -436,7 +436,7 @@ static const struct piix_map_db ich8_map_db = {
                /* PM   PS   SM   SS       MAP */
                {  P0,  P2,  P1,  P3 }, /* 00b (hardwired when in AHCI) */
                {  RV,  RV,  RV,  RV },
-               {  IDE,  IDE,  NA,  NA }, /* 10b (IDE mode) */
+               {  P0,  P2, IDE, IDE }, /* 10b (IDE mode) */
                {  RV,  RV,  RV,  RV },
        },
 };
@@ -900,6 +900,13 @@ static int piix_broken_suspend(void)
                                DMI_MATCH(DMI_PRODUCT_NAME, "TECRA M5"),
                        },
                },
+               {
+                       .ident = "TECRA M7",
+                       .matches = {
+                               DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+                               DMI_MATCH(DMI_PRODUCT_NAME, "TECRA M7"),
+                       },
+               },
                {
                        .ident = "Satellite U205",
                        .matches = {
index 60e78bef469fed2f49423deea956a16b60a0448b..2ad4dda6d4a780e13e1814296ead50ed1dd0774f 100644 (file)
@@ -1723,7 +1723,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
                tf.protocol = ATA_PROT_NODATA;
                tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
                err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0);
-               if (err_mask) {
+               if (err_mask && id[2] != 0x738c) {
                        rc = -EIO;
                        reason = "SPINUP failed";
                        goto err_out;
@@ -3700,11 +3700,16 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int readid_flags)
                goto fail;
 
        /* verify n_sectors hasn't changed */
-       if (dev->class == ATA_DEV_ATA && dev->n_sectors != n_sectors) {
+       if (dev->class == ATA_DEV_ATA && n_sectors &&
+           dev->n_sectors != n_sectors) {
                ata_dev_printk(dev, KERN_INFO, "n_sectors mismatch "
                               "%llu != %llu\n",
                               (unsigned long long)n_sectors,
                               (unsigned long long)dev->n_sectors);
+
+               /* restore original n_sectors */
+               dev->n_sectors = n_sectors;
+
                rc = -ENODEV;
                goto fail;
        }
index ce589d96ca424f3083564dc9f193eef0717501f2..b5352ebecef93a9cf047b5f6cdb3cd4dc1a10c50 100644 (file)
@@ -2,6 +2,7 @@
  *    pata_artop.c - ARTOP ATA controller driver
  *
  *     (C) 2006 Red Hat <alan@redhat.com>
+ *     (C) 2007 Bartlomiej Zolnierkiewicz
  *
  *    Based in part on drivers/ide/pci/aec62xx.c
  *     Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org>
@@ -28,7 +29,7 @@
 #include <linux/ata.h>
 
 #define DRV_NAME       "pata_artop"
-#define DRV_VERSION    "0.4.3"
+#define DRV_VERSION    "0.4.4"
 
 /*
  *     The ARTOP has 33 Mhz and "over clocked" timing tables. Until we
@@ -430,7 +431,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
                .udma_mask      = ATA_UDMA4,
                .port_ops       = &artop6260_ops,
        };
-       static const struct ata_port_info info_626x_fast = {
+       static const struct ata_port_info info_628x = {
                .sht            = &artop_sht,
                .flags          = ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
@@ -438,6 +439,14 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
                .udma_mask      = ATA_UDMA5,
                .port_ops       = &artop6260_ops,
        };
+       static const struct ata_port_info info_628x_fast = {
+               .sht            = &artop_sht,
+               .flags          = ATA_FLAG_SLAVE_POSS,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = ATA_UDMA6,
+               .port_ops       = &artop6260_ops,
+       };
        const struct ata_port_info *ppi[] = { NULL, NULL };
 
        if (!printed_version++)
@@ -455,13 +464,13 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
        }
        else if (id->driver_data == 1)  /* 6260 */
                ppi[0] = &info_626x;
-       else if (id->driver_data == 2)  { /* 6260 or 6260 + fast */
+       else if (id->driver_data == 2)  { /* 6280 or 6280 + fast */
                unsigned long io = pci_resource_start(pdev, 4);
                u8 reg;
 
-               ppi[0] = &info_626x;
+               ppi[0] = &info_628x;
                if (inb(io) & 0x10)
-                       ppi[0] = &info_626x_fast;
+                       ppi[0] = &info_628x_fast;
                /* Mac systems come up with some registers not set as we
                   will need them */
 
index 84d9c5568567461b782da104f41c857fb8f75f11..c5ddd937dbf21a438af2cbe8fb0f2c385b88a774 100644 (file)
@@ -8,12 +8,10 @@
  * Copyright (C) 1999-2003             Andre Hedrick <andre@linux-ide.org>
  * Portions Copyright (C) 2001         Sun Microsystems, Inc.
  * Portions Copyright (C) 2003         Red Hat Inc
- * Portions Copyright (C) 2005-2006    MontaVista Software, Inc.
+ * Portions Copyright (C) 2005-2007    MontaVista Software, Inc.
  *
  * TODO
- *     PLL mode
- *     Look into engine reset on timeout errors. Should not be
- *             required.
+ *     Look into engine reset on timeout errors. Should not be required.
  */
 
 #include <linux/kernel.h>
@@ -26,7 +24,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "pata_hpt37x"
-#define DRV_VERSION    "0.6.7"
+#define DRV_VERSION    "0.6.9"
 
 struct hpt_clock {
        u8      xfer_speed;
@@ -1092,9 +1090,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
                int dpll, adjust;
 
                /* Compute DPLL */
-               dpll = 2;
-               if (port->udma_mask & 0xE0)
-                       dpll = 3;
+               dpll = (port->udma_mask & 0xC0) ? 3 : 2;
 
                f_low = (MHz[clock_slot] * 48) / MHz[dpll];
                f_high = f_low + 2;
@@ -1116,7 +1112,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
                        pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low | 0x100);
                }
                if (adjust == 8) {
-                       printk(KERN_WARNING "hpt37x: DPLL did not stabilize.\n");
+                       printk(KERN_ERR "pata_hpt37x: DPLL did not stabilize!\n");
                        return -ENODEV;
                }
                if (dpll == 3)
@@ -1124,7 +1120,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
                else
                        private_data = (void *)hpt37x_timings_50;
 
-               printk(KERN_INFO "hpt37x: Bus clock %dMHz, using DPLL.\n", MHz[dpll]);
+               printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using %dMHz DPLL.\n",
+                      MHz[clock_slot], MHz[dpll]);
        } else {
                private_data = (void *)chip_table->clocks[clock_slot];
                /*
@@ -1137,7 +1134,8 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
                        port = &info_hpt370_33;
                if (clock_slot < 2 && port == &info_hpt370a)
                        port = &info_hpt370a_33;
-               printk(KERN_INFO "hpt37x: %s: Bus clock %dMHz.\n", chip_table->name, MHz[clock_slot]);
+               printk(KERN_INFO "pata_hpt37x: %s using %dMHz bus clock.\n",
+                      chip_table->name, MHz[clock_slot]);
        }
 
        /* Now kick off ATA set up */
index aa29cde09f8bbd594022f23a1e7803b6adfc5d87..f8f234bfc8ce2bc1ef075fccedd6df98d52fec2f 100644 (file)
@@ -8,7 +8,7 @@
  * Copyright (C) 1999-2003             Andre Hedrick <andre@linux-ide.org>
  * Portions Copyright (C) 2001         Sun Microsystems, Inc.
  * Portions Copyright (C) 2003         Red Hat Inc
- * Portions Copyright (C) 2005-2006    MontaVista Software, Inc.
+ * Portions Copyright (C) 2005-2007    MontaVista Software, Inc.
  *
  *
  * TODO
@@ -25,7 +25,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "pata_hpt3x2n"
-#define DRV_VERSION    "0.3.3"
+#define DRV_VERSION    "0.3.4"
 
 enum {
        HPT_PCI_FAST    =       (1 << 31),
@@ -579,10 +579,12 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
                pci_write_config_dword(dev, 0x5C, (f_high << 16) | f_low);
        }
        if (adjust == 8) {
-               printk(KERN_WARNING "hpt3x2n: DPLL did not stabilize.\n");
+               printk(KERN_ERR "pata_hpt3x2n: DPLL did not stabilize!\n");
                return -ENODEV;
        }
 
+       printk(KERN_INFO "pata_hpt37x: bus clock %dMHz, using 66MHz DPLL.\n",
+              pci_mhz);
        /* Set our private data up. We only need a few flags so we use
           it directly */
        port.private_data = NULL;
index 5525518204e65dc07850f2283f8a5e1b775a9703..91a396fa5b20f0f75fdbc550ab6d1b9654738145 100644 (file)
@@ -139,6 +139,8 @@ static struct pnp_device_id isapnp_devices[] = {
        {.id = ""}
 };
 
+MODULE_DEVICE_TABLE(pnp, isapnp_devices);
+
 static struct pnp_driver isapnp_driver = {
        .name           = DRV_NAME,
        .id_table       = isapnp_devices,
index 430673be1df7560aea3d4be5c9f85e1c53fb0ceb..7225124d96c20613d56969280e7131774a932974 100644 (file)
@@ -587,7 +587,7 @@ static int it821x_port_start(struct ata_port *ap)
        itdev->want[1][1] = ATA_ANY;
        itdev->last_device = -1;
 
-       if (pdev->revision == 0x11) {
+       if (pdev->revision == 0x10) {
                itdev->timing10 = 1;
                /* Need to disable ATAPI DMA for this case */
                if (!itdev->smart)
index 69a5aa4949f5b358bf6382eaceea694fb92a91c1..e3245b36269a2cd64257a228c131b68c683ba1cd 100644 (file)
@@ -563,13 +563,13 @@ static long pdc_read_counter(struct ata_host *host)
        u32 bccrl, bccrh, bccrlv, bccrhv;
 
 retry:
-       bccrl = readl(mmio_base + PDC_BYTE_COUNT) & 0xffff;
-       bccrh = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
+       bccrl = readl(mmio_base + PDC_BYTE_COUNT) & 0x7fff;
+       bccrh = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0x7fff;
        rmb();
 
        /* Read the counter values again for verification */
-       bccrlv = readl(mmio_base + PDC_BYTE_COUNT) & 0xffff;
-       bccrhv = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
+       bccrlv = readl(mmio_base + PDC_BYTE_COUNT) & 0x7fff;
+       bccrhv = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0x7fff;
        rmb();
 
        counter = (bccrh << 15) | bccrl;
@@ -692,16 +692,16 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
        struct timeval start_time, end_time;
        long pll_clock, usec_elapsed;
 
-       /* Read current counter value */
-       start_count = pdc_read_counter(host);
-       do_gettimeofday(&start_time);
-
        /* Start the test mode */
        scr = readl(mmio_base + PDC_SYS_CTL);
        PDPRINTK("scr[%X]\n", scr);
        writel(scr | (0x01 << 14), mmio_base + PDC_SYS_CTL);
        readl(mmio_base + PDC_SYS_CTL); /* flush */
 
+       /* Read current counter value */
+       start_count = pdc_read_counter(host);
+       do_gettimeofday(&start_time);
+
        /* Let the counter run for 100 ms. */
        mdelay(100);
 
@@ -719,7 +719,7 @@ static long pdc_detect_pll_input_clock(struct ata_host *host)
        usec_elapsed = (end_time.tv_sec - start_time.tv_sec) * 1000000 +
                (end_time.tv_usec - start_time.tv_usec);
 
-       pll_clock = (start_count - end_count) / 100 *
+       pll_clock = ((start_count - end_count) & 0x3fffffff) / 100 *
                (100000000 / usec_elapsed);
 
        PDPRINTK("start[%ld] end[%ld] \n", start_count, end_count);
index 66bd0e83ac07c64a0f5c635fd3c461b97b909206..2bd7645f1a8846a49cbefb3019aace5dae70a73f 100644 (file)
@@ -54,6 +54,7 @@ struct sis_laptop {
 static const struct sis_laptop sis_laptop[] = {
        /* devid, subvendor, subdev */
        { 0x5513, 0x1043, 0x1107 },     /* ASUS A6K */
+       { 0x5513, 0x1734, 0x105F },     /* FSC Amilo A1630 */
        /* end marker */
        { 0, }
 };
index f645fe22cd1e7c6fb47df6591f7be1a12fc54114..ea18e33f50efc76032ebfa44fa9286ff774b17a6 100644 (file)
@@ -63,7 +63,7 @@
 #include <linux/dmi.h>
 
 #define DRV_NAME "pata_via"
-#define DRV_VERSION "0.3.1"
+#define DRV_VERSION "0.3.2"
 
 /*
  *     The following comes directly from Vojtech Pavlik's ide/pci/via82cxxx
@@ -144,6 +144,9 @@ static int via_cable_override(struct pci_dev *pdev)
        /* Systems by DMI */
        if (dmi_check_system(cable_dmi_table))
                return 1;
+       /* Arima W730-K8/Targa Visionary 811/... */
+       if (pdev->subsystem_vendor == 0x161F && pdev->subsystem_device == 0x2032)
+               return 1;
        return 0;
 }
 
index 8ec520885b959557d0dc8d6bc3d80407cda3460f..3acf65e75eb2dd0b64b6ce2d2bfc7670c7f1cf8b 100644 (file)
@@ -621,6 +621,9 @@ static const struct pci_device_id mv_pci_tbl[] = {
        { PCI_VDEVICE(MARVELL, 0x5041), chip_504x },
        { PCI_VDEVICE(MARVELL, 0x5080), chip_5080 },
        { PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
+       /* RocketRAID 1740/174x have different identifiers */
+       { PCI_VDEVICE(TTI, 0x1740), chip_508x },
+       { PCI_VDEVICE(TTI, 0x1742), chip_508x },
 
        { PCI_VDEVICE(MARVELL, 0x6040), chip_604x },
        { PCI_VDEVICE(MARVELL, 0x6041), chip_604x },
index bed9f58c2d5a78805f663a18ce58e46fbc92e72f..b554edac1ced1cde073e83d7bef273d63ad31da8 100644 (file)
@@ -6,6 +6,11 @@ menuconfig ATM_DRIVERS
        bool "ATM drivers"
        depends on NETDEVICES && ATM
        default y
+       ---help---
+         Say Y here to get to see options for Asynchronous Transfer Mode
+         device drivers. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if ATM_DRIVERS && NETDEVICES && ATM
 
index de2fcce10ba526c1eb0c32c788f978e9fe1172ee..043353bd0600fb4c8d517672cab3116047a3fd50 100644 (file)
@@ -8,6 +8,11 @@
 menuconfig AUXDISPLAY
        depends on PARPORT
        bool "Auxiliary Display support"
+       ---help---
+         Say Y here to get to see options for auxiliary display drivers.
+         This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if AUXDISPLAY && PARPORT
 
index cb44cb4f6a47bf25c38a37f0a15832517f2d0c26..80bb061053877806bc7d6de0256e27b706a18977 100644 (file)
@@ -355,7 +355,7 @@ static int __init cfag12864b_init(void)
 
        cfag12864b_cache = kmalloc(sizeof(unsigned char) *
                CFAG12864B_SIZE, GFP_KERNEL);
-       if (cfag12864b_buffer == NULL) {
+       if (cfag12864b_cache == NULL) {
                printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
                        "can't alloc cache buffer (%i bytes)\n",
                        CFAG12864B_SIZE);
index a4a311992408f5eda8ab093bebbca107dd04faea..4245b7f80a49de11d2709ffd66a23f7d371137a3 100644 (file)
@@ -6,6 +6,12 @@ menuconfig BLK_DEV
        bool "Block devices"
        depends on BLOCK
        default y
+       ---help---
+         Say Y here to get to see options for various different block device
+         drivers. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled;
+         only do this if you know what you are doing.
 
 if BLK_DEV
 
@@ -62,6 +68,7 @@ config AMIGA_Z2RAM
 config BLK_DEV_XD
        tristate "XT hard disk support"
        depends on ISA && ISA_DMA_API
+       select CHECK_SIGNATURE
        help
          Very old 8 bit hard disk controllers used in the IBM XT computer
          will be supported if you say Y here.
index 93e3c4001bf51f299a21bf04eff813b88adfaec6..160cf14431ac55118646018d8eb184e0ab697129 100644 (file)
@@ -308,9 +308,12 @@ static int lguestblk_probe(struct lguest_device *lgdev)
        }
 
        /* This allocates a "struct gendisk" where we pack all the information
-        * about the disk which the rest of Linux sees.  We ask for one minor
-        * number; I do wonder if we should be asking for more. */
-       bd->disk = alloc_disk(1);
+        * about the disk which the rest of Linux sees.  The argument is the
+        * number of minor devices desired: we need one minor for the main
+        * disk, and one for each partition.  Of course, we can't possibly know
+        * how many partitions are on the disk (add_disk does that).
+        */
+       bd->disk = alloc_disk(16);
        if (!bd->disk) {
                err = -ENOMEM;
                goto out_unregister_blkdev;
index 96d2f9ee42d684afdf28c50c07842f3d604b4013..9b07f78510611197c86fac1d76febf997d1200f1 100644 (file)
@@ -2292,7 +2292,7 @@ static int __devinit ipmi_of_probe(struct of_device *dev,
        info->irq               = irq_of_parse_and_map(dev->node, 0);
        info->dev               = &dev->dev;
 
-       dev_dbg(&dev->dev, "addr 0x%lx regsize %ld spacing %ld irq %x\n",
+       dev_dbg(&dev->dev, "addr 0x%lx regsize %d spacing %d irq %x\n",
                info->io.addr_data, info->io.regsize, info->io.regspacing,
                info->irq);
 
index 2ce0af1bd588a0c103cc39b6f25a95a8b734b74e..d95f316afb5a9d1c3328046c8d9f4f8ab7743981 100644 (file)
@@ -1022,10 +1022,6 @@ static const unsigned short x86_keycodes[256] =
        308,310,313,314,315,317,318,319,320,357,322,323,324,325,276,330,
        332,340,365,342,343,344,345,346,356,270,341,368,369,370,371,372 };
 
-#ifdef CONFIG_MAC_EMUMOUSEBTN
-extern int mac_hid_mouse_emulate_buttons(int, int, int);
-#endif /* CONFIG_MAC_EMUMOUSEBTN */
-
 #ifdef CONFIG_SPARC
 static int sparc_l1_a_state = 0;
 extern void sun_do_break(void);
index bbb7f1292665267bf22f3a59afb455abfb5aaf00..2f97d2f8f916fbd3b003e717e16e9d021632a1bc 100644 (file)
@@ -1565,6 +1565,9 @@ static int hdlcdev_open(struct net_device *dev)
        int rc;
        unsigned long flags;
 
+       if (!try_module_get(THIS_MODULE))
+               return -EBUSY;
+
        DBGINFO(("%s hdlcdev_open\n", dev->name));
 
        /* generic HDLC layer open processing */
@@ -1634,6 +1637,7 @@ static int hdlcdev_close(struct net_device *dev)
        info->netcount=0;
        spin_unlock_irqrestore(&info->netlock, flags);
 
+       module_put(THIS_MODULE);
        return 0;
 }
 
index 9bb542913b864f44631665e8fb8e2496cef8eff5..39564b76d4a36670e501f5f8e24fa1632f625982 100644 (file)
@@ -7,7 +7,7 @@
  * Reiner Sailer <sailer@watson.ibm.com>
  * Kylene Hall <kjhall@us.ibm.com>
  *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org      
index b2e2b002a1bbce7e48b2c8b62e131aeeceb5ba72..d15ccddc92ebc6080762cb3c22d019d7f16c923a 100644 (file)
@@ -7,7 +7,7 @@
  * Reiner Sailer <sailer@watson.ibm.com>
  * Kylene Hall <kjhall@us.ibm.com>
  *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org      
index 1ab0896070be2fa7cbc97006de065f5b27ef85dc..d0e7926eb4865d31b906fab70ef266c1dbf7bbdb 100644 (file)
@@ -7,7 +7,7 @@
  * Reiner Sailer <sailer@watson.ibm.com>
  * Kylene Hall <kjhall@us.ibm.com>
  *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org      
index 9363bcf0a402e7bf5417395f4211f3de2666e5c5..6c831f9466b70c6e4399a09bc89278aed2eeaa7e 100644 (file)
@@ -4,7 +4,7 @@
  * Authors:
  * Kylene Hall <kjhall@us.ibm.com>
  *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org
index 8677fc6a545eebe543d6ac26846879325e97bde5..60a2d2630e368f4003dcb164ac437c7a2d52cfbd 100644 (file)
@@ -7,6 +7,8 @@
  *     Reiner Sailer <sailer@watson.ibm.com>
  *     Kylene Hall <kjhall@us.ibm.com>
  *
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
+ *
  * Access to the eventlog extended by the TCG BIOS of PC platform
  *
  * This program is free software; you can redistribute it and/or
index 608f73071bef91acbdbcb93d6bf17a7527d9a26a..6313326bc41fde5f2fdf455321af04abcede6181 100644 (file)
@@ -7,7 +7,7 @@
  * Reiner Sailer <sailer@watson.ibm.com>
  * Kylene Hall <kjhall@us.ibm.com>
  *
- * Maintained by: <tpmdd_devel@lists.sourceforge.net>
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
  *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org      
index 483f3f60013c70c48df984a840a7bd416fd5658c..23fa18a6654c3c53d30aaffb0eef51a4b8ff5249 100644 (file)
@@ -5,6 +5,8 @@
  * Leendert van Doorn <leendert@watson.ibm.com>
  * Kylene Hall <kjhall@us.ibm.com>
  *
+ * Maintained by: <tpmdd-devel@lists.sourceforge.net>
+ *
  * Device driver for TCG/TCPA TPM (trusted platform module).
  * Specifications at www.trustedcomputinggroup.org
  *
index 51ea93cab6c4c098cbd40dba6d17aa96e09b5c6e..9c867cf6de6456293314eb1675e697c87a9f64d2 100644 (file)
@@ -2063,8 +2063,7 @@ static int init_dev(struct tty_driver *driver, int idx,
        }
 
        if (!*tp_loc) {
-               tp = (struct ktermios *) kmalloc(sizeof(struct ktermios),
-                                               GFP_KERNEL);
+               tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
                if (!tp)
                        goto free_mem_out;
                *tp = driver->init_termios;
@@ -2094,8 +2093,7 @@ static int init_dev(struct tty_driver *driver, int idx,
                }
 
                if (!*o_tp_loc) {
-                       o_tp = (struct ktermios *)
-                               kmalloc(sizeof(struct ktermios), GFP_KERNEL);
+                       o_tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
                        if (!o_tp)
                                goto free_mem_out;
                        *o_tp = driver->other->init_termios;
index e3f6a7d0c83d35a84732e2b59203ed3ff03cb234..c404fc69e7e6134fadb1241114ba1a65e72f8e98 100644 (file)
@@ -312,6 +312,7 @@ static int ali_notify_sys(struct notifier_block *this, unsigned long code, void
  */
 
 static struct pci_device_id ali_pci_tbl[] = {
+       { PCI_VENDOR_ID_AL, 0x1533, PCI_ANY_ID, PCI_ANY_ID,},
        { PCI_VENDOR_ID_AL, 0x1535, PCI_ANY_ID, PCI_ANY_ID,},
        { 0, },
 };
@@ -329,9 +330,11 @@ static int __init ali_find_watchdog(void)
        struct pci_dev *pdev;
        u32 wdog;
 
-       /* Check for a 1535 series bridge */
+       /* Check for a 1533/1535 series bridge */
        pdev = pci_get_device(PCI_VENDOR_ID_AL, 0x1535, NULL);
-       if(pdev == NULL)
+       if (pdev == NULL)
+               pdev = pci_get_device(PCI_VENDOR_ID_AL, 0x1533, NULL);
+       if (pdev == NULL)
                return -ENODEV;
        pci_dev_put(pdev);
 
index b070324e27a6bf903cbe96410f123e24360932fd..b14e9d1f164da3a2d140af13343c93f10322b653 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *     Eurotech CPU-1220/1410 on board WDT driver
+ *     Eurotech CPU-1220/1410/1420 on board WDT driver
  *
  *     (c) Copyright 2001 Ascensit <support@ascensit.com>
  *     (c) Copyright 2001 Rodolfo Giometti <giometti@ascensit.com>
@@ -24,6 +24,9 @@
  */
 
 /* Changelog:
+ *
+ * 2001 - Rodolfo Giometti
+ *     Initial release
  *
  * 2002/04/25 - Rob Radez
  *     clean up #includes
  *     add WDIOC_GETSTATUS and WDIOC_SETOPTIONS ioctls
  *     add expect_close support
  *
- * 2001 - Rodolfo Giometti
- *     Initial release
- *
  * 2002.05.30 - Joel Becker <joel.becker@oracle.com>
  *     Added Matt Domsch's nowayout module option.
  */
 
+/*
+ *     The eurotech CPU-1220/1410/1420's watchdog is a part
+ *     of the on-board SUPER I/O device SMSC FDC 37B782.
+ */
+
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
index 84ebfcc1ffb45ef8b89550dd05146975753d97ad..c0fc4aeb8596071ff67f73852e8d9f475cb30ee4 100644 (file)
@@ -2,6 +2,11 @@
 menuconfig CRYPTO_HW
        bool "Hardware crypto devices"
        default y
+       ---help---
+         Say Y here to get to see options for hardware crypto devices and
+         processors. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if CRYPTO_HW
 
index 5fbe56b5cea09bb01f74e40488f63187dd851c1f..2d1f17865b64a933f8a9901b899952fe0018706c 100644 (file)
@@ -347,8 +347,7 @@ ioat_dma_prep_memcpy(struct dma_chan *chan, size_t len, int int_en)
        new->async_tx.ack = 0; /* client is in control of this ack */
        new->async_tx.cookie = -EBUSY;
 
-       pci_unmap_len_set(new, src_len, orig_len);
-       pci_unmap_len_set(new, dst_len, orig_len);
+       pci_unmap_len_set(new, len, orig_len);
        spin_unlock_bh(&ioat_chan->desc_lock);
 
        return new ? &new->async_tx : NULL;
@@ -423,11 +422,11 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *chan)
                        */
                        pci_unmap_page(chan->device->pdev,
                                        pci_unmap_addr(desc, dst),
-                                       pci_unmap_len(desc, dst_len),
+                                       pci_unmap_len(desc, len),
                                        PCI_DMA_FROMDEVICE);
                        pci_unmap_page(chan->device->pdev,
                                        pci_unmap_addr(desc, src),
-                                       pci_unmap_len(desc, src_len),
+                                       pci_unmap_len(desc, len),
                                        PCI_DMA_TODEVICE);
                }
 
index d3726478031a4ffd3c66db68e5e3361792658fb5..bf4dad70e0f59b78b328e1fb4fe8e60240d8fe7a 100644 (file)
@@ -111,10 +111,9 @@ struct ioat_desc_sw {
        struct ioat_dma_descriptor *hw;
        struct list_head node;
        int tx_cnt;
+       DECLARE_PCI_UNMAP_LEN(len)
        DECLARE_PCI_UNMAP_ADDR(src)
-       DECLARE_PCI_UNMAP_LEN(src_len)
        DECLARE_PCI_UNMAP_ADDR(dst)
-       DECLARE_PCI_UNMAP_LEN(dst_len)
        struct dma_async_tx_descriptor async_tx;
 };
 
index 3b63b0b7812206e643fb0cc73b1070bc65e84cca..19667fcc722a774337a3ee29c760c7ad8bec6c33 100644 (file)
@@ -5,6 +5,11 @@ menuconfig HID_SUPPORT
        bool "HID Devices"
        depends on INPUT
        default y
+       ---help---
+         Say Y here to get to see options for various computer-human interface
+         device drivers. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if HID_SUPPORT
 
index 338ee4f5461424b01c0895e8dc80348efbf4e350..d3181967f1671a9359fc474dd1a009634c511991 100644 (file)
@@ -585,6 +585,8 @@ static int __devinit smsc47m1_probe(struct platform_device *pdev)
 
        if ((err = device_create_file(dev, &dev_attr_alarms)))
                goto error_remove_files;
+       if ((err = device_create_file(dev, &dev_attr_name)))
+               goto error_remove_files;
 
        data->class_dev = hwmon_device_register(dev);
        if (IS_ERR(data->class_dev)) {
index c51ae2e17758591236721d5b99be8ce2ffea888c..d9a9ec7dd84aee91e1e0f7ddbea62bd44f7be7fa 100644 (file)
@@ -309,18 +309,16 @@ static inline int is_word_sized(u16 reg)
              || (reg & 0x00ff) == 0x55));
 }
 
-/* We assume that the default bank is 0, thus the following two functions do
-   nothing for registers which live in bank 0. For others, they respectively
-   set the bank register to the correct value (before the register is
-   accessed), and back to 0 (afterwards). */
+/* Registers 0x50-0x5f are banked */
 static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
 {
-       if (reg & 0xff00) {
+       if ((reg & 0x00f0) == 0x50) {
                outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
                outb_p(reg >> 8, data->addr + DATA_REG_OFFSET);
        }
 }
 
+/* Not strictly necessary, but play it safe for now */
 static inline void w83627ehf_reset_bank(struct w83627ehf_data *data, u16 reg)
 {
        if (reg & 0xff00) {
@@ -421,6 +419,31 @@ static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
        }
 }
 
+static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
+{
+       int i;
+
+       i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
+       data->fan_div[0] = (i >> 4) & 0x03;
+       data->fan_div[1] = (i >> 6) & 0x03;
+       i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
+       data->fan_div[2] = (i >> 6) & 0x03;
+       i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
+       data->fan_div[0] |= (i >> 3) & 0x04;
+       data->fan_div[1] |= (i >> 4) & 0x04;
+       data->fan_div[2] |= (i >> 5) & 0x04;
+       if (data->has_fan & ((1 << 3) | (1 << 4))) {
+               i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
+               data->fan_div[3] = i & 0x03;
+               data->fan_div[4] = ((i >> 2) & 0x03)
+                                | ((i >> 5) & 0x04);
+       }
+       if (data->has_fan & (1 << 3)) {
+               i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
+               data->fan_div[3] |= (i >> 5) & 0x04;
+       }
+}
+
 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
 {
        struct w83627ehf_data *data = dev_get_drvdata(dev);
@@ -432,25 +455,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
        if (time_after(jiffies, data->last_updated + HZ + HZ/2)
         || !data->valid) {
                /* Fan clock dividers */
-               i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
-               data->fan_div[0] = (i >> 4) & 0x03;
-               data->fan_div[1] = (i >> 6) & 0x03;
-               i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
-               data->fan_div[2] = (i >> 6) & 0x03;
-               i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
-               data->fan_div[0] |= (i >> 3) & 0x04;
-               data->fan_div[1] |= (i >> 4) & 0x04;
-               data->fan_div[2] |= (i >> 5) & 0x04;
-               if (data->has_fan & ((1 << 3) | (1 << 4))) {
-                       i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
-                       data->fan_div[3] = i & 0x03;
-                       data->fan_div[4] = ((i >> 2) & 0x03)
-                                        | ((i >> 5) & 0x04);
-               }
-               if (data->has_fan & (1 << 3)) {
-                       i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
-                       data->fan_div[3] |= (i >> 5) & 0x04;
-               }
+               w83627ehf_update_fan_div(data);
 
                /* Measured voltages and limits */
                for (i = 0; i < data->in_num; i++) {
@@ -1312,6 +1317,9 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
        if (!(i & (1 << 1)) && (!fan5pin))
                data->has_fan |= (1 << 4);
 
+       /* Read fan clock dividers immediately */
+       w83627ehf_update_fan_div(data);
+
        /* Register sysfs hooks */
        for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
                if ((err = device_create_file(dev,
index f85b48fea1c4700d566edd5413ed265ec4e382b9..c95909cc1d219ab35b0e2c2484a9202220dc341b 100644 (file)
@@ -740,9 +740,9 @@ store_sensor(struct device *dev, struct device_attribute *da,
 static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO | S_IWUSR,
        show_sensor, store_sensor, 0);
 static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR,
-       show_sensor, store_sensor, 0);
+       show_sensor, store_sensor, 1);
 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR,
-       show_sensor, store_sensor, 0);
+       show_sensor, store_sensor, 2);
 
 /* I2C devices get this name attribute automatically, but for ISA devices
    we must create it by ourselves. */
index e049f65bc3a2f41ac75de5b7598573119519498d..7adb61bad6ad621747556d9b77a776f9935fc810 100644 (file)
@@ -304,9 +304,9 @@ comment "IDE chipset support/bugfixes"
 
 config IDE_GENERIC
        tristate "generic/default IDE chipset support"
-       default y
+       default H8300
        help
-         If unsure, say Y.
+         If unsure, say N.
 
 config BLK_DEV_CMD640
        bool "CMD640 chipset bugfix/support"
@@ -345,6 +345,7 @@ config BLK_DEV_CMD640_ENHANCED
 config BLK_DEV_IDEPNP
        bool "PNP EIDE support"
        depends on PNP
+       select IDE_GENERIC
        help
          If you have a PnP (Plug and Play) compatible EIDE card and
          would like the kernel to automatically detect and activate
@@ -834,6 +835,7 @@ config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
 
 config IDE_ARM
        def_bool ARM && (ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
+       select IDE_GENERIC
 
 config BLK_DEV_IDE_ICSIDE
        tristate "ICS IDE interface support"
@@ -867,6 +869,7 @@ config BLK_DEV_IDE_BAST
 config BLK_DEV_GAYLE
        bool "Amiga Gayle IDE interface support"
        depends on AMIGA
+       select IDE_GENERIC
        help
          This is the IDE driver for the Amiga Gayle IDE interface. It supports
          both the `A1200 style' and `A4000 style' of the Gayle IDE interface,
@@ -898,6 +901,7 @@ config BLK_DEV_IDEDOUBLER
 config BLK_DEV_BUDDHA
        bool "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)"
        depends on ZORRO && EXPERIMENTAL
+       select IDE_GENERIC
        help
          This is the IDE driver for the IDE interfaces on the Buddha, 
          Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
@@ -910,6 +914,7 @@ config BLK_DEV_BUDDHA
 config BLK_DEV_FALCON_IDE
        bool "Falcon IDE interface support"
        depends on ATARI
+       select IDE_GENERIC
        help
          This is the IDE driver for the builtin IDE interface on the Atari
          Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
@@ -919,6 +924,7 @@ config BLK_DEV_FALCON_IDE
 config BLK_DEV_MAC_IDE
        bool "Macintosh Quadra/Powerbook IDE interface support"
        depends on MAC
+       select IDE_GENERIC
        help
          This is the IDE driver for the builtin IDE interface on some m68k
          Macintosh models. It supports both the `Quadra style' (used in
@@ -932,6 +938,7 @@ config BLK_DEV_MAC_IDE
 config BLK_DEV_Q40IDE
        bool "Q40/Q60 IDE interface support"
        depends on Q40
+       select IDE_GENERIC
        help
          Enable the on-board IDE controller in the Q40/Q60.  This should
          normally be on; disable it only if you are running a custom hard
@@ -940,6 +947,7 @@ config BLK_DEV_Q40IDE
 config BLK_DEV_MPC8xx_IDE
        bool "MPC8xx IDE support"
        depends on 8xx && IDE=y && BLK_DEV_IDE=y
+       select IDE_GENERIC
        help
          This option provides support for IDE on Motorola MPC8xx Systems.
          Please see 'Type of MPC8xx IDE interface' for details.
index fbfea46a34f253210830f3a5d314649556b83777..04636f7eaae77e206a5aa2b2b017d6a2be2d7a35 100644 (file)
@@ -718,6 +718,8 @@ static void tune_cris_ide(ide_drive_t *drive, u8 pio)
        }
 
        cris_ide_set_speed(TYPE_PIO, setup, strobe, hold);
+
+       (void)ide_config_drive_speed(drive, XFER_PIO_0 + pio);
 }
 
 static int speed_cris_ide(ide_drive_t *drive, u8 speed)
index 5ce4216f72a2b51fb0329c8e3f102d7c97129825..eba1adbc1b6a0733137085f67a6933ccb4ebba13 100644 (file)
@@ -481,6 +481,15 @@ static inline int idedisk_supports_lba48(const struct hd_driveid *id)
               && id->lba_capacity_2;
 }
 
+/*
+ * Some disks report total number of sectors instead of
+ * maximum sector address.  We list them here.
+ */
+static const struct drive_list_entry hpa_list[] = {
+       { "ST340823A",  NULL },
+       { NULL,         NULL }
+};
+
 static void idedisk_check_hpa(ide_drive_t *drive)
 {
        unsigned long long capacity, set_max;
@@ -492,6 +501,15 @@ static void idedisk_check_hpa(ide_drive_t *drive)
        else
                set_max = idedisk_read_native_max_address(drive);
 
+       if (ide_in_drive_list(drive->id, hpa_list)) {
+               /*
+                * Since we are inclusive wrt to firmware revisions do this
+                * extra check and apply the workaround only when needed.
+                */
+               if (set_max == capacity + 1)
+                       set_max--;
+       }
+
        if (set_max <= capacity)
                return;
 
index 5fe1d72ab4514e97a5dbcc5c3c1ea6183cd46324..ff644a5e12cda51214ef8940d7db23cf8b98ff1e 100644 (file)
@@ -134,25 +134,6 @@ static const struct drive_list_entry drive_blacklist [] = {
 
 };
 
-/**
- *     ide_in_drive_list       -       look for drive in black/white list
- *     @id: drive identifier
- *     @drive_table: list to inspect
- *
- *     Look for a drive in the blacklist and the whitelist tables
- *     Returns 1 if the drive is found in the table.
- */
-
-int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
-{
-       for ( ; drive_table->id_model ; drive_table++)
-               if ((!strcmp(drive_table->id_model, id->model)) &&
-                   (!drive_table->id_firmware ||
-                    strstr(id->fw_rev, drive_table->id_firmware)))
-                       return 1;
-       return 0;
-}
-
 /**
  *     ide_dma_intr    -       IDE DMA interrupt handler
  *     @drive: the drive the interrupt is for
@@ -349,9 +330,17 @@ EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
  
 static int config_drive_for_dma (ide_drive_t *drive)
 {
+       ide_hwif_t *hwif = drive->hwif;
        struct hd_driveid *id = drive->id;
 
-       if ((id->capability & 1) && drive->hwif->autodma) {
+       /* consult the list of known "bad" drives */
+       if (__ide_dma_bad_drive(drive))
+               return -1;
+
+       if (drive->media != ide_disk && hwif->atapi_dma == 0)
+               return -1;
+
+       if ((id->capability & 1) && drive->autodma) {
                /*
                 * Enable DMA on any drive that has
                 * UltraDMA (mode 0/1/2/3/4/5/6) enabled
@@ -513,20 +502,6 @@ int __ide_dma_on (ide_drive_t *drive)
 
 EXPORT_SYMBOL(__ide_dma_on);
 
-/**
- *     __ide_dma_check         -       check DMA setup
- *     @drive: drive to check
- *
- *     Don't use - due for extermination
- */
-int __ide_dma_check (ide_drive_t *drive)
-{
-       return config_drive_for_dma(drive);
-}
-
-EXPORT_SYMBOL(__ide_dma_check);
-
 /**
  *     ide_dma_setup   -       begin a DMA phase
  *     @drive: target device
@@ -1021,7 +996,7 @@ void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_p
        if (!hwif->dma_host_on)
                hwif->dma_host_on = &ide_dma_host_on;
        if (!hwif->ide_dma_check)
-               hwif->ide_dma_check = &__ide_dma_check;
+               hwif->ide_dma_check = &config_drive_for_dma;
        if (!hwif->dma_setup)
                hwif->dma_setup = &ide_dma_setup;
        if (!hwif->dma_exec_cmd)
index 92578b6832e9fbb2e31dd0287f1664ae979ab082..f4cd2700cae5f6ed366542e7c86c041482d2d6fe 100644 (file)
@@ -565,6 +565,36 @@ int ide_wait_stat (ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 b
 
 EXPORT_SYMBOL(ide_wait_stat);
 
+/**
+ *     ide_in_drive_list       -       look for drive in black/white list
+ *     @id: drive identifier
+ *     @drive_table: list to inspect
+ *
+ *     Look for a drive in the blacklist and the whitelist tables
+ *     Returns 1 if the drive is found in the table.
+ */
+
+int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table)
+{
+       for ( ; drive_table->id_model; drive_table++)
+               if ((!strcmp(drive_table->id_model, id->model)) &&
+                   (!drive_table->id_firmware ||
+                    strstr(id->fw_rev, drive_table->id_firmware)))
+                       return 1;
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ide_in_drive_list);
+
+/*
+ * Early UDMA66 devices don't set bit14 to 1, only bit13 is valid.
+ * We list them here and depend on the device side cable detection for them.
+ */
+static const struct drive_list_entry ivb_list[] = {
+       { "QUANTUM FIREBALLlct10 05"    , "A03.0900"    },
+       { NULL                          , NULL          }
+};
+
 /*
  *  All hosts that use the 80c ribbon must use!
  *  The name is derived from upper byte of word 93 and the 80c ribbon.
@@ -573,11 +603,16 @@ u8 eighty_ninty_three (ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;
        struct hd_driveid *id = drive->id;
+       int ivb = ide_in_drive_list(id, ivb_list);
 
        if (hwif->cbl == ATA_CBL_PATA40_SHORT)
                return 1;
 
-       if (hwif->cbl != ATA_CBL_PATA80)
+       if (ivb)
+               printk(KERN_DEBUG "%s: skipping word 93 validity check\n",
+                                 drive->name);
+
+       if (hwif->cbl != ATA_CBL_PATA80 && !ivb)
                goto no_80w;
 
        /* Check for SATA but only if we are ATA5 or higher */
@@ -587,11 +622,11 @@ u8 eighty_ninty_three (ide_drive_t *drive)
        /*
         * FIXME:
         * - change master/slave IDENTIFY order
-        * - force bit13 (80c cable present) check
+        * - force bit13 (80c cable present) check also for !ivb devices
         *   (unless the slave device is pre-ATA3)
         */
 #ifndef CONFIG_IDEDMA_IVB
-       if (id->hw_config & 0x4000)
+       if ((id->hw_config & 0x4000) || (ivb && (id->hw_config & 0x2000)))
 #else
        if (id->hw_config & 0x6000)
 #endif
@@ -795,7 +830,7 @@ int ide_config_drive_speed (ide_drive_t *drive, u8 speed)
                hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG);
        hwif->OUTB(speed, IDE_NSECTOR_REG);
        hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG);
-       hwif->OUTB(WIN_SETFEATURES, IDE_COMMAND_REG);
+       hwif->OUTBSYNC(drive, WIN_SETFEATURES, IDE_COMMAND_REG);
        if ((IDE_CONTROL_REG) && (drive->quirk_list == 2))
                hwif->OUTB(drive->ctl, IDE_CONTROL_REG);
        udelay(1);
@@ -822,7 +857,7 @@ int ide_config_drive_speed (ide_drive_t *drive, u8 speed)
         */
        for (i = 0; i < 10; i++) {
                udelay(1);
-               if (OK_STAT((stat = hwif->INB(IDE_STATUS_REG)), DRIVE_READY, BUSY_STAT|DRQ_STAT|ERR_STAT)) {
+               if (OK_STAT((stat = hwif->INB(IDE_STATUS_REG)), drive->ready_stat, BUSY_STAT|DRQ_STAT|ERR_STAT)) {
                        error = 0;
                        break;
                }
index acaf71fd4c09b0feaacd53e6af3caaee03b3634c..e5949b1d3fb0c001726360ff2392f71c6edc303d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/ide/pci/cs5530.c              Version 0.73    Mar 10 2007
+ * linux/drivers/ide/pci/cs5530.c              Version 0.74    Jul 28 2007
  *
  * Copyright (C) 2000                  Andre Hedrick <andre@linux-ide.org>
  * Copyright (C) 2000                  Mark Lord <mlord@pobox.com>
@@ -207,6 +207,9 @@ static unsigned int __devinit init_chipset_cs5530 (struct pci_dev *dev, const ch
        struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
        unsigned long flags;
 
+       if (pci_resource_start(dev, 4) == 0)
+               return -EFAULT;
+
        dev = NULL;
        while ((dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_ANY_ID, dev)) != NULL) {
                switch (dev->device) {
@@ -325,6 +328,9 @@ static void __devinit init_hwif_cs5530 (ide_hwif_t *hwif)
                        /* needs autotuning later */
        }
 
+       if (hwif->dma_base == 0)
+               return;
+
        hwif->atapi_dma = 1;
        hwif->ultra_mask = 0x07;
        hwif->mwdma_mask = 0x07;
index 19778c5fe711f7951e8f36e2bd2a3e87dd925a16..cb8fe5643d3b75969d28ce5f72ddb8bc26b01ab8 100644 (file)
@@ -89,11 +89,7 @@ static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive)
        drive->init_speed = 0;
 
        if (ide_tune_dma(drive))
-#ifndef CONFIG_HPT34X_AUTODMA
                return -1;
-#else
-               return 0;
-#endif
 
        if (ide_use_fast_pio(drive))
                hpt34x_tune_drive(drive, 255);
@@ -160,9 +156,11 @@ static void __devinit init_hwif_hpt34x(ide_hwif_t *hwif)
        if (!hwif->dma_base)
                return;
 
+#ifdef CONFIG_HPT34X_AUTODMA
        hwif->ultra_mask = 0x07;
        hwif->mwdma_mask = 0x07;
        hwif->swdma_mask = 0x07;
+#endif
 
        hwif->ide_dma_check = &hpt34x_config_drive_xfer_rate;
        if (!noautodma)
index 09941f37d635d28146639ada84b49c4494ce8607..465c935fdf253d384ed8ec6a72b4b1be7b2ece33 100644 (file)
@@ -187,14 +187,6 @@ static int ns87415_ide_dma_setup(ide_drive_t *drive)
        return 1;
 }
 
-static int ns87415_ide_dma_check (ide_drive_t *drive)
-{
-       if (drive->media != ide_disk)
-               return -1;
-
-       return __ide_dma_check(drive);
-}
-
 static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 {
        struct pci_dev *dev = hwif->pci_dev;
@@ -266,7 +258,6 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
 
        outb(0x60, hwif->dma_status);
        hwif->dma_setup = &ns87415_ide_dma_setup;
-       hwif->ide_dma_check = &ns87415_ide_dma_check;
        hwif->ide_dma_end = &ns87415_ide_dma_end;
 
        if (!noautodma)
index 8a66a2871b3a019c68e7a22900defadcc094190c..f6db2f37efad5e83273d3e47cec8796121cf96fb 100644 (file)
@@ -378,6 +378,9 @@ static unsigned int __devinit init_chipset_pdcnew(struct pci_dev *dev, const cha
        int f, r;
        u8 pll_ctl0, pll_ctl1;
 
+       if (dma_base == 0)
+               return -EFAULT;
+
 #ifdef CONFIG_PPC_PMAC
        apple_kiwi_init(dev);
 #endif
@@ -494,15 +497,18 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif)
        hwif->speedproc = &pdcnew_tune_chipset;
        hwif->resetproc = &pdcnew_reset;
 
+       hwif->err_stops_fifo = 1;
+
        hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 
+       if (hwif->dma_base == 0)
+               return;
+
        hwif->atapi_dma  = 1;
 
        hwif->ultra_mask = hwif->cds->udma_mask;
        hwif->mwdma_mask = 0x07;
 
-       hwif->err_stops_fifo = 1;
-
        hwif->ide_dma_check = &pdcnew_config_drive_xfer_rate;
 
        if (hwif->cbl != ATA_CBL_PATA40_SHORT)
index fbcb0bb9c956c1498473ccd8ec70c958af5f305a..e19a891171cb5192155586fb7596686fdf06f4f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/ide/pci/pdc202xx_old.c       Version 0.50    Mar 3, 2007
+ *  linux/drivers/ide/pci/pdc202xx_old.c       Version 0.51    Jul 27, 2007
  *
  *  Copyright (C) 1998-2002            Andre Hedrick <andre@linux-ide.org>
  *  Copyright (C) 2006-2007            MontaVista Software, Inc.
@@ -337,15 +337,18 @@ static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif)
 
        hwif->speedproc = &pdc202xx_tune_chipset;
 
+       hwif->err_stops_fifo = 1;
+
        hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
 
+       if (hwif->dma_base == 0)
+               return;
+
        hwif->ultra_mask = hwif->cds->udma_mask;
        hwif->mwdma_mask = 0x07;
        hwif->swdma_mask = 0x07;
        hwif->atapi_dma = 1;
 
-       hwif->err_stops_fifo = 1;
-
        hwif->ide_dma_check = &pdc202xx_config_drive_xfer_rate;
        hwif->dma_lost_irq = &pdc202xx_dma_lost_irq;
        hwif->dma_timeout = &pdc202xx_dma_timeout;
index 024bbfae0429d5b0cbcaa0595ec0b6b5958846c0..098692a6d615ff157c97cc55030b10ea883bf06d 100644 (file)
@@ -115,6 +115,9 @@ static void __devinit init_hwif_triflex(ide_hwif_t *hwif)
        hwif->tuneproc = &triflex_tune_drive;
        hwif->speedproc = &triflex_tune_chipset;
 
+       if (hwif->dma_base == 0)
+               return;
+
        hwif->atapi_dma  = 1;
        hwif->mwdma_mask = 0x07;
        hwif->swdma_mask = 0x07;
index 33630ad3e7944aaffd5e05858062bed59cbb6a32..4b13cd9a027d5f9dc1d2ffc22dec940d7387c2ce 100644 (file)
@@ -604,6 +604,9 @@ out:
                                drive->id->dma_1word |= 0x0101; break;
                        default: break;
                }
+               if (!drive->init_speed)
+                       drive->init_speed = command;
+               drive->current_speed = command;
        }
        enable_irq(hwif->irq);
        return result;
@@ -986,7 +989,6 @@ pmac_ide_tune_chipset (ide_drive_t *drive, byte speed)
                return ret;
                
        pmac_ide_do_update_timings(drive);      
-       drive->current_speed = speed;
 
        return 0;
 }
@@ -1737,11 +1739,6 @@ pmac_ide_mdma_enable(ide_drive_t *drive, u16 mode)
        /* Apply timings to controller */
        *timings = timing_local[0];
        *timings2 = timing_local[1];
-       
-       /* Set speed info in drive */
-       drive->current_speed = mode;    
-       if (!drive->init_speed)
-               drive->init_speed = mode;
 
        return 1;
 }
@@ -1793,11 +1790,6 @@ pmac_ide_udma_enable(ide_drive_t *drive, u16 mode)
        *timings = timing_local[0];
        *timings2 = timing_local[1];
 
-       /* Set speed info in drive */
-       drive->current_speed = mode;    
-       if (!drive->init_speed)
-               drive->init_speed = mode;
-
        return 1;
 }
 
index db2633e4aae6ec65b2bc49ecba6752a57b02650f..ae7c2880e6248fff4746613d69330f0f07e55fce 100644 (file)
@@ -78,15 +78,14 @@ ib_get_agent_port(struct ib_device *device, int port_num)
        return entry;
 }
 
-int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
-                       struct ib_wc *wc, struct ib_device *device,
-                       int port_num, int qpn)
+void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
+                        struct ib_wc *wc, struct ib_device *device,
+                        int port_num, int qpn)
 {
        struct ib_agent_port_private *port_priv;
        struct ib_mad_agent *agent;
        struct ib_mad_send_buf *send_buf;
        struct ib_ah *ah;
-       int ret;
        struct ib_mad_send_wr_private *mad_send_wr;
 
        if (device->node_type == RDMA_NODE_IB_SWITCH)
@@ -96,23 +95,21 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
 
        if (!port_priv) {
                printk(KERN_ERR SPFX "Unable to find port agent\n");
-               return -ENODEV;
+               return;
        }
 
        agent = port_priv->agent[qpn];
        ah = ib_create_ah_from_wc(agent->qp->pd, wc, grh, port_num);
        if (IS_ERR(ah)) {
-               ret = PTR_ERR(ah);
-               printk(KERN_ERR SPFX "ib_create_ah_from_wc error:%d\n", ret);
-               return ret;
+               printk(KERN_ERR SPFX "ib_create_ah_from_wc error\n");
+               return;
        }
 
        send_buf = ib_create_send_mad(agent, wc->src_qp, wc->pkey_index, 0,
                                      IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
                                      GFP_KERNEL);
        if (IS_ERR(send_buf)) {
-               ret = PTR_ERR(send_buf);
-               printk(KERN_ERR SPFX "ib_create_send_mad error:%d\n", ret);
+               printk(KERN_ERR SPFX "ib_create_send_mad error\n");
                goto err1;
        }
 
@@ -126,16 +123,15 @@ int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
                mad_send_wr->send_wr.wr.ud.port_num = port_num;
        }
 
-       if ((ret = ib_post_send_mad(send_buf, NULL))) {
-               printk(KERN_ERR SPFX "ib_post_send_mad error:%d\n", ret);
+       if (ib_post_send_mad(send_buf, NULL)) {
+               printk(KERN_ERR SPFX "ib_post_send_mad error\n");
                goto err2;
        }
-       return 0;
+       return;
 err2:
        ib_free_send_mad(send_buf);
 err1:
        ib_destroy_ah(ah);
-       return ret;
 }
 
 static void agent_send_handler(struct ib_mad_agent *mad_agent,
index 86d72fab37b0d4cccff79885368e608abd1ebcec..fb9ed1489f95e6e09208ae3a777a60060fd96135 100644 (file)
@@ -46,8 +46,8 @@ extern int ib_agent_port_open(struct ib_device *device, int port_num);
 
 extern int ib_agent_port_close(struct ib_device *device, int port_num);
 
-extern int agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
-                              struct ib_wc *wc, struct ib_device *device,
-                              int port_num, int qpn);
+extern void agent_send_response(struct ib_mad *mad, struct ib_grh *grh,
+                               struct ib_wc *wc, struct ib_device *device,
+                               int port_num, int qpn);
 
 #endif /* __AGENT_H_ */
index 3ada17c0f23921b87094cdacf638dbdc33a927fc..2506c43ba041c996a54a30b80efb455d908da5a7 100644 (file)
@@ -702,7 +702,7 @@ int ib_find_pkey(struct ib_device *device,
                if (ret)
                        return ret;
 
-               if (pkey == tmp_pkey) {
+               if ((pkey & 0x7fff) == (tmp_pkey & 0x7fff)) {
                        *index = i;
                        return 0;
                }
index bc547f1d34ba98d0dc5c5663f2e50b75ff6fe098..6f4287716ab1b63516e89197282925e30e86a279 100644 (file)
@@ -1842,16 +1842,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
 {
        struct ib_mad_qp_info *qp_info;
        struct ib_mad_private_header *mad_priv_hdr;
-       struct ib_mad_private *recv, *response;
+       struct ib_mad_private *recv, *response = NULL;
        struct ib_mad_list_head *mad_list;
        struct ib_mad_agent_private *mad_agent;
        int port_num;
 
-       response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
-       if (!response)
-               printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
-                      "for response buffer\n");
-
        mad_list = (struct ib_mad_list_head *)(unsigned long)wc->wr_id;
        qp_info = mad_list->mad_queue->qp_info;
        dequeue_mad(mad_list);
@@ -1879,6 +1874,13 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
        if (!validate_mad(&recv->mad.mad, qp_info->qp->qp_num))
                goto out;
 
+       response = kmem_cache_alloc(ib_mad_cache, GFP_KERNEL);
+       if (!response) {
+               printk(KERN_ERR PFX "ib_mad_recv_done_handler no memory "
+                      "for response buffer\n");
+               goto out;
+       }
+
        if (port_priv->device->node_type == RDMA_NODE_IB_SWITCH)
                port_num = wc->port_num;
        else
@@ -1914,12 +1916,11 @@ static void ib_mad_recv_done_handler(struct ib_mad_port_private *port_priv,
                        response->header.recv_wc.recv_buf.mad = &response->mad.mad;
                        response->header.recv_wc.recv_buf.grh = &response->grh;
 
-                       if (!agent_send_response(&response->mad.mad,
-                                                &response->grh, wc,
-                                                port_priv->device,
-                                                smi_get_fwd_port(&recv->mad.smp),
-                                                qp_info->qp->qp_num))
-                               response = NULL;
+                       agent_send_response(&response->mad.mad,
+                                           &response->grh, wc,
+                                           port_priv->device,
+                                           smi_get_fwd_port(&recv->mad.smp),
+                                           qp_info->qp->qp_num);
 
                        goto out;
                }
index 3663fd7022be6764d60d19ff7a19039931802723..d43bc62005b3d151607f212d2a66f90003b8639f 100644 (file)
@@ -163,8 +163,10 @@ static struct ib_mad_send_buf *alloc_response_msg(struct ib_mad_agent *agent,
                                 hdr_len, 0, GFP_KERNEL);
        if (IS_ERR(msg))
                ib_destroy_ah(ah);
-       else
+       else {
                msg->ah = ah;
+               msg->context[0] = ah;
+       }
 
        return msg;
 }
@@ -197,9 +199,7 @@ static void ack_ds_ack(struct ib_mad_agent_private *agent,
 
 void ib_rmpp_send_handler(struct ib_mad_send_wc *mad_send_wc)
 {
-       struct ib_rmpp_mad *rmpp_mad = mad_send_wc->send_buf->mad;
-
-       if (rmpp_mad->rmpp_hdr.rmpp_type != IB_MGMT_RMPP_TYPE_ACK)
+       if (mad_send_wc->send_buf->context[0] == mad_send_wc->send_buf->ah)
                ib_destroy_ah(mad_send_wc->send_buf->ah);
        ib_free_send_mad(mad_send_wc->send_buf);
 }
index 20ab6b3e484d517f29a21fa316f51e01681b30c7..d271bd715c12920a9a0e907f28865e1e120a816e 100644 (file)
@@ -385,9 +385,7 @@ static void update_sm_ah(struct work_struct *work)
 
        new_ah->pkey_index = 0;
        if (ib_find_pkey(port->agent->device, port->port_num,
-                        IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index) &&
-           ib_find_pkey(port->agent->device, port->port_num,
-                        IB_DEFAULT_PKEY_PARTIAL, &new_ah->pkey_index))
+                        IB_DEFAULT_PKEY_FULL, &new_ah->pkey_index))
                printk(KERN_ERR "Couldn't find index for default PKey\n");
 
        memset(&ah_attr, 0, sizeof ah_attr);
index 26d0470eef6ec2c2a3abb706c821cc23437e26c1..664d2faa9e744b48aa6ce11e4c195ad18d2d66eb 100644 (file)
 
 #include "uverbs.h"
 
+#define IB_UMEM_MAX_PAGE_CHUNK                                         \
+       ((PAGE_SIZE - offsetof(struct ib_umem_chunk, page_list)) /      \
+        ((void *) &((struct ib_umem_chunk *) 0)->page_list[1] -        \
+         (void *) &((struct ib_umem_chunk *) 0)->page_list[0]))
+
 static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty)
 {
        struct ib_umem_chunk *chunk, *tmp;
index 9574088f0d4e6e5857427cddb6a1ff2b277175b4..1cdfcd43b0bcb6bd8dff940fd4c11d19c07fc3ea 100644 (file)
@@ -139,7 +139,7 @@ static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb)
        req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
        OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, hwtid));
        skb->priority = CPL_PRIORITY_SETUP;
-       tdev->send(tdev, skb);
+       cxgb3_ofld_send(tdev, skb);
        return;
 }
 
@@ -161,7 +161,7 @@ int iwch_quiesce_tid(struct iwch_ep *ep)
        req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE);
 
        skb->priority = CPL_PRIORITY_DATA;
-       ep->com.tdev->send(ep->com.tdev, skb);
+       cxgb3_ofld_send(ep->com.tdev, skb);
        return 0;
 }
 
@@ -183,7 +183,7 @@ int iwch_resume_tid(struct iwch_ep *ep)
        req->val = 0;
 
        skb->priority = CPL_PRIORITY_DATA;
-       ep->com.tdev->send(ep->com.tdev, skb);
+       cxgb3_ofld_send(ep->com.tdev, skb);
        return 0;
 }
 
@@ -784,7 +784,7 @@ static int update_rx_credits(struct iwch_ep *ep, u32 credits)
        OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid));
        req->credit_dack = htonl(V_RX_CREDITS(credits) | V_RX_FORCE_ACK(1));
        skb->priority = CPL_PRIORITY_ACK;
-       ep->com.tdev->send(ep->com.tdev, skb);
+       cxgb3_ofld_send(ep->com.tdev, skb);
        return credits;
 }
 
@@ -1152,7 +1152,7 @@ static int listen_start(struct iwch_listen_ep *ep)
        req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK));
 
        skb->priority = 1;
-       ep->com.tdev->send(ep->com.tdev, skb);
+       cxgb3_ofld_send(ep->com.tdev, skb);
        return 0;
 }
 
@@ -1186,7 +1186,7 @@ static int listen_stop(struct iwch_listen_ep *ep)
        req->cpu_idx = 0;
        OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid));
        skb->priority = 1;
-       ep->com.tdev->send(ep->com.tdev, skb);
+       cxgb3_ofld_send(ep->com.tdev, skb);
        return 0;
 }
 
@@ -1264,7 +1264,7 @@ static void reject_cr(struct t3cdev *tdev, u32 hwtid, __be32 peer_ip,
                rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT);
                rpl->opt2 = 0;
                rpl->rsvd = rpl->opt2;
-               tdev->send(tdev, skb);
+               cxgb3_ofld_send(tdev, skb);
        }
 }
 
@@ -1557,7 +1557,7 @@ static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
        rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
        OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid));
        rpl->cmd = CPL_ABORT_NO_RST;
-       ep->com.tdev->send(ep->com.tdev, rpl_skb);
+       cxgb3_ofld_send(ep->com.tdev, rpl_skb);
        if (state != ABORTING) {
                state_set(&ep->com, DEAD);
                release_ep_resources(ep);
index 660b27aecae56e42b54f0a4764079d7563a5119f..8bf44daf45ecd851e858bc72b12678ada60be0d8 100644 (file)
@@ -389,7 +389,7 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
                        wc->opcode    = IB_WC_SEND;
                        break;
                case MLX4_OPCODE_RDMA_READ:
-                       wc->opcode    = IB_WC_SEND;
+                       wc->opcode    = IB_WC_RDMA_READ;
                        wc->byte_len  = be32_to_cpu(cqe->byte_cnt);
                        break;
                case MLX4_OPCODE_ATOMIC_CS:
index 333091787c5f57548a14bc3cc3d06770c81d5cd1..0ed02b7834dab398e09b141f67a0a50f2ef46766 100644 (file)
@@ -109,7 +109,7 @@ int mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int ignore_mkey, int ignore_bkey,
                           in_modifier, op_modifier,
                           MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C);
 
-       if (!err);
+       if (!err)
                memcpy(response_mad, outmailbox->buf, 256);
 
        mlx4_free_cmd_mailbox(dev->dev, inmailbox);
index 982eb88e27ec0f2451ac4ee5ced6bc72e47e7129..563aeacf9e14088cc9054030f418d4c0bf717756 100644 (file)
@@ -211,6 +211,7 @@ out_free_cq:
 
 out_free_mr:
        ib_dereg_mr(priv->mr);
+       ipoib_cm_dev_cleanup(dev);
 
 out_free_pd:
        ib_dealloc_pd(priv->pd);
index f01ca182f226a5df9c1d21adf195458ca95325e6..f6a05142814447fb3106fb7037e0b541d0a908c7 100644 (file)
@@ -75,16 +75,12 @@ module_param(topspin_workarounds, int, 0444);
 MODULE_PARM_DESC(topspin_workarounds,
                 "Enable workarounds for Topspin/Cisco SRP target bugs if != 0");
 
-static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
-
 static int mellanox_workarounds = 1;
 
 module_param(mellanox_workarounds, int, 0444);
 MODULE_PARM_DESC(mellanox_workarounds,
                 "Enable workarounds for Mellanox SRP target bugs if != 0");
 
-static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
-
 static void srp_add_one(struct ib_device *device);
 static void srp_remove_one(struct ib_device *device);
 static void srp_completion(struct ib_cq *cq, void *target_ptr);
@@ -108,6 +104,24 @@ static const char *srp_target_info(struct Scsi_Host *host)
        return host_to_target(host)->target_name;
 }
 
+static int srp_target_is_topspin(struct srp_target_port *target)
+{
+       static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
+       static const u8 cisco_oui[3]   = { 0x00, 0x1b, 0x0d };
+
+       return topspin_workarounds &&
+               (!memcmp(&target->ioc_guid, topspin_oui, sizeof topspin_oui) ||
+                !memcmp(&target->ioc_guid, cisco_oui, sizeof cisco_oui));
+}
+
+static int srp_target_is_mellanox(struct srp_target_port *target)
+{
+       static const u8 mellanox_oui[3] = { 0x00, 0x02, 0xc9 };
+
+       return mellanox_workarounds &&
+               !memcmp(&target->ioc_guid, mellanox_oui, sizeof mellanox_oui);
+}
+
 static struct srp_iu *srp_alloc_iu(struct srp_host *host, size_t size,
                                   gfp_t gfp_mask,
                                   enum dma_data_direction direction)
@@ -360,7 +374,7 @@ static int srp_send_req(struct srp_target_port *target)
         * zero out the first 8 bytes of our initiator port ID and set
         * the second 8 bytes to the local node GUID.
         */
-       if (topspin_workarounds && !memcmp(&target->ioc_guid, topspin_oui, 3)) {
+       if (srp_target_is_topspin(target)) {
                printk(KERN_DEBUG PFX "Topspin/Cisco initiator port ID workaround "
                       "activated for target GUID %016llx\n",
                       (unsigned long long) be64_to_cpu(target->ioc_guid));
@@ -585,8 +599,8 @@ static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat,
        if (!dev->fmr_pool)
                return -ENODEV;
 
-       if ((ib_sg_dma_address(ibdev, &scat[0]) & ~dev->fmr_page_mask) &&
-           mellanox_workarounds && !memcmp(&target->ioc_guid, mellanox_oui, 3))
+       if (srp_target_is_mellanox(target) &&
+           (ib_sg_dma_address(ibdev, &scat[0]) & ~dev->fmr_page_mask))
                return -EINVAL;
 
        len = page_cnt = 0;
@@ -1087,8 +1101,7 @@ static void srp_cm_rej_handler(struct ib_cm_id *cm_id,
                break;
 
        case IB_CM_REJ_PORT_REDIRECT:
-               if (topspin_workarounds &&
-                   !memcmp(&target->ioc_guid, topspin_oui, 3)) {
+               if (srp_target_is_topspin(target)) {
                        /*
                         * Topspin/Cisco SRP gateways incorrectly send
                         * reject reason code 25 when they mean 24
index 9b26574f1466a179a8a7782931855f2d946e3947..d602b8fa7d46f3020e670844fd406098ff79d5bd 100644 (file)
@@ -68,6 +68,7 @@ config INPUT_WISTRON_BTNS
        select INPUT_POLLDEV
        select NEW_LEDS
        select LEDS_CLASS
+       select CHECK_SIGNATURE
        help
          Say Y here for support of Winstron laptop button interface, used on
          laptops of various brands, including Acer and Fujitsu-Siemens. If
index b1a26e02df0263476c53a7de9faf9385ba94c26d..60843b3f3b6f25b4c03ec2b4a8d1d4b63dca8199 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * hfc_usb.c
  *
- * $Id: hfc_usb.c,v 2.3.2.13 2006/02/17 17:17:22 mbachem Exp $
+ * $Id: hfc_usb.c,v 2.3.2.20 2007/08/20 14:07:54 mbachem Exp $
  *
  * modular HiSax ISDN driver for Colognechip HFC-S USB chip
  *
- * Authors : Peter Sprenger  (sprenger@moving-bytes.de)
- *           Martin Bachem   (info@colognechip.com)
+ * Authors : Peter Sprenger (sprenger@moving-bytes.de)
+ *           Martin Bachem (m.bachem@gmx.de, info@colognechip.com)
  *
  *           based on the first hfc_usb driver of
  *           Werner Cornelius (werner@isdn-development.de)
 #include <linux/kernel_stat.h>
 #include <linux/usb.h>
 #include <linux/kernel.h>
+#include <linux/smp_lock.h>
+#include <linux/sched.h>
+#include <linux/moduleparam.h>
 #include "hisax.h"
 #include "hisax_if.h"
 #include "hfc_usb.h"
 
 static const char *hfcusb_revision =
-    "$Revision: 2.3.2.13 $ $Date: 2006/02/17 17:17:22 $ ";
+    "$Revision: 2.3.2.20 $ $Date: 2007/08/20 14:07:54 $ ";
 
 /* Hisax debug support
-* use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG
+*  debug flags defined in hfc_usb.h as HFCUSB_DBG_[*]
 */
-#ifdef CONFIG_HISAX_DEBUG
-#include <linux/moduleparam.h>
 #define __debug_variable hfc_debug
 #include "hisax_debug.h"
 static u_int debug;
 module_param(debug, uint, 0);
 static int hfc_debug;
-#endif
+
 
 /* private vendor specific data */
 typedef struct {
@@ -63,9 +64,7 @@ typedef struct {
        char *vend_name;        // device name
 } hfcsusb_vdata;
 
-/****************************************/
-/* data defining the devices to be used */
-/****************************************/
+/* VID/PID device list */
 static struct usb_device_id hfcusb_idtab[] = {
        {
         USB_DEVICE(0x0959, 0x2bd0),
@@ -90,49 +89,47 @@ static struct usb_device_id hfcusb_idtab[] = {
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "Stollmann USB TA"}),
-        },
+       },
        {
         USB_DEVICE(0x0742, 0x2009),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "Aceex USB ISDN TA"}),
-        },
+       },
        {
         USB_DEVICE(0x0742, 0x200A),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {4, 0, 2, 1},
                           "OEM USB ISDN TA"}),
-        },
+       },
        {
         USB_DEVICE(0x08e3, 0x0301),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {2, 0, 1, 4},
                           "Olitec USB RNIS"}),
-        },
+       },
        {
         USB_DEVICE(0x07fa, 0x0846),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Bewan Modem RNIS USB"}),
-        },
+       },
        {
         USB_DEVICE(0x07fa, 0x0847),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Djinn Numeris USB"}),
-        },
+       },
        {
         USB_DEVICE(0x07b0, 0x0006),
         .driver_info = (unsigned long) &((hfcsusb_vdata)
                          {LED_SCHEME1, {0x80, -64, -32, -16},
                           "Twister ISDN TA"}),
-        },
+       },
        { }
 };
 
-/***************************************************************/
 /* structure defining input+output fifos (interrupt/bulk mode) */
-/***************************************************************/
 struct usb_fifo;               /* forward definition */
 typedef struct iso_urb_struct {
        struct urb *purb;
@@ -140,8 +137,8 @@ typedef struct iso_urb_struct {
        struct usb_fifo *owner_fifo;    /* pointer to owner fifo */
 } iso_urb_struct;
 
-
 struct hfcusb_data;            /* forward definition */
+
 typedef struct usb_fifo {
        int fifonum;            /* fifo index attached to this structure */
        int active;             /* fifo is currently active */
@@ -160,15 +157,12 @@ typedef struct usb_fifo {
        struct hisax_if *hif;   /* hisax interface */
        int delete_flg;         /* only delete skbuff once */
        int last_urblen;        /* remember length of last packet */
-
 } usb_fifo;
 
-/*********************************************/
 /* structure holding all data for one device */
-/*********************************************/
 typedef struct hfcusb_data {
        /* HiSax Interface for loadable Layer1 drivers */
-       struct hisax_d_if d_if; /* see hisax_if.h */
+       struct hisax_d_if d_if;         /* see hisax_if.h */
        struct hisax_b_if b_if[2];      /* see hisax_if.h */
        int protocol;
 
@@ -176,12 +170,13 @@ typedef struct hfcusb_data {
        int if_used;            /* used interface number */
        int alt_used;           /* used alternate config */
        int ctrl_paksize;       /* control pipe packet size */
-       int ctrl_in_pipe, ctrl_out_pipe;        /* handles for control pipe */
+       int ctrl_in_pipe,       /* handles for control pipe */
+           ctrl_out_pipe;
        int cfg_used;           /* configuration index used */
        int vend_idx;           /* vendor found */
        int b_mode[2];          /* B-channel mode */
        int l1_activated;       /* layer 1 activated */
-       int disc_flag;          /* 'true' if device was disonnected to avoid some USB actions */
+       int disc_flag;          /* TRUE if device was disonnected to avoid some USB actions */
        int packet_size, iso_packet_size;
 
        /* control pipe background handling */
@@ -208,7 +203,6 @@ typedef struct hfcusb_data {
 static void collect_rx_frame(usb_fifo * fifo, __u8 * data, int len,
                             int finish);
 
-
 static inline const char *
 symbolic(struct hfcusb_symbolic_list list[], const int num)
 {
@@ -219,10 +213,6 @@ symbolic(struct hfcusb_symbolic_list list[], const int num)
        return "<unknown ERROR>";
 }
 
-
-/******************************************************/
-/* start next background transfer for control channel */
-/******************************************************/
 static void
 ctrl_start_transfer(hfcusb_data * hfc)
 {
@@ -240,10 +230,6 @@ ctrl_start_transfer(hfcusb_data * hfc)
        }
 }                              /* ctrl_start_transfer */
 
-/************************************/
-/* queue a control transfer request */
-/* return 0 on success.             */
-/************************************/
 static int
 queue_control_request(hfcusb_data * hfc, __u8 reg, __u8 val, int action)
 {
@@ -260,19 +246,8 @@ queue_control_request(hfcusb_data * hfc, __u8 reg, __u8 val, int action)
        if (++hfc->ctrl_cnt == 1)
                ctrl_start_transfer(hfc);
        return (0);
-}                              /* queue_control_request */
-
-static int
-control_action_handler(hfcusb_data * hfc, int reg, int val, int action)
-{
-       if (!action)
-               return (1);     /* no action defined */
-       return (0);
 }
 
-/***************************************************************/
-/* control completion routine handling background control cmds */
-/***************************************************************/
 static void
 ctrl_complete(struct urb *urb)
 {
@@ -282,9 +257,6 @@ ctrl_complete(struct urb *urb)
        urb->dev = hfc->dev;
        if (hfc->ctrl_cnt) {
                buf = &hfc->ctrl_buff[hfc->ctrl_out_idx];
-               control_action_handler(hfc, buf->hfc_reg, buf->reg_val,
-                                      buf->action);
-
                hfc->ctrl_cnt--;        /* decrement actual count */
                if (++hfc->ctrl_out_idx >= HFC_CTRL_BUFSIZE)
                        hfc->ctrl_out_idx = 0;  /* pointer wrap */
@@ -293,9 +265,7 @@ ctrl_complete(struct urb *urb)
        }
 }                              /* ctrl_complete */
 
-/***************************************************/
 /* write led data to auxport & invert if necessary */
-/***************************************************/
 static void
 write_led(hfcusb_data * hfc, __u8 led_state)
 {
@@ -305,9 +275,6 @@ write_led(hfcusb_data * hfc, __u8 led_state)
        }
 }
 
-/**************************/
-/* handle LED bits        */
-/**************************/
 static void
 set_led_bit(hfcusb_data * hfc, signed short led_bits, int unset)
 {
@@ -324,9 +291,7 @@ set_led_bit(hfcusb_data * hfc, signed short led_bits, int unset)
        }
 }
 
-/**************************/
-/* handle LED requests    */
-/**************************/
+/* handle LED requests */
 static void
 handle_led(hfcusb_data * hfc, int event)
 {
@@ -339,85 +304,73 @@ handle_led(hfcusb_data * hfc, int event)
 
        switch (event) {
                case LED_POWER_ON:
-                       set_led_bit(hfc, driver_info->led_bits[0],
-                                   0);
-                       set_led_bit(hfc, driver_info->led_bits[1],
-                                   1);
-                       set_led_bit(hfc, driver_info->led_bits[2],
-                                   1);
-                       set_led_bit(hfc, driver_info->led_bits[3],
-                                   1);
+                       set_led_bit(hfc, driver_info->led_bits[0], 0);
+                       set_led_bit(hfc, driver_info->led_bits[1], 1);
+                       set_led_bit(hfc, driver_info->led_bits[2], 1);
+                       set_led_bit(hfc, driver_info->led_bits[3], 1);
                        break;
-               case LED_POWER_OFF:     /* no Power off handling */
+               case LED_POWER_OFF:
+                       set_led_bit(hfc, driver_info->led_bits[0], 1);
+                       set_led_bit(hfc, driver_info->led_bits[1], 1);
+                       set_led_bit(hfc, driver_info->led_bits[2], 1);
+                       set_led_bit(hfc, driver_info->led_bits[3], 1);
                        break;
                case LED_S0_ON:
-                       set_led_bit(hfc, driver_info->led_bits[1],
-                                   0);
+                       set_led_bit(hfc, driver_info->led_bits[1], 0);
                        break;
                case LED_S0_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[1],
-                                   1);
+                       set_led_bit(hfc, driver_info->led_bits[1], 1);
                        break;
                case LED_B1_ON:
-                       set_led_bit(hfc, driver_info->led_bits[2],
-                                   0);
+                       set_led_bit(hfc, driver_info->led_bits[2], 0);
                        break;
                case LED_B1_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[2],
-                                   1);
+                       set_led_bit(hfc, driver_info->led_bits[2], 1);
                        break;
                case LED_B2_ON:
-                       set_led_bit(hfc, driver_info->led_bits[3],
-                                   0);
+                       set_led_bit(hfc, driver_info->led_bits[3], 0);
                        break;
                case LED_B2_OFF:
-                       set_led_bit(hfc, driver_info->led_bits[3],
-                                   1);
+                       set_led_bit(hfc, driver_info->led_bits[3], 1);
                        break;
        }
        write_led(hfc, hfc->led_state);
 }
 
-/********************************/
-/* called when timer t3 expires */
-/********************************/
+/* ISDN l1 timer T3 expires */
 static void
 l1_timer_expire_t3(hfcusb_data * hfc)
 {
        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
                           NULL);
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(ISDN_DBG,
+
+       DBG(HFCUSB_DBG_STATES,
            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T3 expire)");
-#endif
-       hfc->l1_activated = false;
+
+       hfc->l1_activated = 0;
        handle_led(hfc, LED_S0_OFF);
        /* deactivate : */
        queue_control_request(hfc, HFCUSB_STATES, 0x10, 1);
        queue_control_request(hfc, HFCUSB_STATES, 3, 1);
 }
 
-/********************************/
-/* called when timer t4 expires */
-/********************************/
+/* ISDN l1 timer T4 expires */
 static void
 l1_timer_expire_t4(hfcusb_data * hfc)
 {
        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc, PH_DEACTIVATE | INDICATION,
                           NULL);
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(ISDN_DBG,
+
+       DBG(HFCUSB_DBG_STATES,
            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T4 expire)");
-#endif
-       hfc->l1_activated = false;
+
+       hfc->l1_activated = 0;
        handle_led(hfc, LED_S0_OFF);
 }
 
-/*****************************/
-/* handle S0 state changes   */
-/*****************************/
+/* S0 state changed */
 static void
-state_handler(hfcusb_data * hfc, __u8 state)
+s0_state_handler(hfcusb_data * hfc, __u8 state)
 {
        __u8 old_state;
 
@@ -425,38 +378,29 @@ state_handler(hfcusb_data * hfc, __u8 state)
        if (state == old_state || state < 1 || state > 8)
                return;
 
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(ISDN_DBG, "HFC-S USB: new S0 state:%d old_state:%d", state,
-           old_state);
-#endif
+       DBG(HFCUSB_DBG_STATES, "HFC-S USB: S0 statechange(%d -> %d)",
+           old_state, state);
+
        if (state < 4 || state == 7 || state == 8) {
                if (timer_pending(&hfc->t3_timer))
                        del_timer(&hfc->t3_timer);
-#ifdef CONFIG_HISAX_DEBUG
-               DBG(ISDN_DBG, "HFC-S USB: T3 deactivated");
-#endif
+               DBG(HFCUSB_DBG_STATES, "HFC-S USB: T3 deactivated");
        }
        if (state >= 7) {
                if (timer_pending(&hfc->t4_timer))
                        del_timer(&hfc->t4_timer);
-#ifdef CONFIG_HISAX_DEBUG
-               DBG(ISDN_DBG, "HFC-S USB: T4 deactivated");
-#endif
+               DBG(HFCUSB_DBG_STATES, "HFC-S USB: T4 deactivated");
        }
 
        if (state == 7 && !hfc->l1_activated) {
                hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
                                   PH_ACTIVATE | INDICATION, NULL);
-#ifdef CONFIG_HISAX_DEBUG
-               DBG(ISDN_DBG, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
-#endif
-               hfc->l1_activated = true;
+               DBG(HFCUSB_DBG_STATES, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
+               hfc->l1_activated = 1;
                handle_led(hfc, LED_S0_ON);
        } else if (state <= 3 /* && activated */ ) {
                if (old_state == 7 || old_state == 8) {
-#ifdef CONFIG_HISAX_DEBUG
-                       DBG(ISDN_DBG, "HFC-S USB: T4 activated");
-#endif
+                       DBG(HFCUSB_DBG_STATES, "HFC-S USB: T4 activated");
                        if (!timer_pending(&hfc->t4_timer)) {
                                hfc->t4_timer.expires =
                                    jiffies + (HFC_TIMER_T4 * HZ) / 1000;
@@ -466,18 +410,15 @@ state_handler(hfcusb_data * hfc, __u8 state)
                        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
                                           PH_DEACTIVATE | INDICATION,
                                           NULL);
-#ifdef CONFIG_HISAX_DEBUG
-                       DBG(ISDN_DBG,
+                       DBG(HFCUSB_DBG_STATES,
                            "HFC-S USB: PH_DEACTIVATE | INDICATION sent");
-#endif
-                       hfc->l1_activated = false;
+                       hfc->l1_activated = 0;
                        handle_led(hfc, LED_S0_OFF);
                }
        }
        hfc->l1_state = state;
 }
 
-/* prepare iso urb */
 static void
 fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
              void *buf, int num_packets, int packet_size, int interval,
@@ -503,15 +444,16 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
 }
 
 /* allocs urbs and start isoc transfer with two pending urbs to avoid
-   gaps in the transfer chain */
+ * gaps in the transfer chain
+ */
 static int
 start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
                 usb_complete_t complete, int packet_size)
 {
        int i, k, errcode;
 
-       printk(KERN_INFO "HFC-S USB: starting ISO-chain for Fifo %i\n",
-              fifo->fifonum);
+       DBG(HFCUSB_DBG_INIT, "HFC-S USB: starting ISO-URBs for fifo:%d\n",
+           fifo->fifonum);
 
        /* allocate Memory for Iso out Urbs */
        for (i = 0; i < 2; i++) {
@@ -556,10 +498,9 @@ start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb,
 
                errcode = usb_submit_urb(fifo->iso[i].purb, GFP_KERNEL);
                fifo->active = (errcode >= 0) ? 1 : 0;
-               if (errcode < 0) {
-                       printk(KERN_INFO "HFC-S USB: %s  URB nr:%d\n",
-                              symbolic(urb_errlist, errcode), i);
-               };
+               if (errcode < 0)
+                       printk(KERN_INFO "HFC-S USB: usb_submit_urb URB nr:%d, error(%i): '%s'\n",
+                              i, errcode, symbolic(urb_errlist, errcode));
        }
        return (fifo->active);
 }
@@ -572,16 +513,15 @@ stop_isoc_chain(usb_fifo * fifo)
 
        for (i = 0; i < 2; i++) {
                if (fifo->iso[i].purb) {
-#ifdef CONFIG_HISAX_DEBUG
-                       DBG(USB_DBG,
+                       DBG(HFCUSB_DBG_INIT,
                            "HFC-S USB: Stopping iso chain for fifo %i.%i",
                            fifo->fifonum, i);
-#endif
                        usb_kill_urb(fifo->iso[i].purb);
                        usb_free_urb(fifo->iso[i].purb);
                        fifo->iso[i].purb = NULL;
                }
        }
+
        usb_kill_urb(fifo->urb);
        usb_free_urb(fifo->urb);
        fifo->urb = NULL;
@@ -594,9 +534,6 @@ static int iso_packets[8] =
        ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D, ISOC_PACKETS_D
 };
 
-/*****************************************************/
-/* transmit completion routine for all ISO tx fifos */
-/*****************************************************/
 static void
 tx_iso_complete(struct urb *urb)
 {
@@ -607,20 +544,38 @@ tx_iso_complete(struct urb *urb)
            errcode;
        int frame_complete, transp_mode, fifon, status;
        __u8 threshbit;
-       __u8 threshtable[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 };
 
        fifon = fifo->fifonum;
        status = urb->status;
 
        tx_offset = 0;
 
+       /* ISO transfer only partially completed,
+          look at individual frame status for details */
+       if (status == -EXDEV) {
+               DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete with -EXDEV"
+                   ", urb->status %d, fifonum %d\n",
+                   status, fifon);
+
+               for (k = 0; k < iso_packets[fifon]; ++k) {
+                       errcode = urb->iso_frame_desc[k].status;
+                       if (errcode)
+                               DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete "
+                                      "packet %i, status: %i\n",
+                                      k, errcode);
+               }
+
+               // clear status, so go on with ISO transfers
+               status = 0;
+       }
+
        if (fifo->active && !status) {
                transp_mode = 0;
                if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
-                       transp_mode = true;
+                       transp_mode = 1;
 
                /* is FifoFull-threshold set for our channel? */
-               threshbit = threshtable[fifon] & hfc->threshold_mask;
+               threshbit = (hfc->threshold_mask & (1 << fifon));
                num_isoc_packets = iso_packets[fifon];
 
                /* predict dataflow to avoid fifo overflow */
@@ -635,8 +590,9 @@ tx_iso_complete(struct urb *urb)
                              tx_iso_complete, urb->context);
                memset(context_iso_urb->buffer, 0,
                       sizeof(context_iso_urb->buffer));
-               frame_complete = false;
-               /* Generate next Iso Packets */
+               frame_complete = 0;
+
+               /* Generate next ISO Packets */
                for (k = 0; k < num_isoc_packets; ++k) {
                        if (fifo->skbuff) {
                                len = fifo->skbuff->len;
@@ -661,7 +617,7 @@ tx_iso_complete(struct urb *urb)
                                                /* add 2 byte flags and 16bit CRC at end of ISDN frame */
                                                fifo->bit_line += 32;
                                        }
-                                       frame_complete = true;
+                                       frame_complete = 1;
                                }
 
                                memcpy(context_iso_urb->buffer +
@@ -688,7 +644,7 @@ tx_iso_complete(struct urb *urb)
                        }
 
                        if (frame_complete) {
-                               fifo->delete_flg = true;
+                               fifo->delete_flg = 1;
                                fifo->hif->l1l2(fifo->hif,
                                                PH_DATA | CONFIRM,
                                                (void *) (unsigned long) fifo->skbuff->
@@ -696,30 +652,26 @@ tx_iso_complete(struct urb *urb)
                                if (fifo->skbuff && fifo->delete_flg) {
                                        dev_kfree_skb_any(fifo->skbuff);
                                        fifo->skbuff = NULL;
-                                       fifo->delete_flg = false;
+                                       fifo->delete_flg = 0;
                                }
-                               frame_complete = false;
+                               frame_complete = 0;
                        }
                }
                errcode = usb_submit_urb(urb, GFP_ATOMIC);
                if (errcode < 0) {
                        printk(KERN_INFO
-                              "HFC-S USB: error submitting ISO URB: %d \n",
+                              "HFC-S USB: error submitting ISO URB: %d\n",
                               errcode);
                }
        } else {
                if (status && !hfc->disc_flag) {
                        printk(KERN_INFO
-                              "HFC-S USB: tx_iso_complete : urb->status %s (%i), fifonum=%d\n",
-                              symbolic(urb_errlist, status), status,
-                              fifon);
+                              "HFC-S USB: tx_iso_complete: error(%i): '%s', fifonum=%d\n",
+                              status, symbolic(urb_errlist, status), fifon);
                }
        }
-}                              /* tx_iso_complete */
+}
 
-/*****************************************************/
-/* receive completion routine for all ISO tx fifos   */
-/*****************************************************/
 static void
 rx_iso_complete(struct urb *urb)
 {
@@ -731,21 +683,25 @@ rx_iso_complete(struct urb *urb)
        unsigned int iso_status;
        __u8 *buf;
        static __u8 eof[8];
-#ifdef CONFIG_HISAX_DEBUG
-       __u8 i;
-#endif
 
        fifon = fifo->fifonum;
        status = urb->status;
 
        if (urb->status == -EOVERFLOW) {
-#ifdef CONFIG_HISAX_DEBUG
-               DBG(USB_DBG,
-                   "HFC-USB: ignoring USB DATAOVERRUN  for fifo  %i \n",
-                   fifon);
-#endif
+               DBG(HFCUSB_DBG_VERBOSE_USB,
+                   "HFC-USB: ignoring USB DATAOVERRUN fifo(%i)", fifon);
+               status = 0;
+       }
+
+       /* ISO transfer only partially completed,
+          look at individual frame status for details */
+       if (status == -EXDEV) {
+               DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: rx_iso_complete with -EXDEV "
+                   "urb->status %d, fifonum %d\n",
+                   status, fifon);
                status = 0;
        }
+
        if (fifo->active && !status) {
                num_isoc_packets = iso_packets[fifon];
                maxlen = fifo->usb_packet_maxlen;
@@ -754,40 +710,38 @@ rx_iso_complete(struct urb *urb)
                        offset = urb->iso_frame_desc[k].offset;
                        buf = context_iso_urb->buffer + offset;
                        iso_status = urb->iso_frame_desc[k].status;
-#ifdef CONFIG_HISAX_DEBUG
+
                        if (iso_status && !hfc->disc_flag)
-                               DBG(USB_DBG,
-                                   "HFC-S USB: ISO packet failure - status:%x",
-                                   iso_status);
+                               DBG(HFCUSB_DBG_VERBOSE_USB,
+                                   "HFC-S USB: rx_iso_complete "
+                                   "ISO packet %i, status: %i\n",
+                                   k, iso_status);
 
-                       if ((fifon == 5) && (debug > 1)) {
-                               printk(KERN_INFO
+                       if (fifon == HFCUSB_D_RX) {
+                               DBG(HFCUSB_DBG_VERBOSE_USB,
                                       "HFC-S USB: ISO-D-RX lst_urblen:%2d "
-                                      "act_urblen:%2d max-urblen:%2d "
-                                      "EOF:0x%0x DATA: ",
+                                      "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
                                       fifo->last_urblen, len, maxlen,
                                       eof[5]);
-                               for (i = 0; i < len; i++)
-                                       printk("%.2x ", buf[i]);
-                               printk("\n");
+
+                               DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
                        }
-#endif
+
                        if (fifo->last_urblen != maxlen) {
                                /* the threshold mask is in the 2nd status byte */
                                hfc->threshold_mask = buf[1];
                                /* care for L1 state only for D-Channel
                                   to avoid overlapped iso completions */
-                               if (fifon == 5) {
+                               if (fifon == HFCUSB_D_RX) {
                                        /* the S0 state is in the upper half
                                           of the 1st status byte */
-                                       state_handler(hfc, buf[0] >> 4);
+                                       s0_state_handler(hfc, buf[0] >> 4);
                                }
                                eof[fifon] = buf[0] & 1;
                                if (len > 2)
                                        collect_rx_frame(fifo, buf + 2,
                                                         len - 2,
-                                                        (len <
-                                                         maxlen) ?
+                                                        (len < maxlen) ?
                                                         eof[fifon] : 0);
                        } else {
                                collect_rx_frame(fifo, buf, len,
@@ -804,41 +758,37 @@ rx_iso_complete(struct urb *urb)
                              rx_iso_complete, urb->context);
                errcode = usb_submit_urb(urb, GFP_ATOMIC);
                if (errcode < 0) {
-                       printk(KERN_INFO
-                              "HFC-S USB: error submitting ISO URB: %d \n",
+                       printk(KERN_ERR
+                              "HFC-S USB: error submitting ISO URB: %d\n",
                               errcode);
                }
        } else {
                if (status && !hfc->disc_flag) {
-                       printk(KERN_INFO
+                       printk(KERN_ERR
                               "HFC-S USB: rx_iso_complete : "
                               "urb->status %d, fifonum %d\n",
                               status, fifon);
                }
        }
-}                              /* rx_iso_complete */
+}
 
-/*****************************************************/
-/* collect data from interrupt or isochron in        */
-/*****************************************************/
+/* collect rx data from INT- and ISO-URBs  */
 static void
 collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
 {
        hfcusb_data *hfc = fifo->hfc;
        int transp_mode, fifon;
-#ifdef CONFIG_HISAX_DEBUG
-       int i;
-#endif
+
        fifon = fifo->fifonum;
        transp_mode = 0;
        if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
-               transp_mode = true;
+               transp_mode = 1;
 
        if (!fifo->skbuff) {
                fifo->skbuff = dev_alloc_skb(fifo->max_size + 3);
                if (!fifo->skbuff) {
-                       printk(KERN_INFO
-                              "HFC-S USB: cannot allocate buffer (dev_alloc_skb) fifo:%d\n",
+                       printk(KERN_ERR
+                              "HFC-S USB: cannot allocate buffer for fifo(%d)\n",
                               fifon);
                        return;
                }
@@ -847,17 +797,11 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
                if (fifo->skbuff->len + len < fifo->max_size) {
                        memcpy(skb_put(fifo->skbuff, len), data, len);
                } else {
-#ifdef CONFIG_HISAX_DEBUG
-                       printk(KERN_INFO "HFC-S USB: ");
-                       for (i = 0; i < 15; i++)
-                               printk("%.2x ",
-                                      fifo->skbuff->data[fifo->skbuff->
-                                                         len - 15 + i]);
-                       printk("\n");
-#endif
-                       printk(KERN_INFO
-                              "HCF-USB: got frame exceeded fifo->max_size:%d on fifo:%d\n",
+                       DBG(HFCUSB_DBG_FIFO_ERR,
+                              "HCF-USB: got frame exceeded fifo->max_size(%d) fifo(%d)",
                               fifo->max_size, fifon);
+                       DBG_SKB(HFCUSB_DBG_VERBOSE_USB, fifo->skbuff);
+                       skb_trim(fifo->skbuff, 0);
                }
        }
        if (transp_mode && fifo->skbuff->len >= 128) {
@@ -870,6 +814,13 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
        if (finish) {
                if ((!fifo->skbuff->data[fifo->skbuff->len - 1])
                    && (fifo->skbuff->len > 3)) {
+
+                       if (fifon == HFCUSB_D_RX) {
+                               DBG(HFCUSB_DBG_DCHANNEL,
+                                   "HFC-S USB: D-RX len(%d)", fifo->skbuff->len);
+                               DBG_SKB(HFCUSB_DBG_DCHANNEL, fifo->skbuff);
+                       }
+
                        /* remove CRC & status */
                        skb_trim(fifo->skbuff, fifo->skbuff->len - 3);
                        if (fifon == HFCUSB_PCM_RX) {
@@ -882,39 +833,17 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
                                                fifo->skbuff);
                        fifo->skbuff = NULL;    /* buffer was freed from upper layer */
                } else {
-                       if (fifo->skbuff->len > 3) {
-                               printk(KERN_INFO
-                                      "HFC-S USB: got frame %d bytes but CRC ERROR on fifo:%d!!!\n",
-                                      fifo->skbuff->len, fifon);
-#ifdef CONFIG_HISAX_DEBUG
-                               if (debug > 1) {
-                                       printk(KERN_INFO "HFC-S USB: ");
-                                       for (i = 0; i < 15; i++)
-                                               printk("%.2x ",
-                                                      fifo->skbuff->
-                                                      data[fifo->skbuff->
-                                                           len - 15 + i]);
-                                       printk("\n");
-                               }
-#endif
-                       }
-#ifdef CONFIG_HISAX_DEBUG
-                       else {
-                               printk(KERN_INFO
-                                      "HFC-S USB: frame to small (%d bytes)!!!\n",
-                                      fifo->skbuff->len);
-                       }
-#endif
+                       DBG(HFCUSB_DBG_FIFO_ERR,
+                           "HFC-S USB: ERROR frame len(%d) fifo(%d)",
+                           fifo->skbuff->len, fifon);
+                       DBG_SKB(HFCUSB_DBG_VERBOSE_USB, fifo->skbuff);
                        skb_trim(fifo->skbuff, 0);
                }
        }
 }
 
-/***********************************************/
-/* receive completion routine for all rx fifos */
-/***********************************************/
 static void
-rx_complete(struct urb *urb)
+rx_int_complete(struct urb *urb)
 {
        int len;
        int status;
@@ -922,18 +851,14 @@ rx_complete(struct urb *urb)
        usb_fifo *fifo = (usb_fifo *) urb->context;
        hfcusb_data *hfc = fifo->hfc;
        static __u8 eof[8];
-#ifdef CONFIG_HISAX_DEBUG
-       __u8 i;
-#endif
 
        urb->dev = hfc->dev;    /* security init */
 
        fifon = fifo->fifonum;
        if ((!fifo->active) || (urb->status)) {
-#ifdef CONFIG_HISAX_DEBUG
-               DBG(USB_DBG, "HFC-S USB: RX-Fifo %i is going down (%i)",
+               DBG(HFCUSB_DBG_INIT, "HFC-S USB: RX-Fifo %i is going down (%i)",
                    fifon, urb->status);
-#endif
+
                fifo->urb->interval = 0;        /* cancel automatic rescheduling */
                if (fifo->skbuff) {
                        dev_kfree_skb_any(fifo->skbuff);
@@ -945,22 +870,20 @@ rx_complete(struct urb *urb)
        buf = fifo->buffer;
        maxlen = fifo->usb_packet_maxlen;
 
-#ifdef CONFIG_HISAX_DEBUG
-       if ((fifon == 5) && (debug > 1)) {
-               printk(KERN_INFO
-                      "HFC-S USB: INT-D-RX lst_urblen:%2d act_urblen:%2d max-urblen:%2d EOF:0x%0x DATA: ",
-                      fifo->last_urblen, len, maxlen, eof[5]);
-               for (i = 0; i < len; i++)
-                       printk("%.2x ", buf[i]);
-               printk("\n");
+       if (fifon == HFCUSB_D_RX) {
+               DBG(HFCUSB_DBG_VERBOSE_USB,
+                      "HFC-S USB: INT-D-RX lst_urblen:%2d "
+                      "act_urblen:%2d max-urblen:%2d EOF:0x%0x",
+                      fifo->last_urblen, len, maxlen,
+                      eof[5]);
+               DBG_PACKET(HFCUSB_DBG_VERBOSE_USB, buf, len);
        }
-#endif
 
        if (fifo->last_urblen != fifo->usb_packet_maxlen) {
                /* the threshold mask is in the 2nd status byte */
                hfc->threshold_mask = buf[1];
                /* the S0 state is in the upper half of the 1st status byte */
-               state_handler(hfc, buf[0] >> 4);
+               s0_state_handler(hfc, buf[0] >> 4);
                eof[fifon] = buf[0] & 1;
                /* if we have more than the 2 status bytes -> collect data */
                if (len > 2)
@@ -975,20 +898,19 @@ rx_complete(struct urb *urb)
        status = usb_submit_urb(urb, GFP_ATOMIC);
        if (status) {
                printk(KERN_INFO
-                      "HFC-S USB: error resubmitting URN at rx_complete...\n");
+                      "HFC-S USB: %s error resubmitting URB fifo(%d)\n",
+                      __FUNCTION__, fifon);
        }
-}                              /* rx_complete */
+}
 
-/***************************************************/
-/* start the interrupt transfer for the given fifo */
-/***************************************************/
+/* start initial INT-URB for certain fifo */
 static void
 start_int_fifo(usb_fifo * fifo)
 {
        int errcode;
 
-       printk(KERN_INFO "HFC-S USB: starting intr IN fifo:%d\n",
-              fifo->fifonum);
+       DBG(HFCUSB_DBG_INIT, "HFC-S USB: starting RX INT-URB for fifo:%d\n",
+           fifo->fifonum);
 
        if (!fifo->urb) {
                fifo->urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -997,33 +919,28 @@ start_int_fifo(usb_fifo * fifo)
        }
        usb_fill_int_urb(fifo->urb, fifo->hfc->dev, fifo->pipe,
                         fifo->buffer, fifo->usb_packet_maxlen,
-                        rx_complete, fifo, fifo->intervall);
+                        rx_int_complete, fifo, fifo->intervall);
        fifo->active = 1;       /* must be marked active */
        errcode = usb_submit_urb(fifo->urb, GFP_KERNEL);
        if (errcode) {
-               printk(KERN_INFO
+               printk(KERN_ERR
                       "HFC-S USB: submit URB error(start_int_info): status:%i\n",
                       errcode);
                fifo->active = 0;
                fifo->skbuff = NULL;
        }
-}                              /* start_int_fifo */
+}
 
-/*****************************/
-/* set the B-channel mode    */
-/*****************************/
 static void
-set_hfcmode(hfcusb_data * hfc, int channel, int mode)
+setup_bchannel(hfcusb_data * hfc, int channel, int mode)
 {
        __u8 val, idx_table[2] = { 0, 2 };
 
        if (hfc->disc_flag) {
                return;
        }
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(ISDN_DBG, "HFC-S USB: setting channel %d to mode %d", channel,
-           mode);
-#endif
+       DBG(HFCUSB_DBG_STATES, "HFC-S USB: setting channel %d to mode %d",
+           channel, mode);
        hfc->b_mode[channel] = mode;
 
        /* setup CON_HDLC */
@@ -1080,20 +997,17 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
        switch (pr) {
                case PH_ACTIVATE | REQUEST:
                        if (fifo->fifonum == HFCUSB_D_TX) {
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(ISDN_DBG,
+                               DBG(HFCUSB_DBG_STATES,
                                    "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_ACTIVATE | REQUEST");
-#endif
+
                                if (hfc->l1_state != 3
                                    && hfc->l1_state != 7) {
                                        hfc->d_if.ifc.l1l2(&hfc->d_if.ifc,
                                                           PH_DEACTIVATE |
                                                           INDICATION,
                                                           NULL);
-#ifdef CONFIG_HISAX_DEBUG
-                                       DBG(ISDN_DBG,
+                                       DBG(HFCUSB_DBG_STATES,
                                            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (not state 3 or 7)");
-#endif
                                } else {
                                        if (hfc->l1_state == 7) {       /* l1 already active */
                                                hfc->d_if.ifc.l1l2(&hfc->
@@ -1103,10 +1017,8 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
                                                                   |
                                                                   INDICATION,
                                                                   NULL);
-#ifdef CONFIG_HISAX_DEBUG
-                                               DBG(ISDN_DBG,
+                                               DBG(HFCUSB_DBG_STATES,
                                                    "HFC-S USB: PH_ACTIVATE | INDICATION sent again ;)");
-#endif
                                        } else {
                                                /* force sending sending INFO1 */
                                                queue_control_request(hfc,
@@ -1132,11 +1044,9 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
                                        }
                                }
                        } else {
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(ISDN_DBG,
-                                   "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_ACTIVATE | REQUEST");
-#endif
-                               set_hfcmode(hfc,
+                               DBG(HFCUSB_DBG_STATES,
+                                   "HFC_USB: hfc_usb_d_l2l1 B-chan: PH_ACTIVATE | REQUEST");
+                               setup_bchannel(hfc,
                                            (fifo->fifonum ==
                                             HFCUSB_B1_TX) ? 0 : 1,
                                            (long) arg);
@@ -1147,18 +1057,12 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
                        break;
                case PH_DEACTIVATE | REQUEST:
                        if (fifo->fifonum == HFCUSB_D_TX) {
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(ISDN_DBG,
+                               DBG(HFCUSB_DBG_STATES,
                                    "HFC_USB: hfc_usb_d_l2l1 D-chan: PH_DEACTIVATE | REQUEST");
-#endif
-                               printk(KERN_INFO
-                                      "HFC-S USB: ISDN TE device should not deativate...\n");
                        } else {
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(ISDN_DBG,
+                               DBG(HFCUSB_DBG_STATES,
                                    "HFC_USB: hfc_usb_d_l2l1 Bx-chan: PH_DEACTIVATE | REQUEST");
-#endif
-                               set_hfcmode(hfc,
+                               setup_bchannel(hfc,
                                            (fifo->fifonum ==
                                             HFCUSB_B1_TX) ? 0 : 1,
                                            (int) L1_MODE_NULL);
@@ -1171,25 +1075,20 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
                        if (fifo->skbuff && fifo->delete_flg) {
                                dev_kfree_skb_any(fifo->skbuff);
                                fifo->skbuff = NULL;
-                               fifo->delete_flg = false;
+                               fifo->delete_flg = 0;
                        }
                        fifo->skbuff = arg;     /* we have a new buffer */
                        break;
                default:
-                       printk(KERN_INFO
-                              "HFC_USB: hfc_usb_d_l2l1: unkown state : %#x\n",
-                              pr);
+                       DBG(HFCUSB_DBG_STATES,
+                              "HFC_USB: hfc_usb_d_l2l1: unkown state : %#x", pr);
                        break;
        }
 }
 
-/***************************************************************************/
-/* usb_init is called once when a new matching device is detected to setup */
-/* main parameters. It registers the driver at the main hisax module.      */
-/* on success 0 is returned.                                               */
-/***************************************************************************/
+/* initial init HFC-S USB chip registers, HiSax interface, USB URBs */
 static int
-usb_init(hfcusb_data * hfc)
+hfc_usb_init(hfcusb_data * hfc)
 {
        usb_fifo *fifo;
        int i, err;
@@ -1214,11 +1113,11 @@ usb_init(hfcusb_data * hfc)
        /* aux = output, reset off */
        write_usb(hfc, HFCUSB_CIRM, 0x10);
 
-       /* set USB_SIZE to match the wMaxPacketSize for INT or BULK transfers */
+       /* set USB_SIZE to match wMaxPacketSize for INT or BULK transfers */
        write_usb(hfc, HFCUSB_USB_SIZE,
                  (hfc->packet_size / 8) | ((hfc->packet_size / 8) << 4));
 
-       /* set USB_SIZE_I to match the wMaxPacketSize for ISO transfers */
+       /* set USB_SIZE_I to match wMaxPacketSize for ISO transfers */
        write_usb(hfc, HFCUSB_USB_SIZE_I, hfc->iso_packet_size);
 
        /* enable PCM/GCI master mode */
@@ -1257,8 +1156,8 @@ usb_init(hfcusb_data * hfc)
        hfc->b_mode[0] = L1_MODE_NULL;
        hfc->b_mode[1] = L1_MODE_NULL;
 
-       hfc->l1_activated = false;
-       hfc->disc_flag = false;
+       hfc->l1_activated = 0;
+       hfc->disc_flag = 0;
        hfc->led_state = 0;
        hfc->led_new_data = 0;
        hfc->old_led_state = 0;
@@ -1349,11 +1248,9 @@ usb_init(hfcusb_data * hfc)
        handle_led(hfc, LED_POWER_ON);
 
        return (0);
-}                              /* usb_init */
+}
 
-/*************************************************/
-/* function called to probe a new plugged device */
-/*************************************************/
+/* initial callback for each plugged USB device */
 static int
 hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
@@ -1378,11 +1275,6 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                }
        }
 
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(USB_DBG,
-           "HFC-USB: probing interface(%d) actalt(%d) minor(%d)\n", ifnum,
-           iface->desc.bAlternateSetting, intf->minor);
-#endif
        printk(KERN_INFO
               "HFC-S USB: probing interface(%d) actalt(%d) minor(%d)\n",
               ifnum, iface->desc.bAlternateSetting, intf->minor);
@@ -1403,15 +1295,11 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
                        /* check for config EOL element */
                        while (validconf[cfg_used][0]) {
-                               cfg_found = true;
+                               cfg_found = 1;
                                vcf = validconf[cfg_used];
                                /* first endpoint descriptor */
                                ep = iface->endpoint;
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(USB_DBG,
-                                   "HFC-S USB: (if=%d alt=%d cfg_used=%d)\n",
-                                   ifnum, probe_alt_setting, cfg_used);
-#endif
+
                                memcpy(cmptbl, vcf, 16 * sizeof(int));
 
                                /* check for all endpoints in this alternate setting */
@@ -1425,7 +1313,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                                idx++;
                                        attr = ep->desc.bmAttributes;
                                        if (cmptbl[idx] == EP_NUL) {
-                                               cfg_found = false;
+                                               cfg_found = 0;
                                        }
                                        if (attr == USB_ENDPOINT_XFER_INT
                                            && cmptbl[idx] == EP_INT)
@@ -1438,16 +1326,9 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                                cmptbl[idx] = EP_NUL;
 
                                        /* check if all INT endpoints match minimum interval */
-                                       if (attr == USB_ENDPOINT_XFER_INT
-                                           && ep->desc.bInterval <
-                                           vcf[17]) {
-#ifdef CONFIG_HISAX_DEBUG
-                                               if (cfg_found)
-                                                       DBG(USB_DBG,
-                                                           "HFC-S USB: Interrupt Endpoint interval < %d found - skipping config",
-                                                           vcf[17]);
-#endif
-                                               cfg_found = false;
+                                       if ((attr == USB_ENDPOINT_XFER_INT)
+                                           && (ep->desc.bInterval < vcf[17])) {
+                                               cfg_found = 0;
                                        }
                                        ep++;
                                }
@@ -1455,7 +1336,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                        /* all entries must be EP_NOP or EP_NUL for a valid config */
                                        if (cmptbl[i] != EP_NOP
                                            && cmptbl[i] != EP_NUL)
-                                               cfg_found = false;
+                                               cfg_found = 0;
                                }
                                if (cfg_found) {
                                        if (cfg_used < small_match) {
@@ -1464,23 +1345,16 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                                    probe_alt_setting;
                                                iface_used = iface;
                                        }
-#ifdef CONFIG_HISAX_DEBUG
-                                       DBG(USB_DBG,
-                                           "HFC-USB: small_match=%x %x\n",
-                                           small_match, alt_used);
-#endif
                                }
                                cfg_used++;
                        }
                        alt_idx++;
-               }               /* (alt_idx < intf->num_altsetting) */
+               } /* (alt_idx < intf->num_altsetting) */
 
                /* found a valid USB Ta Endpint config */
                if (small_match != 0xffff) {
                        iface = iface_used;
-                       if (!
-                           (context =
-                            kzalloc(sizeof(hfcusb_data), GFP_KERNEL)))
+                       if (!(context = kzalloc(sizeof(hfcusb_data), GFP_KERNEL)))
                                return (-ENOMEM);       /* got no mem */
 
                        ep = iface->endpoint;
@@ -1613,20 +1487,15 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                            driver_info;
                        printk(KERN_INFO "HFC-S USB: detected \"%s\"\n",
                               driver_info->vend_name);
-#ifdef CONFIG_HISAX_DEBUG
-                       DBG(USB_DBG,
-                           "HFC-S USB: Endpoint-Config: %s (if=%d alt=%d)\n",
+
+                       DBG(HFCUSB_DBG_INIT,
+                           "HFC-S USB: Endpoint-Config: %s (if=%d alt=%d), E-Channel(%d)",
                            conf_str[small_match], context->if_used,
-                           context->alt_used);
-                       printk(KERN_INFO
-                              "HFC-S USB: E-channel (\"ECHO:\") logging ");
-                       if (validconf[small_match][18])
-                               printk(" possible\n");
-                       else
-                               printk("NOT possible\n");
-#endif
+                           context->alt_used,
+                           validconf[small_match][18]);
+
                        /* init the chip and register the driver */
-                       if (usb_init(context)) {
+                       if (hfc_usb_init(context)) {
                                usb_kill_urb(context->ctrl_urb);
                                usb_free_urb(context->ctrl_urb);
                                context->ctrl_urb = NULL;
@@ -1643,17 +1512,19 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        return (-EIO);
 }
 
-/****************************************************/
-/* function called when an active device is removed */
-/****************************************************/
+/* callback for unplugged USB device */
 static void
 hfc_usb_disconnect(struct usb_interface
                   *intf)
 {
        hfcusb_data *context = usb_get_intfdata(intf);
        int i;
+
+       handle_led(context, LED_POWER_OFF);
+       schedule_timeout((10 * HZ) / 1000);
+
        printk(KERN_INFO "HFC-S USB: device disconnect\n");
-       context->disc_flag = true;
+       context->disc_flag = 1;
        usb_set_intfdata(intf, NULL);
        if (!context)
                return;
@@ -1661,25 +1532,22 @@ hfc_usb_disconnect(struct usb_interface
                del_timer(&context->t3_timer);
        if (timer_pending(&context->t4_timer))
                del_timer(&context->t4_timer);
+
        /* tell all fifos to terminate */
        for (i = 0; i < HFCUSB_NUM_FIFOS; i++) {
                if (context->fifos[i].usb_transfer_mode == USB_ISOC) {
                        if (context->fifos[i].active > 0) {
                                stop_isoc_chain(&context->fifos[i]);
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(USB_DBG,
-                                   "HFC-S USB: hfc_usb_disconnect: stopping ISOC chain Fifo no %i",
-                                   i);
-#endif
+                               DBG(HFCUSB_DBG_INIT,
+                                   "HFC-S USB: %s stopping ISOC chain Fifo(%i)",
+                                   __FUNCTION__, i);
                        }
                } else {
                        if (context->fifos[i].active > 0) {
                                context->fifos[i].active = 0;
-#ifdef CONFIG_HISAX_DEBUG
-                               DBG(USB_DBG,
-                                   "HFC-S USB: hfc_usb_disconnect: unlinking URB for Fifo no %i",
-                                   i);
-#endif
+                               DBG(HFCUSB_DBG_INIT,
+                                   "HFC-S USB: %s unlinking URB for Fifo(%i)",
+                                   __FUNCTION__, i);
                        }
                        usb_kill_urb(context->fifos[i].urb);
                        usb_free_urb(context->fifos[i].urb);
@@ -1692,34 +1560,29 @@ hfc_usb_disconnect(struct usb_interface
        context->ctrl_urb = NULL;
        hisax_unregister(&context->d_if);
        kfree(context);         /* free our structure again */
-}                              /* hfc_usb_disconnect */
+}
 
-/************************************/
-/* our driver information structure */
-/************************************/
 static struct usb_driver hfc_drv = {
        .name  = "hfc_usb",
        .id_table = hfcusb_idtab,
        .probe = hfc_usb_probe,
        .disconnect = hfc_usb_disconnect,
 };
+
 static void __exit
-hfc_usb_exit(void)
+hfc_usb_mod_exit(void)
 {
-#ifdef CONFIG_HISAX_DEBUG
-       DBG(USB_DBG, "HFC-S USB: calling \"hfc_usb_exit\" ...");
-#endif
-       usb_deregister(&hfc_drv);       /* release our driver */
+       usb_deregister(&hfc_drv); /* release our driver */
        printk(KERN_INFO "HFC-S USB: module removed\n");
 }
 
 static int __init
-hfc_usb_init(void)
+hfc_usb_mod_init(void)
 {
+       char revstr[30], datestr[30], dummy[30];
 #ifndef CONFIG_HISAX_DEBUG
-       unsigned int debug = -1;
+       hfc_debug = debug;
 #endif
-       char revstr[30], datestr[30], dummy[30];
        sscanf(hfcusb_revision,
               "%s %s $ %s %s %s $ ", dummy, revstr,
               dummy, datestr, dummy);
@@ -1734,8 +1597,8 @@ hfc_usb_init(void)
        return (0);
 }
 
-module_init(hfc_usb_init);
-module_exit(hfc_usb_exit);
+module_init(hfc_usb_mod_init);
+module_exit(hfc_usb_mod_exit);
 MODULE_AUTHOR(DRIVER_AUTHOR);
 MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
index 471f2354dfdedf62b652d445b1bbebea0a270a83..e79f56568d301fa224f025e64cc966f063ff0201 100644 (file)
@@ -1,8 +1,8 @@
 /*
-* hfc_usb.h
-*
-* $Id: hfc_usb.h,v 4.2 2005/04/07 15:27:17 martinb1 Exp $
-*/
+ * hfc_usb.h
+ *
+ * $Id: hfc_usb.h,v 1.1.2.5 2007/08/20 14:36:03 mbachem Exp $
+ */
 
 #ifndef __HFC_USB_H__
 #define __HFC_USB_H__
 #define DRIVER_AUTHOR   "Peter Sprenger (sprenger@moving-byters.de)"
 #define DRIVER_DESC     "HFC-S USB based HiSAX ISDN driver"
 
-#define VERBOSE_USB_DEBUG
 
+#define HFC_CTRL_TIMEOUT       20      /* 5ms timeout writing/reading regs */
+#define HFC_TIMER_T3           8000    /* timeout for l1 activation timer */
+#define HFC_TIMER_T4           500     /* time for state change interval */
 
-/***********/
-/* defines */
-/***********/
-#define HFC_CTRL_TIMEOUT 20    /* 5ms timeout writing/reading regs */
-#define HFC_TIMER_T3 8000      /* timeout for l1 activation timer */
-#define HFC_TIMER_T4 500       /* time for state change interval */
+#define HFCUSB_L1_STATECHANGE  0       /* L1 state changed */
+#define HFCUSB_L1_DRX          1       /* D-frame received */
+#define HFCUSB_L1_ERX          2       /* E-frame received */
+#define HFCUSB_L1_DTX          4       /* D-frames completed */
 
-#define HFCUSB_L1_STATECHANGE 0        /* L1 state changed */
-#define HFCUSB_L1_DRX 1                /* D-frame received */
-#define HFCUSB_L1_ERX 2                /* E-frame received */
-#define HFCUSB_L1_DTX 4                /* D-frames completed */
+#define MAX_BCH_SIZE           2048    /* allowed B-channel packet size */
 
-#define MAX_BCH_SIZE 2048      /* allowed B-channel packet size */
-
-#define HFCUSB_RX_THRESHOLD 64 /* threshold for fifo report bit rx */
-#define HFCUSB_TX_THRESHOLD 64 /* threshold for fifo report bit tx */
+#define HFCUSB_RX_THRESHOLD    64      /* threshold for fifo report bit rx */
+#define HFCUSB_TX_THRESHOLD    64      /* threshold for fifo report bit tx */
 
 #define HFCUSB_CHIP_ID         0x16    /* Chip ID register index */
 #define HFCUSB_CIRM            0x00    /* cirm register index */
@@ -52,9 +47,8 @@
 
 #define HFCUSB_CHIPID          0x40    /* ID value of HFC-S USB */
 
-/******************/
+
 /* fifo registers */
-/******************/
 #define HFCUSB_NUM_FIFOS       8       /* maximum number of fifos */
 #define HFCUSB_B1_TX           0       /* index for B1 transmit bulk/int */
 #define HFCUSB_B1_RX           1       /* index for B1 receive bulk/int */
@@ -66,9 +60,9 @@
 #define HFCUSB_PCM_RX          7
 
 /*
-* used to switch snd_transfer_mode for different TA modes e.g. the Billion USB TA just
-* supports ISO out, while the Cologne Chip EVAL TA just supports BULK out
-*/
+ * used to switch snd_transfer_mode for different TA modes e.g. the Billion USB TA just
+ * supports ISO out, while the Cologne Chip EVAL TA just supports BULK out
+ */
 #define USB_INT                0
 #define USB_BULK       1
 #define USB_ISOC       2
 #define ISOC_PACKETS_B 8
 #define ISO_BUFFER_SIZE        128
 
-// ISO send definitions
+/* Fifo flow Control for TX ISO */
 #define SINK_MAX       68
 #define SINK_MIN       48
 #define SINK_DMIN      12
 #define SINK_DMAX      18
 #define BITLINE_INF    (-64*8)
 
-
-/**********/
-/* macros */
-/**********/
+/* HFC-S USB register access by Control-URSs */
 #define write_usb(a,b,c)usb_control_msg((a)->dev,(a)->ctrl_out_pipe,0,0x40,(c),(b),NULL,0,HFC_CTRL_TIMEOUT)
 #define read_usb(a,b,c) usb_control_msg((a)->dev,(a)->ctrl_in_pipe,1,0xC0,0,(b),(c),1,HFC_CTRL_TIMEOUT)
-
-
-/*******************/
-/* Debugging Flags */
-/*******************/
-#define USB_DBG   1
-#define ISDN_DBG  2
-
-
-/* *********************/
-/* USB related defines */
-/***********************/
 #define HFC_CTRL_BUFSIZE 32
 
-
-
-/*************************************************/
 /* entry and size of output/input control buffer */
-/*************************************************/
 typedef struct {
        __u8 hfc_reg;           /* register number */
        __u8 reg_val;           /* value to be written (or read) */
        int action;             /* data for action handler */
 } ctrl_buft;
 
+/* Debugging Flags */
+#define HFCUSB_DBG_INIT                0x0001
+#define HFCUSB_DBG_STATES      0x0002
+#define HFCUSB_DBG_DCHANNEL    0x0080
+#define HFCUSB_DBG_FIFO_ERR    0x4000
+#define HFCUSB_DBG_VERBOSE_USB 0x8000
 
-/********************/
-/* URB error codes: */
-/********************/
-/* Used to represent a list of values and their respective symbolic names */
+/*
+ * URB error codes:
+ * Used to represent a list of values and their respective symbolic names
+ */
 struct hfcusb_symbolic_list {
        const int num;
        const char *name;
@@ -134,20 +115,20 @@ static struct hfcusb_symbolic_list urb_errlist[] = {
        {-ENXIO, "URB already queued"},
        {-EFBIG, "Too much ISO frames requested"},
        {-ENOSR, "Buffer error (overrun)"},
-       {-EPIPE, "Specified endpoint is stalled"},
+       {-EPIPE, "Specified endpoint is stalled (device not responding)"},
        {-EOVERFLOW, "Babble (bad cable?)"},
        {-EPROTO, "Bit-stuff error (bad cable?)"},
-       {-EILSEQ, "CRC or missing token"},
-       {-ETIME, "Device did not respond"},
+       {-EILSEQ, "CRC/Timeout"},
+       {-ETIMEDOUT, "NAK (device does not respond)"},
        {-ESHUTDOWN, "Device unplugged"},
        {-1, NULL}
 };
 
 
-/*****************************************************/
-/* device dependant information to support different */
-/* ISDN Ta's using the HFC-S USB chip                */
-/*****************************************************/
+/*
+ * device dependant information to support different
+ * ISDN Ta's using the HFC-S USB chip
+ */
 
 /* USB descriptor need to contain one of the following EndPoint combination: */
 #define CNF_4INT3ISO   1       // 4 INT IN, 3 ISO OUT
@@ -155,16 +136,19 @@ static struct hfcusb_symbolic_list urb_errlist[] = {
 #define CNF_4ISO3ISO   3       // 4 ISO IN, 3 ISO OUT
 #define CNF_3ISO3ISO   4       // 3 ISO IN, 3 ISO OUT
 
-#define EP_NUL 1               // Endpoint at this position not allowed
-#define EP_NOP 2               // all type of endpoints allowed at this position
-#define EP_ISO 3               // Isochron endpoint mandatory at this position
-#define EP_BLK 4               // Bulk endpoint mandatory at this position
-#define EP_INT 5               // Interrupt endpoint mandatory at this position
+#define EP_NUL 1       // Endpoint at this position not allowed
+#define EP_NOP 2       // all type of endpoints allowed at this position
+#define EP_ISO 3       // Isochron endpoint mandatory at this position
+#define EP_BLK 4       // Bulk endpoint mandatory at this position
+#define EP_INT 5       // Interrupt endpoint mandatory at this position
 
-/* this array represents all endpoints possible in the HCF-USB the last
-* 3 entries are the configuration number, the minimum interval for
-* Interrupt endpoints & boolean if E-channel logging possible
-*/
+/*
+ * List of all supported endpoint configuration sets, used to find the
+ * best matching endpoint configuration within a devices' USB descriptor.
+ * We need at least 3 RX endpoints, and 3 TX endpoints, either
+ * INT-in and ISO-out, or ISO-in and ISO-out)
+ * with 4 RX endpoints even E-Channel logging is possible
+ */
 static int validconf[][19] = {
        // INT in, ISO out config
        {EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NUL, EP_INT, EP_NOP, EP_INT,
@@ -193,7 +177,6 @@ static char *conf_str[] = {
 };
 #endif
 
-
 typedef struct {
        int vendor;             // vendor id
        int prod_id;            // product id
@@ -202,9 +185,9 @@ typedef struct {
        signed short led_bits[8];       // array of 8 possible LED bitmask settings
 } vendor_data;
 
-#define LED_OFF      0         // no LED support
-#define LED_SCHEME1  1         // LED standard scheme
-#define LED_SCHEME2  2         // not used yet...
+#define LED_OFF                0       // no LED support
+#define LED_SCHEME1    1       // LED standard scheme
+#define LED_SCHEME2    2       // not used yet...
 
 #define LED_POWER_ON   1
 #define LED_POWER_OFF  2
@@ -217,11 +200,8 @@ typedef struct {
 #define LED_B2_OFF     9
 #define LED_B2_DATA    10
 
-#define LED_NORMAL   0         // LEDs are normal
-#define LED_INVERTED 1         // LEDs are inverted
-
-/* time in ms to perform a Flashing LED when B-Channel has traffic */
-#define LED_TIME      250
+#define LED_NORMAL     0       // LEDs are normal
+#define LED_INVERTED   1       // LEDs are inverted
 
 
-#endif                         // __HFC_USB_H__
+#endif // __HFC_USB_H__
index 6cecc396e04064e6ca8f91ca766e02ea8842783e..7b64fd4aa2f3d4c99e6f4ffef4c3cdcb48ab9a90 100644 (file)
@@ -5,6 +5,11 @@ menuconfig VIRTUALIZATION
        bool "Virtualization"
        depends on X86
        default y
+       ---help---
+         Say Y here to get to see options for virtualization guest drivers.
+         This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if VIRTUALIZATION
 
index 96856097d15bb9f2cb2b897c87d6a25a6d9248ea..cd0557954e50ef3614c03c334b38f06104ca0551 100644 (file)
@@ -2974,6 +2974,10 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val,
        switch (val) {
        case CPU_DYING:
        case CPU_DYING_FROZEN:
+               printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n",
+                      cpu);
+               hardware_disable(NULL);
+               break;
        case CPU_UP_CANCELED:
        case CPU_UP_CANCELED_FROZEN:
                printk(KERN_INFO "kvm: disabling virtualization on CPU%d\n",
index fd6925f41647acf48a9af59c14a78e86569974e9..41e2250613a164d8efec6afba60002850ff18375 100644 (file)
@@ -1,6 +1,6 @@
 config LGUEST
        tristate "Linux hypervisor example code"
-       depends on X86 && PARAVIRT && EXPERIMENTAL && !X86_PAE
+       depends on X86 && PARAVIRT && EXPERIMENTAL && !X86_PAE && FUTEX
        select LGUEST_GUEST
        select HVC_DRIVER
        ---help---
index dbe96268866e0c04e8cb011dcee3658da99af49d..56cd8998fe4b76f35e7e47158cb0147d9f4cb159 100644 (file)
@@ -3,6 +3,11 @@ menuconfig MACINTOSH_DRIVERS
        bool "Macintosh device drivers"
        depends on PPC || MAC || X86
        default y if (PPC_PMAC || MAC)
+       ---help---
+         Say Y here to get to see options for devices used with Macintosh
+         computers. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if MACINTOSH_DRIVERS
 
index 76c1e8e4a48779a9e68562802406f3ac12d4c504..33dee3a773ed29ae4cad14fe9fa37203ba7cbfef 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/sysctl.h>
 #include <linux/input.h>
 #include <linux/module.h>
+#include <linux/kbd_kern.h>
 
 
 static struct input_dev *emumousebtn;
index dfdf11c1eec45f127cf2849a789862b85ece1797..e2f84da09e7cf77661ae2b34db819e9e604be49c 100644 (file)
@@ -818,243 +818,3 @@ pmu_present(void)
 {
        return (pmu_kind != PMU_UNKNOWN);
 }
-
-#if 0 /* needs some work for 68K */
-
-/*
- * This struct is used to store config register values for
- * PCI devices which may get powered off when we sleep.
- */
-static struct pci_save {
-       u16     command;
-       u16     cache_lat;
-       u16     intr;
-} *pbook_pci_saves;
-static int n_pbook_pci_saves;
-
-static inline void
-pbook_pci_save(void)
-{
-       int npci;
-       struct pci_dev *pd = NULL;
-       struct pci_save *ps;
-
-       npci = 0;
-       while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL)
-               ++npci;
-       n_pbook_pci_saves = npci;
-       if (npci == 0)
-               return;
-       ps = kmalloc(npci * sizeof(*ps), GFP_KERNEL);
-       pbook_pci_saves = ps;
-       if (ps == NULL)
-               return;
-
-       pd = NULL;
-       while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
-               pci_read_config_word(pd, PCI_COMMAND, &ps->command);
-               pci_read_config_word(pd, PCI_CACHE_LINE_SIZE, &ps->cache_lat);
-               pci_read_config_word(pd, PCI_INTERRUPT_LINE, &ps->intr);
-               ++ps;
-               --npci;
-       }
-}
-
-static inline void
-pbook_pci_restore(void)
-{
-       u16 cmd;
-       struct pci_save *ps = pbook_pci_saves;
-       struct pci_dev *pd = NULL;
-       int j;
-
-       while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
-               if (ps->command == 0)
-                       continue;
-               pci_read_config_word(pd, PCI_COMMAND, &cmd);
-               if ((ps->command & ~cmd) == 0)
-                       continue;
-               switch (pd->hdr_type) {
-               case PCI_HEADER_TYPE_NORMAL:
-                       for (j = 0; j < 6; ++j)
-                               pci_write_config_dword(pd,
-                                       PCI_BASE_ADDRESS_0 + j*4,
-                                       pd->resource[j].start);
-                       pci_write_config_dword(pd, PCI_ROM_ADDRESS,
-                              pd->resource[PCI_ROM_RESOURCE].start);
-                       pci_write_config_word(pd, PCI_CACHE_LINE_SIZE,
-                               ps->cache_lat);
-                       pci_write_config_word(pd, PCI_INTERRUPT_LINE,
-                               ps->intr);
-                       pci_write_config_word(pd, PCI_COMMAND, ps->command);
-                       break;
-                       /* other header types not restored at present */
-               }
-       }
-}
-
-/*
- * Put the powerbook to sleep.
- */
-#define IRQ_ENABLE     ((unsigned int *)0xf3000024)
-#define MEM_CTRL       ((unsigned int *)0xf8000070)
-
-int powerbook_sleep(void)
-{
-       int ret, i, x;
-       static int save_backlight;
-       static unsigned int save_irqen;
-       unsigned long msr;
-       unsigned int hid0;
-       unsigned long p, wait;
-       struct adb_request sleep_req;
-
-       /* Notify device drivers */
-       ret = blocking_notifier_call_chain(&sleep_notifier_list,
-                       PBOOK_SLEEP, NULL);
-       if (ret & NOTIFY_STOP_MASK)
-               return -EBUSY;
-
-       /* Sync the disks. */
-       /* XXX It would be nice to have some way to ensure that
-        * nobody is dirtying any new buffers while we wait. */
-       sys_sync();
-
-       /* Turn off the display backlight */
-       save_backlight = backlight_enabled;
-       if (save_backlight)
-               pmu_enable_backlight(0);
-
-       /* Give the disks a little time to actually finish writing */
-       for (wait = jiffies + (HZ/4); time_before(jiffies, wait); )
-               mb();
-
-       /* Disable all interrupts except pmu */
-       save_irqen = in_le32(IRQ_ENABLE);
-       for (i = 0; i < 32; ++i)
-               if (i != vias->intrs[0].line && (save_irqen & (1 << i)))
-                       disable_irq(i);
-       asm volatile("mtdec %0" : : "r" (0x7fffffff));
-
-       /* Save the state of PCI config space for some slots */
-       pbook_pci_save();
-
-       /* Set the memory controller to keep the memory refreshed
-          while we're asleep */
-       for (i = 0x403f; i >= 0x4000; --i) {
-               out_be32(MEM_CTRL, i);
-               do {
-                       x = (in_be32(MEM_CTRL) >> 16) & 0x3ff;
-               } while (x == 0);
-               if (x >= 0x100)
-                       break;
-       }
-
-       /* Ask the PMU to put us to sleep */
-       pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
-       while (!sleep_req.complete)
-               mb();
-       /* displacement-flush the L2 cache - necessary? */
-       for (p = KERNELBASE; p < KERNELBASE + 0x100000; p += 0x1000)
-               i = *(volatile int *)p;
-       asleep = 1;
-
-       /* Put the CPU into sleep mode */
-       asm volatile("mfspr %0,1008" : "=r" (hid0) :);
-       hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
-       asm volatile("mtspr 1008,%0" : : "r" (hid0));
-       local_save_flags(msr);
-       msr |= MSR_POW | MSR_EE;
-       local_irq_restore(msr);
-       udelay(10);
-
-       /* OK, we're awake again, start restoring things */
-       out_be32(MEM_CTRL, 0x3f);
-       pbook_pci_restore();
-
-       /* wait for the PMU interrupt sequence to complete */
-       while (asleep)
-               mb();
-
-       /* reenable interrupts */
-       for (i = 0; i < 32; ++i)
-               if (i != vias->intrs[0].line && (save_irqen & (1 << i)))
-                       enable_irq(i);
-
-       /* Notify drivers */
-       blocking_notifier_call_chain(&sleep_notifier_list, PBOOK_WAKE, NULL);
-
-       /* reenable ADB autopoll */
-       pmu_adb_autopoll(adb_dev_map);
-
-       /* Turn on the screen backlight, if it was on before */
-       if (save_backlight)
-               pmu_enable_backlight(1);
-
-       /* Wait for the hard disk to spin up */
-
-       return 0;
-}
-
-/*
- * Support for /dev/pmu device
- */
-static int pmu_open(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-static ssize_t pmu_read(struct file *file, char *buf,
-                       size_t count, loff_t *ppos)
-{
-       return 0;
-}
-
-static ssize_t pmu_write(struct file *file, const char *buf,
-                        size_t count, loff_t *ppos)
-{
-       return 0;
-}
-
-static int pmu_ioctl(struct inode * inode, struct file *filp,
-                    u_int cmd, u_long arg)
-{
-       int error;
-       __u32 value;
-
-       switch (cmd) {
-           case PMU_IOC_SLEEP:
-               return -ENOSYS;
-           case PMU_IOC_GET_BACKLIGHT:
-               return put_user(backlight_level, (__u32 *)arg);
-           case PMU_IOC_SET_BACKLIGHT:
-               error = get_user(value, (__u32 *)arg);
-               if (!error)
-                       pmu_set_brightness(value);
-               return error;
-           case PMU_IOC_GET_MODEL:
-               return put_user(pmu_kind, (__u32 *)arg);
-       }
-       return -EINVAL;
-}
-
-static const struct file_operations pmu_device_fops = {
-       .read           = pmu_read,
-       .write          = pmu_write,
-       .ioctl          = pmu_ioctl,
-       .open           = pmu_open,
-};
-
-static struct miscdevice pmu_device = {
-       PMU_MINOR, "pmu", &pmu_device_fops
-};
-
-void pmu_device_init(void)
-{
-       if (!via)
-               return;
-       if (misc_register(&pmu_device) < 0)
-               printk(KERN_ERR "via-pmu68k: cannot register misc device.\n");
-}
-#endif /* CONFIG_PMAC_PBOOK */
-
index 650991bddd8e93d50f544f61bc0a461adfb0bac9..f33a729960ca3f58e4fd618605ca1c197523ef11 100644 (file)
@@ -1972,7 +1972,8 @@ static int run(mddev_t *mddev)
                    !test_bit(In_sync, &disk->rdev->flags)) {
                        disk->head_position = 0;
                        mddev->degraded++;
-                       conf->fullsync = 1;
+                       if (disk->rdev)
+                               conf->fullsync = 1;
                }
        }
        if (mddev->degraded == conf->raid_disks) {
@@ -2153,11 +2154,25 @@ static int raid1_reshape(mddev_t *mddev)
        oldpool = conf->r1bio_pool;
        conf->r1bio_pool = newpool;
 
-       for (d=d2=0; d < conf->raid_disks; d++)
-               if (conf->mirrors[d].rdev) {
-                       conf->mirrors[d].rdev->raid_disk = d2;
-                       newmirrors[d2++].rdev = conf->mirrors[d].rdev;
+       for (d = d2 = 0; d < conf->raid_disks; d++) {
+               mdk_rdev_t *rdev = conf->mirrors[d].rdev;
+               if (rdev && rdev->raid_disk != d2) {
+                       char nm[20];
+                       sprintf(nm, "rd%d", rdev->raid_disk);
+                       sysfs_remove_link(&mddev->kobj, nm);
+                       rdev->raid_disk = d2;
+                       sprintf(nm, "rd%d", rdev->raid_disk);
+                       sysfs_remove_link(&mddev->kobj, nm);
+                       if (sysfs_create_link(&mddev->kobj,
+                                             &rdev->kobj, nm))
+                               printk(KERN_WARNING
+                                      "md/raid1: cannot register "
+                                      "%s for %s\n",
+                                      nm, mdname(mddev));
                }
+               if (rdev)
+                       newmirrors[d2++].rdev = rdev;
+       }
        kfree(conf->mirrors);
        conf->mirrors = newmirrors;
        kfree(conf->poolinfo);
index 02a0ea6e1c17e030e7391ec09ec396a24d70eb96..6bf858a436c98048653f1a6a0ef9eb9305709584 100644 (file)
@@ -135,6 +135,13 @@ static int flexcop_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs
        struct flexcop_device *fc = i2c_get_adapdata(i2c_adap);
        int i, ret = 0;
 
+       /* Some drivers use 1 byte or 0 byte reads as probes, which this
+        * driver doesn't support.  These probes will always fail, so this
+        * hack makes them always succeed.  If one knew how, it would of
+        * course be better to actually do the read.  */
+       if (num == 1 && msgs[0].flags == I2C_M_RD && msgs[0].len <= 1)
+               return 1;
+
        if (mutex_lock_interruptible(&fc->i2c_mutex))
                return -ERESTARTSYS;
 
index acf026342ec56edc0fe91ef8faddda518b8b80d4..bdd797071cb0e6d4d3d56be1f9acb957792620d5 100644 (file)
@@ -800,7 +800,8 @@ static int dvb_net_ts_callback(const u8 *buffer1, size_t buffer1_len,
 }
 
 
-static void dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
+static void dvb_net_sec(struct net_device *dev, const u8 *pkt, int
+pkt_len)
 {
        u8 *eth;
        struct sk_buff *skb;
@@ -902,7 +903,7 @@ static int dvb_net_sec_callback(const u8 *buffer1, size_t buffer1_len,
         * we rely on the DVB API definition where exactly one complete
         * section is delivered in buffer1
         */
-       dvb_net_sec (dev, (u8*) buffer1, buffer1_len);
+       dvb_net_sec (dev, buffer1, buffer1_len);
        return 0;
 }
 
index ca99e439c97c26288dd10dd8d5a93f5f92eb8688..11f7d5939bd924269aa318f55d9b6904671a8110 100644 (file)
@@ -784,7 +784,7 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
        strncpy(fe->ops.tuner_ops.info.name, desc->name,
                sizeof(fe->ops.tuner_ops.info.name));
        fe->ops.tuner_ops.info.frequency_min = desc->min;
-       fe->ops.tuner_ops.info.frequency_min = desc->max;
+       fe->ops.tuner_ops.info.frequency_max = desc->max;
        if (!desc->initdata)
                fe->ops.tuner_ops.init = NULL;
        if (!desc->sleepdata)
index c08f650df42337df25a517eb7538e7a29c9a8a8d..ef5361824f878f01266567839226871cb07a89f9 100644 (file)
@@ -356,6 +356,7 @@ static int cafe_smbus_write_data(struct cafe_camera *cam,
 {
        unsigned int rval;
        unsigned long flags;
+       DEFINE_WAIT(the_wait);
 
        spin_lock_irqsave(&cam->dev_lock, flags);
        rval = TWSIC0_EN | ((addr << TWSIC0_SID_SHIFT) & TWSIC0_SID);
@@ -369,10 +370,29 @@ static int cafe_smbus_write_data(struct cafe_camera *cam,
        rval = value | ((command << TWSIC1_ADDR_SHIFT) & TWSIC1_ADDR);
        cafe_reg_write(cam, REG_TWSIC1, rval);
        spin_unlock_irqrestore(&cam->dev_lock, flags);
-       msleep(2); /* Required or things flake */
 
+       /*
+        * Time to wait for the write to complete.  THIS IS A RACY
+        * WAY TO DO IT, but the sad fact is that reading the TWSIC1
+        * register too quickly after starting the operation sends
+        * the device into a place that may be kinder and better, but
+        * which is absolutely useless for controlling the sensor.  In
+        * practice we have plenty of time to get into our sleep state
+        * before the interrupt hits, and the worst case is that we
+        * time out and then see that things completed, so this seems
+        * the best way for now.
+        */
+       do {
+               prepare_to_wait(&cam->smbus_wait, &the_wait,
+                               TASK_UNINTERRUPTIBLE);
+               schedule_timeout(1); /* even 1 jiffy is too long */
+               finish_wait(&cam->smbus_wait, &the_wait);
+       } while (!cafe_smbus_write_done(cam));
+
+#ifdef IF_THE_CAFE_HARDWARE_WORKED_RIGHT
        wait_event_timeout(cam->smbus_wait, cafe_smbus_write_done(cam),
                        CAFE_SMBUS_TIMEOUT);
+#endif
        spin_lock_irqsave(&cam->dev_lock, flags);
        rval = cafe_reg_read(cam, REG_TWSIC1);
        spin_unlock_irqrestore(&cam->dev_lock, flags);
@@ -710,7 +730,7 @@ static void cafe_ctlr_init(struct cafe_camera *cam)
         * Here we must wait a bit for the controller to come around.
         */
        spin_unlock_irqrestore(&cam->dev_lock, flags);
-       mdelay(5);      /* FIXME revisit this */
+       msleep(5);
        spin_lock_irqsave(&cam->dev_lock, flags);
 
        cafe_reg_write(cam, REG_GL_CSR, GCSR_CCIC_EN|GCSR_SRC|GCSR_MRC);
@@ -2233,12 +2253,21 @@ static int cafe_pci_resume(struct pci_dev *pdev)
        if (ret)
                return ret;
        ret = pci_enable_device(pdev);
+
        if (ret) {
                cam_warn(cam, "Unable to re-enable device on resume!\n");
                return ret;
        }
        cafe_ctlr_init(cam);
-       cafe_ctlr_power_up(cam);
+       cafe_ctlr_power_down(cam);
+
+       mutex_lock(&cam->s_mutex);
+       if (cam->users > 0) {
+               cafe_ctlr_power_up(cam);
+               __cafe_cam_reset(cam);
+       }
+       mutex_unlock(&cam->s_mutex);
+
        set_bit(CF_CONFIG_NEEDED, &cam->flags);
        if (cam->state == S_SPECREAD)
                cam->state = S_IDLE;  /* Don't bother restarting */
index 2c7b158ce7e1bdbf9af1826701a9780ba6a3aa58..40307f3f6fe31118be769ecf2103873c86ead2ec 100644 (file)
@@ -1772,6 +1772,7 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        if (dev->alt_max_pkt_size == NULL) {
                em28xx_errdev("out of memory!\n");
                em28xx_devused&=~(1<<nr);
+               kfree(dev);
                return -ENOMEM;
        }
 
index 047624b9e2717f0ded7af8e2403e908ee60c3091..5977a79619c210e5dcb39a310300e822baf7a618 100644 (file)
@@ -1190,6 +1190,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
                itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
                itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0;
                itv->osd_color_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
+               ivtv_set_osd_alpha(itv);
                break;
        }
 
@@ -1234,7 +1235,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
                IVTV_INFO("Tuner: %s\n",
                        test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
                cx2341x_log_status(&itv->params, itv->name);
-               IVTV_INFO("Status flags: 0x%08lx\n", itv->i_flags);
+               IVTV_INFO("Version: %s Status flags: 0x%08lx\n", IVTV_VERSION, itv->i_flags);
                for (i = 0; i < IVTV_MAX_STREAMS; i++) {
                        struct ivtv_stream *s = &itv->streams[i];
 
index f8f21ddd98431c9d689db3d80684efaad303d01a..c4c5bd67f795a12a66ef1f69cf72d869ee87f8d5 100644 (file)
@@ -416,7 +416,10 @@ static int ov7670_read(struct i2c_client *c, unsigned char reg,
 static int ov7670_write(struct i2c_client *c, unsigned char reg,
                unsigned char value)
 {
-       return i2c_smbus_write_byte_data(c, reg, value);
+       int ret = i2c_smbus_write_byte_data(c, reg, value);
+       if (reg == REG_COM7 && (value & COM7_RESET))
+               msleep(2);  /* Wait for reset to run */
+       return ret;
 }
 
 
index 9c0e8d18c2f6085e7bcb9a39c53dcb6212283179..3d81966d8c421eda17a483059dae48bb0f443471 100644 (file)
@@ -1196,12 +1196,19 @@ static int pwc_video_open(struct inode *inode, struct file *file)
        return 0;
 }
 
+
+static void pwc_cleanup(struct pwc_device *pdev)
+{
+       pwc_remove_sysfs_files(pdev->vdev);
+       video_unregister_device(pdev->vdev);
+}
+
 /* Note that all cleanup is done in the reverse order as in _open */
 static int pwc_video_close(struct inode *inode, struct file *file)
 {
        struct video_device *vdev = file->private_data;
        struct pwc_device *pdev;
-       int i;
+       int i, hint;
 
        PWC_DEBUG_OPEN(">> video_close called(vdev = 0x%p).\n", vdev);
 
@@ -1224,8 +1231,9 @@ static int pwc_video_close(struct inode *inode, struct file *file)
        pwc_isoc_cleanup(pdev);
        pwc_free_buffers(pdev);
 
+       lock_kernel();
        /* Turn off LEDS and power down camera, but only when not unplugged */
-       if (pdev->error_status != EPIPE) {
+       if (!pdev->unplugged) {
                /* Turn LEDs off */
                if (pwc_set_leds(pdev, 0, 0) < 0)
                        PWC_DEBUG_MODULE("Failed to set LED on/off time.\n");
@@ -1234,9 +1242,19 @@ static int pwc_video_close(struct inode *inode, struct file *file)
                        if (i < 0)
                                PWC_ERROR("Failed to power down camera (%d)\n", i);
                }
+               pdev->vopen--;
+               PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", i);
+       } else {
+               pwc_cleanup(pdev);
+               /* Free memory (don't set pdev to 0 just yet) */
+               kfree(pdev);
+               /* search device_hint[] table if we occupy a slot, by any chance */
+               for (hint = 0; hint < MAX_DEV_HINTS; hint++)
+                       if (device_hint[hint].pdev == pdev)
+                               device_hint[hint].pdev = NULL;
        }
-       pdev->vopen--;
-       PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", pdev->vopen);
+       unlock_kernel();
+
        return 0;
 }
 
@@ -1791,21 +1809,21 @@ static void usb_pwc_disconnect(struct usb_interface *intf)
        /* Alert waiting processes */
        wake_up_interruptible(&pdev->frameq);
        /* Wait until device is closed */
-       while (pdev->vopen)
-               schedule();
-       /* Device is now closed, so we can safely unregister it */
-       PWC_DEBUG_PROBE("Unregistering video device in disconnect().\n");
-       pwc_remove_sysfs_files(pdev->vdev);
-       video_unregister_device(pdev->vdev);
-
-       /* Free memory (don't set pdev to 0 just yet) */
-       kfree(pdev);
+       if(pdev->vopen) {
+               pdev->unplugged = 1;
+       } else {
+               /* Device is closed, so we can safely unregister it */
+               PWC_DEBUG_PROBE("Unregistering video device in disconnect().\n");
+               pwc_cleanup(pdev);
+               /* Free memory (don't set pdev to 0 just yet) */
+               kfree(pdev);
 
 disconnect_out:
-       /* search device_hint[] table if we occupy a slot, by any chance */
-       for (hint = 0; hint < MAX_DEV_HINTS; hint++)
-               if (device_hint[hint].pdev == pdev)
-                       device_hint[hint].pdev = NULL;
+               /* search device_hint[] table if we occupy a slot, by any chance */
+               for (hint = 0; hint < MAX_DEV_HINTS; hint++)
+                       if (device_hint[hint].pdev == pdev)
+                               device_hint[hint].pdev = NULL;
+       }
 
        unlock_kernel();
 }
index 910a04f539202a2d6a5f3b2adb879c7c551a69b1..8e8e5b27e77ea2f9c77edd549bc696b7b7c1000e 100644 (file)
@@ -193,6 +193,7 @@ struct pwc_device
    char vsnapshot;             /* snapshot mode */
    char vsync;                 /* used by isoc handler */
    char vmirror;               /* for ToUCaM series */
+       char unplugged;
 
    int cmd_len;
    unsigned char cmd_buf[13];
index 518d5d33546489e2d4de6fca87e5a9983ce05fb0..a26655881e6a72aa8098c3d629d8781e90b4c714 100644 (file)
@@ -5,6 +5,11 @@
 menuconfig MISC_DEVICES
        bool "Misc devices"
        default y
+       ---help---
+         Say Y here to get to see options for device drivers from various
+         different categories. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if MISC_DEVICES
 
index d0fc4fd212e6814ae1ce4f6c852ac30f5e8ec137..40db9f70148f4b1035861a416224d4b1606bf816 100644 (file)
@@ -1072,7 +1072,8 @@ static void asus_backlight_exit(void)
 }
 
 #define  ASUS_LED_UNREGISTER(object)                           \
-       led_classdev_unregister(&object##_led)
+       if (object##_led.dev)                                   \
+               led_classdev_unregister(&object##_led)
 
 static void asus_led_exit(void)
 {
index fe0e785ed7d2f57634fac42f5d6613417646affa..817a79462b3d5747e75057ac7f6819d925ae4d4e 100644 (file)
@@ -186,12 +186,10 @@ struct mmc_card *mmc_alloc_card(struct mmc_host *host)
 {
        struct mmc_card *card;
 
-       card = kmalloc(sizeof(struct mmc_card), GFP_KERNEL);
+       card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
        if (!card)
                return ERR_PTR(-ENOMEM);
 
-       memset(card, 0, sizeof(struct mmc_card));
-
        card->host = host;
 
        device_initialize(&card->dev);
index 6a7e29849603dd86e29242c81e6184b1bd6d7033..2c7ce8f43a9a60367a6f75397a7da831c3afe8d3 100644 (file)
@@ -58,12 +58,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 {
        struct mmc_host *host;
 
-       host = kmalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
+       host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
        if (!host)
                return NULL;
 
-       memset(host, 0, sizeof(struct mmc_host) + extra);
-
        host->parent = dev;
        host->class_dev.parent = dev;
        host->class_dev.class = &mmc_host_class;
index f2bc87ac24f7fe9151dcc948ffedb921d798116c..20a7d89e01bac08032fa874ecc081fc7a44a322d 100644 (file)
@@ -385,6 +385,9 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)
        BUG_ON(data->blksz > host->mmc->max_blk_size);
        BUG_ON(data->blocks > 65535);
 
+       host->data = data;
+       host->data_early = 0;
+
        /* timeout in us */
        target_timeout = data->timeout_ns / 1000 +
                data->timeout_clks / host->clock;
@@ -443,11 +446,11 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
 {
        u16 mode;
 
-       WARN_ON(host->data);
-
        if (data == NULL)
                return;
 
+       WARN_ON(!host->data);
+
        mode = SDHCI_TRNS_BLK_CNT_EN;
        if (data->blocks > 1)
                mode |= SDHCI_TRNS_MULTI;
@@ -477,8 +480,8 @@ static void sdhci_finish_data(struct sdhci_host *host)
        /*
         * Controller doesn't count down when in single block mode.
         */
-       if ((data->blocks == 1) && (data->error == MMC_ERR_NONE))
-               blocks = 0;
+       if (data->blocks == 1)
+               blocks = (data->error == MMC_ERR_NONE) ? 0 : 1;
        else
                blocks = readw(host->ioaddr + SDHCI_BLOCK_COUNT);
        data->bytes_xfered = data->blksz * (data->blocks - blocks);
@@ -600,9 +603,10 @@ static void sdhci_finish_command(struct sdhci_host *host)
 
        host->cmd->error = MMC_ERR_NONE;
 
-       if (host->cmd->data)
-               host->data = host->cmd->data;
-       else
+       if (host->data && host->data_early)
+               sdhci_finish_data(host);
+
+       if (!host->cmd->data)
                tasklet_schedule(&host->finish_tasklet);
 
        host->cmd = NULL;
@@ -929,9 +933,9 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
        BUG_ON(intmask == 0);
 
        if (!host->cmd) {
-               printk(KERN_ERR "%s: Got command interrupt even though no "
-                       "command operation was in progress.\n",
-                       mmc_hostname(host->mmc));
+               printk(KERN_ERR "%s: Got command interrupt 0x%08x even "
+                       "though no command operation was in progress.\n",
+                       mmc_hostname(host->mmc), (unsigned)intmask);
                sdhci_dumpregs(host);
                return;
        }
@@ -961,9 +965,9 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
                if (intmask & SDHCI_INT_DATA_END)
                        return;
 
-               printk(KERN_ERR "%s: Got data interrupt even though no "
-                       "data operation was in progress.\n",
-                       mmc_hostname(host->mmc));
+               printk(KERN_ERR "%s: Got data interrupt 0x%08x even "
+                       "though no data operation was in progress.\n",
+                       mmc_hostname(host->mmc), (unsigned)intmask);
                sdhci_dumpregs(host);
 
                return;
@@ -991,8 +995,18 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
                        writel(readl(host->ioaddr + SDHCI_DMA_ADDRESS),
                                host->ioaddr + SDHCI_DMA_ADDRESS);
 
-               if (intmask & SDHCI_INT_DATA_END)
-                       sdhci_finish_data(host);
+               if (intmask & SDHCI_INT_DATA_END) {
+                       if (host->cmd) {
+                               /*
+                                * Data managed to finish before the
+                                * command completed. Make sure we do
+                                * things in the proper order.
+                                */
+                               host->data_early = 1;
+                       } else {
+                               sdhci_finish_data(host);
+                       }
+               }
        }
 }
 
@@ -1347,12 +1361,11 @@ static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot)
         */
        mmc->max_blk_size = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT;
        if (mmc->max_blk_size >= 3) {
-               printk(KERN_ERR "%s: Invalid maximum block size.\n",
+               printk(KERN_WARNING "%s: Invalid maximum block size, assuming 512\n",
                        host->slot_descr);
-               ret = -ENODEV;
-               goto unmap;
-       }
-       mmc->max_blk_size = 512 << mmc->max_blk_size;
+               mmc->max_blk_size = 512;
+       } else
+               mmc->max_blk_size = 512 << mmc->max_blk_size;
 
        /*
         * Maximum block count.
index d157776c11491d1f58d7c255acf8dd03d448a1f7..e28987d6d2ebf4f12d9ea180916d811571fc63e2 100644 (file)
@@ -182,6 +182,7 @@ struct sdhci_host {
        struct mmc_request      *mrq;           /* Current request */
        struct mmc_command      *cmd;           /* Current command */
        struct mmc_data         *data;          /* Current data request */
+       int                     data_early:1;   /* Data finished before cmd */
 
        struct scatterlist      *cur_sg;        /* We're working on this */
        int                     num_sg;         /* Entries left */
index 81ef81c9a5841904887b70a3d37470a624467fbf..5b9e17bf174940bbe7a12dd396811a2975e766e1 100644 (file)
@@ -1968,6 +1968,16 @@ menuconfig NETDEV_1000
        bool "Ethernet (1000 Mbit)"
        depends on !UML
        default y
+       ---help---
+         Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
+         type of Local Area Network (LAN) in universities and companies.
+
+         Say Y here to get to see options for Gigabit Ethernet drivers.
+         This option alone does not add any kernel code.
+         Note that drivers supporting both 100 and 1000 MBit may be listed
+         under "Ethernet (10 or 100MBit)" instead.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if NETDEV_1000
 
@@ -2339,6 +2349,11 @@ menuconfig NETDEV_10000
        bool "Ethernet (10000 Mbit)"
        depends on !UML
        default y
+       ---help---
+         Say Y here to get to see options for 10 Gigabit Ethernet drivers.
+         This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
 
 if NETDEV_10000
 
index 69f5f365239a2ec261052c851b5a4387a51bfbe1..10f4e3b551685f4f55fae0bc778993d59da5c7f0 100644 (file)
@@ -3068,8 +3068,8 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
                                np->nic_poll_irq = np->irqmask;
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
                        spin_unlock(&np->lock);
+                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
                        break;
                }
 
@@ -3186,8 +3186,8 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
                                np->nic_poll_irq = np->irqmask;
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
                        spin_unlock(&np->lock);
+                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
                        break;
                }
 
@@ -3233,8 +3233,8 @@ static irqreturn_t nv_nic_irq_tx(int foo, void *data)
                                np->nic_poll_irq |= NVREG_IRQ_TX_ALL;
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_tx.\n", dev->name, i);
                        spin_unlock_irqrestore(&np->lock, flags);
+                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_tx.\n", dev->name, i);
                        break;
                }
 
@@ -3348,8 +3348,8 @@ static irqreturn_t nv_nic_irq_rx(int foo, void *data)
                                np->nic_poll_irq |= NVREG_IRQ_RX_ALL;
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_rx.\n", dev->name, i);
                        spin_unlock_irqrestore(&np->lock, flags);
+                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_rx.\n", dev->name, i);
                        break;
                }
        }
@@ -3421,8 +3421,8 @@ static irqreturn_t nv_nic_irq_other(int foo, void *data)
                                np->nic_poll_irq |= NVREG_IRQ_OTHER;
                                mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
                        }
-                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_other.\n", dev->name, i);
                        spin_unlock_irqrestore(&np->lock, flags);
+                       printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_other.\n", dev->name, i);
                        break;
                }
 
index e4dfd4b11a4a2f41616a7aecd199f91227e84e61..e199715fabd0947d6014a9b068bd583aa3745eb6 100644 (file)
@@ -119,6 +119,9 @@ int mlx4_reset(struct mlx4_dev *dev)
        writel(MLX4_RESET_VALUE, reset + MLX4_RESET_OFFSET);
        iounmap(reset);
 
+       /* Docs say to wait one second before accessing device */
+       msleep(1000);
+
        end = jiffies + MLX4_RESET_TIMEOUT_JIFFIES;
        do {
                if (!pci_read_config_word(dev->pdev, PCI_VENDOR_ID, &vendor) &&
index ef3325b692335312f176aa3a86275ffcc5e6bad7..9293c82ef2af24a9e85a7fc6f0d26fc215797f1b 100644 (file)
@@ -1726,7 +1726,7 @@ ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb)
                }
                /* the decompressor still expects the A/C bytes in the hdr */
                len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2,
-                               skb->len + 2, ns->data, ppp->mru + PPP_HDRLEN);
+                               skb->len + 2, ns->data, obuff_size);
                if (len < 0) {
                        /* Pass the compressed frame to pppd as an
                           error indication. */
index e7a2eadcc3b0c8030f782292af7adbbe4db61f99..757592436390780057902bcd91ddc264eeeeafd6 100644 (file)
@@ -696,8 +696,8 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
        int i;
        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);
+       sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET);
+       sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR);
 
        sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR);
 
index 79ff6b4de3a61ea9f9b21262074625c49c563d52..37d72f123a80f65d05c703446b7f353aa55d8844 100644 (file)
@@ -1746,10 +1746,8 @@ static void pushbutton_helper_thread(unsigned long data)
 static int event_thread(void* data)
 {
        struct controller *ctrl;
-       lock_kernel();
+
        daemonize("phpd_event");
-       
-       unlock_kernel();
 
        while (1) {
                dbg("!!!!event_thread sleeping\n");
index c6e132d7c0f7eceba58069531a9fddd8ac20ba03..4c36e80f6d26b26f590a45bfa1551c53440d0b4a 100644 (file)
@@ -5,12 +5,7 @@ extern int pci_uevent(struct device *dev, char **envp, int num_envp,
 extern int pci_create_sysfs_dev_files(struct pci_dev *pdev);
 extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
 extern void pci_cleanup_rom(struct pci_dev *dev);
-extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
-                                 resource_size_t size, resource_size_t align,
-                                 resource_size_t min, unsigned int type_mask,
-                                 void (*alignf)(void *, struct resource *,
-                                             resource_size_t, resource_size_t),
-                                 void *alignf_data);
+
 /* Firmware callbacks */
 extern pci_power_t (*platform_pci_choose_state)(struct pci_dev *dev, pm_message_t state);
 extern int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t state);
@@ -35,7 +30,6 @@ static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; }
 
 /* Functions for PCI Hotplug drivers to use */
 extern unsigned int pci_do_scan_bus(struct pci_bus *bus);
-extern int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap);
 
 extern void pci_remove_legacy_files(struct pci_bus *bus);
 
index 34b8dae0d90fd18455be3ff9aa471de8de585608..27e00b2d7b5b069a0a1c25483e7b2e6a4eca05a8 100644 (file)
@@ -653,20 +653,20 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass
 
        sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number);
 
+       /* Has only triggered on CardBus, fixup is in yenta_socket */
        while (bus->parent) {
                if ((child->subordinate > bus->subordinate) ||
                    (child->number > bus->subordinate) ||
                    (child->number < bus->number) ||
                    (child->subordinate < bus->number)) {
-                       printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) is "
-                              "hidden behind%s bridge #%02x (-#%02x)%s\n",
-                              child->number, child->subordinate,
-                              bus->self->transparent ? " transparent" : " ",
-                              bus->number, bus->subordinate,
-                              pcibios_assign_all_busses() ? " " :
-                              " (try 'pci=assign-busses')");
-                       printk(KERN_WARNING "Please report the result to "
-                              "<bk@suse.de> to fix this permanently\n");
+                       pr_debug("PCI: Bus #%02x (-#%02x) is %s"
+                               "hidden behind%s bridge #%02x (-#%02x)\n",
+                               child->number, child->subordinate,
+                               (bus->number > child->subordinate &&
+                                bus->subordinate < child->number) ?
+                                       "wholly " : " partially",
+                               bus->self->transparent ? " transparent" : " ",
+                               bus->number, bus->subordinate);
                }
                bus = bus->parent;
        }
index c559085c89a50f2c0ee909191c2ef0b0ea549f66..2d40f437b9fc14424b5c50dcf13983a466703d11 100644 (file)
@@ -947,7 +947,7 @@ static void k8t_sound_hostbridge(struct pci_dev *dev)
        unsigned char val;
 
        pci_read_config_byte(dev, 0x50, &val);
-       if (val == 0x88 || val == 0xc8) {
+       if (val == 0xc8) {
                /* Assume it's probably a MSI-K8T-Neo2Fir */
                printk(KERN_INFO "PCI: MSI-K8T-Neo2Fir, attempting to turn soundcard ON\n");
                pci_write_config_byte(dev, 0x50, val & (~0x40));
@@ -1485,7 +1485,7 @@ static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
 
        iounmap(csr);
 }
-DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
 
 static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
 {
@@ -1650,6 +1650,9 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCN
 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_ATI, PCI_DEVICE_ID_ATI_RD580, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RX790, quirk_disable_all_msi);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS690, 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 */
index 80c4a8463065b1826273a7dd0d1d32de2b465b98..1cb33cac12377095fc075e07e4341306dcda4bcc 100644 (file)
@@ -892,7 +892,7 @@ static int m41t80_remove(struct i2c_client *client)
 
 static struct i2c_driver m41t80_driver = {
        .driver = {
-               .name = "m41t80",
+               .name = "rtc-m41t80",
        },
        .probe = m41t80_probe,
        .remove = m41t80_remove,
index d9417072807506771280912c887d5c8c9da27877..3e183cfee10f134dabe5ffe6db57e9f65d257f45 100644 (file)
@@ -13,7 +13,7 @@
  *
  * 24-May-2006: Raphael Assenat <raph@8d.com>
  *                - Major rework
- *                             Converted to rtc_device and uses the SPI layer.
+ *                             Converted to rtc_device and uses the SPI layer.
  *
  * ??-???-2005: Someone at Compulab
  *                - Initial driver creation.
@@ -259,11 +259,11 @@ static int __devexit max6902_remove(struct spi_device *spi)
 
 static struct spi_driver max6902_driver = {
        .driver = {
-               .name   = "max6902",
+               .name   = "rtc-max6902",
                .bus    = &spi_bus_type,
                .owner  = THIS_MODULE,
        },
-       .probe  = max6902_probe,
+       .probe  = max6902_probe,
        .remove = __devexit_p(max6902_remove),
 };
 
index eccac1c3b71bb86ef535300a21c4311ebce343a9..d32c60dbdd82632e016eabdc3cdcf3e5eba7f778 100644 (file)
@@ -24,6 +24,7 @@
 #include <asm/s390_ext.h>
 #include <asm/todclk.h>
 #include <asm/vtoc.h>
+#include <asm/diag.h>
 
 #include "dasd_int.h"
 #include "dasd_diag.h"
index 4f2f81b16cfa277dfebd324513a60cdf400d3c1e..2edd5fb6d3dc1e8a4894e0ff5c8557ccdf2de838 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
 #include <asm/ebcdic.h>
+#include <asm/diag.h>
 
 #include "raw3270.h"
 
index 04b19bdc09da501191e7f0685a46e860f1a45b0e..d70a6e65bf14fdf314dae599450d55c85e815b23 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/cio.h>
 #include <asm/ccwdev.h>
 #include <asm/debug.h>
+#include <asm/diag.h>
 
 #include "vmur.h"
 
@@ -68,8 +69,26 @@ static struct ccw_driver ur_driver = {
        .set_offline    = ur_set_offline,
 };
 
+static DEFINE_MUTEX(vmur_mutex);
+
 /*
  * Allocation, freeing, getting and putting of urdev structures
+ *
+ * Each ur device (urd) contains a reference to its corresponding ccw device
+ * (cdev) using the urd->cdev pointer. Each ccw device has a reference to the
+ * ur device using the cdev->dev.driver_data pointer.
+ *
+ * urd references:
+ * - ur_probe gets a urd reference, ur_remove drops the reference
+ *   (cdev->dev.driver_data)
+ * - ur_open gets a urd reference, ur_relase drops the reference
+ *   (urf->urd)
+ *
+ * cdev references:
+ * - urdev_alloc get a cdev reference (urd->cdev)
+ * - urdev_free drops the cdev reference (urd->cdev)
+ *
+ * Setting and clearing of cdev->dev.driver_data is protected by the ccwdev lock
  */
 static struct urdev *urdev_alloc(struct ccw_device *cdev)
 {
@@ -78,42 +97,61 @@ static struct urdev *urdev_alloc(struct ccw_device *cdev)
        urd = kzalloc(sizeof(struct urdev), GFP_KERNEL);
        if (!urd)
                return NULL;
-       urd->cdev = cdev;
        urd->reclen = cdev->id.driver_info;
        ccw_device_get_id(cdev, &urd->dev_id);
        mutex_init(&urd->io_mutex);
        mutex_init(&urd->open_mutex);
+       atomic_set(&urd->ref_count,  1);
+       urd->cdev = cdev;
+       get_device(&cdev->dev);
        return urd;
 }
 
 static void urdev_free(struct urdev *urd)
 {
+       TRACE("urdev_free: %p\n", urd);
+       if (urd->cdev)
+               put_device(&urd->cdev->dev);
        kfree(urd);
 }
 
-/*
- * This is how the character device driver gets a reference to a
- * ur device. When this call returns successfully, a reference has
- * been taken (by get_device) on the underlying kobject. The recipient
- * of this urdev pointer must eventually drop it with urdev_put(urd)
- * which does the corresponding put_device().
- */
+static void urdev_get(struct urdev *urd)
+{
+       atomic_inc(&urd->ref_count);
+}
+
+static struct urdev *urdev_get_from_cdev(struct ccw_device *cdev)
+{
+       struct urdev *urd;
+       unsigned long flags;
+
+       spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+       urd = cdev->dev.driver_data;
+       if (urd)
+               urdev_get(urd);
+       spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+       return urd;
+}
+
 static struct urdev *urdev_get_from_devno(u16 devno)
 {
        char bus_id[16];
        struct ccw_device *cdev;
+       struct urdev *urd;
 
        sprintf(bus_id, "0.0.%04x", devno);
        cdev = get_ccwdev_by_busid(&ur_driver, bus_id);
        if (!cdev)
                return NULL;
-
-       return cdev->dev.driver_data;
+       urd = urdev_get_from_cdev(cdev);
+       put_device(&cdev->dev);
+       return urd;
 }
 
 static void urdev_put(struct urdev *urd)
 {
-       put_device(&urd->cdev->dev);
+       if (atomic_dec_and_test(&urd->ref_count))
+               urdev_free(urd);
 }
 
 /*
@@ -245,6 +283,7 @@ static void ur_int_handler(struct ccw_device *cdev, unsigned long intparm,
                return;
        }
        urd = cdev->dev.driver_data;
+       BUG_ON(!urd);
        /* On special conditions irb is an error pointer */
        if (IS_ERR(irb))
                urd->io_request_rc = PTR_ERR(irb);
@@ -262,9 +301,15 @@ static void ur_int_handler(struct ccw_device *cdev, unsigned long intparm,
 static ssize_t ur_attr_reclen_show(struct device *dev,
                                   struct device_attribute *attr, char *buf)
 {
-       struct urdev *urd = dev->driver_data;
+       struct urdev *urd;
+       int rc;
 
-       return sprintf(buf, "%zu\n", urd->reclen);
+       urd = urdev_get_from_cdev(to_ccwdev(dev));
+       if (!urd)
+               return -ENODEV;
+       rc = sprintf(buf, "%zu\n", urd->reclen);
+       urdev_put(urd);
+       return rc;
 }
 
 static DEVICE_ATTR(reclen, 0444, ur_attr_reclen_show, NULL);
@@ -379,31 +424,6 @@ static ssize_t ur_write(struct file *file, const char __user *udata,
        return do_write(urf->urd, udata, count, urf->dev_reclen, ppos);
 }
 
-static int do_diag_14(unsigned long rx, unsigned long ry1,
-                     unsigned long subcode)
-{
-       register unsigned long _ry1 asm("2") = ry1;
-       register unsigned long _ry2 asm("3") = subcode;
-       int rc = 0;
-
-       asm volatile(
-#ifdef CONFIG_64BIT
-               "   sam31\n"
-               "   diag    %2,2,0x14\n"
-               "   sam64\n"
-#else
-               "   diag    %2,2,0x14\n"
-#endif
-               "   ipm     %0\n"
-               "   srl     %0,28\n"
-               : "=d" (rc), "+d" (_ry2)
-               : "d" (rx), "d" (_ry1)
-               : "cc");
-
-       TRACE("diag 14: subcode=0x%lx, cc=%i\n", subcode, rc);
-       return rc;
-}
-
 /*
  * diagnose code 0x14 subcode 0x0028 - position spool file to designated
  *                                    record
@@ -415,7 +435,7 @@ static int diag_position_to_record(int devno, int record)
 {
        int cc;
 
-       cc = do_diag_14(record, devno, 0x28);
+       cc = diag14(record, devno, 0x28);
        switch (cc) {
        case 0:
                return 0;
@@ -440,7 +460,7 @@ static int diag_read_file(int devno, char *buf)
 {
        int cc;
 
-       cc = do_diag_14((unsigned long) buf, devno, 0x00);
+       cc = diag14((unsigned long) buf, devno, 0x00);
        switch (cc) {
        case 0:
                return 0;
@@ -533,7 +553,7 @@ static int diag_read_next_file_info(struct file_control_block *buf, int spid)
 {
        int cc;
 
-       cc = do_diag_14((unsigned long) buf, spid, 0xfff);
+       cc = diag14((unsigned long) buf, spid, 0xfff);
        switch (cc) {
        case 0:
                return 0;
@@ -750,64 +770,63 @@ static struct file_operations ur_fops = {
 
 /*
  * ccw_device infrastructure:
- *     ur_probe gets its own ref to the device (i.e. get_device),
- *     creates the struct urdev, the device attributes, sets up
- *     the interrupt handler and validates the virtual unit record device.
- *     ur_remove removes the device attributes, frees the struct urdev
- *     and drops (put_device) the ref to the device we got in ur_probe.
+ *     ur_probe creates the struct urdev (with refcount = 1), the device
+ *     attributes, sets up the interrupt handler and validates the virtual
+ *     unit record device.
+ *     ur_remove removes the device attributes and drops the reference to
+ *     struct urdev.
+ *
+ *     ur_probe, ur_remove, ur_set_online and ur_set_offline are serialized
+ *     by the vmur_mutex lock.
+ *
+ *     urd->char_device is used as indication that the online function has
+ *     been completed successfully.
  */
 static int ur_probe(struct ccw_device *cdev)
 {
        struct urdev *urd;
        int rc;
 
-       TRACE("ur_probe: cdev=%p state=%d\n", cdev, *(int *) cdev->private);
-
-       if (!get_device(&cdev->dev))
-               return -ENODEV;
+       TRACE("ur_probe: cdev=%p\n", cdev);
 
+       mutex_lock(&vmur_mutex);
        urd = urdev_alloc(cdev);
        if (!urd) {
                rc = -ENOMEM;
-               goto fail;
+               goto fail_unlock;
        }
+
        rc = ur_create_attributes(&cdev->dev);
        if (rc) {
                rc = -ENOMEM;
-               goto fail;
+               goto fail_urdev_put;
        }
-       cdev->dev.driver_data = urd;
        cdev->handler = ur_int_handler;
 
        /* validate virtual unit record device */
        urd->class = get_urd_class(urd);
        if (urd->class < 0) {
                rc = urd->class;
-               goto fail;
+               goto fail_remove_attr;
        }
        if ((urd->class != DEV_CLASS_UR_I) && (urd->class != DEV_CLASS_UR_O)) {
                rc = -ENOTSUPP;
-               goto fail;
+               goto fail_remove_attr;
        }
+       spin_lock_irq(get_ccwdev_lock(cdev));
+       cdev->dev.driver_data = urd;
+       spin_unlock_irq(get_ccwdev_lock(cdev));
 
+       mutex_unlock(&vmur_mutex);
        return 0;
 
-fail:
-       urdev_free(urd);
-       put_device(&cdev->dev);
-       return rc;
-}
-
-static void ur_remove(struct ccw_device *cdev)
-{
-       struct urdev *urd = cdev->dev.driver_data;
-
-       TRACE("ur_remove\n");
-       if (cdev->online)
-               ur_set_offline(cdev);
+fail_remove_attr:
        ur_remove_attributes(&cdev->dev);
-       urdev_free(urd);
-       put_device(&cdev->dev);
+fail_urdev_put:
+       urdev_put(urd);
+fail_unlock:
+       mutex_unlock(&vmur_mutex);
+       return rc;
 }
 
 static int ur_set_online(struct ccw_device *cdev)
@@ -816,20 +835,29 @@ static int ur_set_online(struct ccw_device *cdev)
        int minor, major, rc;
        char node_id[16];
 
-       TRACE("ur_set_online: cdev=%p state=%d\n", cdev,
-             *(int *) cdev->private);
+       TRACE("ur_set_online: cdev=%p\n", cdev);
 
-       if (!try_module_get(ur_driver.owner))
-               return -EINVAL;
+       mutex_lock(&vmur_mutex);
+       urd = urdev_get_from_cdev(cdev);
+       if (!urd) {
+               /* ur_remove already deleted our urd */
+               rc = -ENODEV;
+               goto fail_unlock;
+       }
+
+       if (urd->char_device) {
+               /* Another ur_set_online was faster */
+               rc = -EBUSY;
+               goto fail_urdev_put;
+       }
 
-       urd = (struct urdev *) cdev->dev.driver_data;
        minor = urd->dev_id.devno;
        major = MAJOR(ur_first_dev_maj_min);
 
        urd->char_device = cdev_alloc();
        if (!urd->char_device) {
                rc = -ENOMEM;
-               goto fail_module_put;
+               goto fail_urdev_put;
        }
 
        cdev_init(urd->char_device, &ur_fops);
@@ -858,29 +886,79 @@ static int ur_set_online(struct ccw_device *cdev)
                TRACE("ur_set_online: device_create rc=%d\n", rc);
                goto fail_free_cdev;
        }
-
+       urdev_put(urd);
+       mutex_unlock(&vmur_mutex);
        return 0;
 
 fail_free_cdev:
        cdev_del(urd->char_device);
-fail_module_put:
-       module_put(ur_driver.owner);
-
+       urd->char_device = NULL;
+fail_urdev_put:
+       urdev_put(urd);
+fail_unlock:
+       mutex_unlock(&vmur_mutex);
        return rc;
 }
 
-static int ur_set_offline(struct ccw_device *cdev)
+static int ur_set_offline_force(struct ccw_device *cdev, int force)
 {
        struct urdev *urd;
+       int rc;
 
-       TRACE("ur_set_offline: cdev=%p cdev->private=%p state=%d\n",
-               cdev, cdev->private, *(int *) cdev->private);
-       urd = (struct urdev *) cdev->dev.driver_data;
+       TRACE("ur_set_offline: cdev=%p\n", cdev);
+       urd = urdev_get_from_cdev(cdev);
+       if (!urd)
+               /* ur_remove already deleted our urd */
+               return -ENODEV;
+       if (!urd->char_device) {
+               /* Another ur_set_offline was faster */
+               rc = -EBUSY;
+               goto fail_urdev_put;
+       }
+       if (!force && (atomic_read(&urd->ref_count) > 2)) {
+               /* There is still a user of urd (e.g. ur_open) */
+               TRACE("ur_set_offline: BUSY\n");
+               rc = -EBUSY;
+               goto fail_urdev_put;
+       }
        device_destroy(vmur_class, urd->char_device->dev);
        cdev_del(urd->char_device);
-       module_put(ur_driver.owner);
+       urd->char_device = NULL;
+       rc = 0;
 
-       return 0;
+fail_urdev_put:
+       urdev_put(urd);
+       return rc;
+}
+
+static int ur_set_offline(struct ccw_device *cdev)
+{
+       int rc;
+
+       mutex_lock(&vmur_mutex);
+       rc = ur_set_offline_force(cdev, 0);
+       mutex_unlock(&vmur_mutex);
+       return rc;
+}
+
+static void ur_remove(struct ccw_device *cdev)
+{
+       unsigned long flags;
+
+       TRACE("ur_remove\n");
+
+       mutex_lock(&vmur_mutex);
+
+       if (cdev->online)
+               ur_set_offline_force(cdev, 1);
+       ur_remove_attributes(&cdev->dev);
+
+       spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
+       urdev_put(cdev->dev.driver_data);
+       cdev->dev.driver_data = NULL;
+       spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags);
+
+       mutex_unlock(&vmur_mutex);
 }
 
 /*
index 2b3c564e04728f133d527a2d95a94ddbacd3fb7c..fa959644735a7495451a3ea3dedaf920097033c3 100644 (file)
@@ -70,6 +70,7 @@ struct urdev {
        size_t reclen;                  /* Record length for *write* CCWs */
        int class;                      /* VM device class */
        int io_request_rc;              /* return code from I/O request */
+       atomic_t ref_count;             /* reference counter */
 };
 
 /*
index 02fd00b55e1b0cb50ecb617114e8d927052c4f58..34a796913b0604a787630beae9be87952982a8dc 100644 (file)
@@ -594,6 +594,9 @@ alloc_cmb (struct ccw_device *cdev)
                        free_pages((unsigned long)mem, get_order(size));
                } else if (!mem) {
                        /* no luck */
+                       printk(KERN_WARNING "cio: failed to allocate area "
+                              "for measuring %d subchannels\n",
+                              cmb_area.num_channels);
                        ret = -ENOMEM;
                        goto out;
                } else {
@@ -1279,13 +1282,6 @@ init_cmf(void)
        case CMF_BASIC:
                format_string = "basic";
                cmbops = &cmbops_basic;
-               if (cmb_area.num_channels > 4096 || cmb_area.num_channels < 1) {
-                       printk(KERN_ERR "cio: Basic channel measurement "
-                              "facility can only use 1 to 4096 devices\n"
-                              KERN_ERR "when the cmf driver is built"
-                              " as a loadable module\n");
-                       return 1;
-               }
                break;
        case CMF_EXTENDED:
                format_string = "extended";
index 297659fa0e26c80bd077092a12909b559f233f3e..e44d92eac8e9e8f80fb0f4c57f05b096bb3c494d 100644 (file)
@@ -117,7 +117,10 @@ static int ccw_uevent(struct device *dev, char **envp, int num_envp,
        snprint_alias(modalias_buf, sizeof(modalias_buf), id, "");
        ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len,
                             "MODALIAS=%s", modalias_buf);
-       return ret;
+       if (ret)
+               return ret;
+       envp[i] = NULL;
+       return 0;
 }
 
 struct bus_type ccw_bus_type;
index 60b9347f7c92da99dea4e5fd9687014b694d3bde..f232832f2b22314e142d953c56ffc645e5dc205c 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/delay.h>
 #include <asm/cio.h>
 #include <asm/lowcore.h>
+#include <asm/diag.h>
 
 #include "cio.h"
 #include "cio_debug.h"
 #include "device.h"
 #include "ioasm.h"
 
-/*
- * diag210 is used under VM to get information about a virtual device
- */
-int
-diag210(struct diag210 * addr)
-{
-       /*
-        * diag 210 needs its data below the 2GB border, so we
-        * use a static data area to be sure
-        */
-       static struct diag210 diag210_tmp;
-       static DEFINE_SPINLOCK(diag210_lock);
-       unsigned long flags;
-       int ccode;
-
-       spin_lock_irqsave(&diag210_lock, flags);
-       diag210_tmp = *addr;
-
-#ifdef CONFIG_64BIT
-       asm volatile(
-               "       lhi     %0,-1\n"
-               "       sam31\n"
-               "       diag    %1,0,0x210\n"
-               "0:     ipm     %0\n"
-               "       srl     %0,28\n"
-               "1:     sam64\n"
-               EX_TABLE(0b,1b)
-               : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
-#else
-       asm volatile(
-               "       lhi     %0,-1\n"
-               "       diag    %1,0,0x210\n"
-               "0:     ipm     %0\n"
-               "       srl     %0,28\n"
-               "1:\n"
-               EX_TABLE(0b,1b)
-               : "=&d" (ccode) : "a" (&diag210_tmp) : "cc", "memory");
-#endif
-
-       *addr = diag210_tmp;
-       spin_unlock_irqrestore(&diag210_lock, flags);
-
-       return ccode;
-}
-
 /*
  * Input :
  *   devno - device number
@@ -349,5 +305,3 @@ ccw_device_sense_id_irq(struct ccw_device *cdev, enum dev_event dev_event)
                break;
        }
 }
-
-EXPORT_SYMBOL(diag210);
index 03347aed2b3e65b523486dccbc11a15054e7ab0b..d8d479876ec7ad7de402ada7cb8cf079cd1a0583 100644 (file)
@@ -195,6 +195,8 @@ qdio_do_eqbs(struct qdio_q *q, unsigned char *state,
 again:
        ccq = do_eqbs(irq->sch_token, state, q_no, start, cnt);
        rc = qdio_check_ccq(q, ccq);
+       if ((ccq == 96) && (tmp_cnt != *cnt))
+               rc = 0;
        if (rc == 1) {
                QDIO_DBF_TEXT5(1,trace,"eqAGAIN");
                goto again;
@@ -740,7 +742,8 @@ qdio_get_outbound_buffer_frontier(struct qdio_q *q)
        first_not_to_check=f+qdio_min(atomic_read(&q->number_of_buffers_used),
                                      (QDIO_MAX_BUFFERS_PER_Q-1));
 
-       if ((!q->is_iqdio_q)&&(!q->hydra_gives_outbound_pcis))
+       if (((!q->is_iqdio_q) && (!q->hydra_gives_outbound_pcis)) ||
+                (q->queue_type == QDIO_IQDIO_QFMT_ASYNCH))
                SYNC_MEMORY;
 
 check_next:
index d2b3898b750a2ba1d2c1452d09deec3c31c7cf54..6f2c71ef47eee062990b76641128361c840f2b85 100644 (file)
@@ -367,6 +367,7 @@ config SCSI_3W_9XXX
 config SCSI_7000FASST
        tristate "7000FASST SCSI support"
        depends on ISA && SCSI && ISA_DMA_API
+       select CHECK_SIGNATURE
        help
          This driver supports the Western Digital 7000 SCSI host adapter
          family.  Some information is in the source:
@@ -388,6 +389,7 @@ config SCSI_AHA152X
        tristate "Adaptec AHA152X/2825 support"
        depends on ISA && SCSI && !64BIT
        select SCSI_SPI_ATTRS
+       select CHECK_SIGNATURE
        ---help---
          This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
          SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
@@ -583,6 +585,7 @@ config SCSI_DTC3280
        tristate "DTC3180/3280 SCSI support"
        depends on ISA && SCSI
        select SCSI_SPI_ATTRS
+       select CHECK_SIGNATURE
        help
          This is support for DTC 3180/3280 SCSI Host Adapters.  Please read
          the SCSI-HOWTO, available from
@@ -657,6 +660,7 @@ config SCSI_EATA_PIO
 config SCSI_FUTURE_DOMAIN
        tristate "Future Domain 16xx SCSI/AHA-2920A support"
        depends on (ISA || PCI) && SCSI
+       select CHECK_SIGNATURE
        ---help---
          This is support for Future Domain's 16-bit SCSI host adapters
          (TMC-1660/1680, TMC-1650/1670, TMC-3260, TMC-1610M/MER/MEX) and
@@ -1324,6 +1328,7 @@ config SCSI_LPFC
 config SCSI_SEAGATE
        tristate "Seagate ST-02 and Future Domain TMC-8xx SCSI support"
        depends on X86 && ISA && SCSI
+       select CHECK_SIGNATURE
        ---help---
          These are 8-bit SCSI controllers; the ST-01 is also supported by
          this driver.  It is explained in section 3.9 of the SCSI-HOWTO,
@@ -1397,6 +1402,7 @@ config SCSI_T128
        tristate "Trantor T128/T128F/T228 SCSI support"
        depends on ISA && SCSI
        select SCSI_SPI_ATTRS
+       select CHECK_SIGNATURE
        ---help---
          This is support for a SCSI host adapter. It is explained in section
          3.11 of the SCSI-HOWTO, available from
@@ -1561,7 +1567,7 @@ config A3000_SCSI
          built-in SCSI controller, say Y. Otherwise, say N.
 
          To compile this driver as a module, choose M here: the
-         module will be called wd33c93.
+         module will be called a3000.
 
 config A2091_SCSI
        tristate "A2091/A590 WD33C93A support"
@@ -1571,7 +1577,7 @@ config A2091_SCSI
          say N.
 
          To compile this driver as a module, choose M here: the
-         module will be called wd33c93.
+         module will be called a2091.
 
 config GVP11_SCSI
        tristate "GVP Series II WD33C93A support"
index 301313002f6b3abc0d1fa67c1ec59d11c8c7ffab..f94109cbb46e683a6a6f7d2fee29d7915b21cc93 100644 (file)
@@ -129,7 +129,16 @@ struct uart_8250_port {
        unsigned char           mcr;
        unsigned char           mcr_mask;       /* mask of user bits */
        unsigned char           mcr_force;      /* mask of forced bits */
-       unsigned char           lsr_break_flag;
+
+       /*
+        * Some bits in registers are cleared on a read, so they must
+        * be saved whenever the register is read but the bits will not
+        * be immediately processed.
+        */
+#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
+       unsigned char           lsr_saved_flags;
+#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
+       unsigned char           msr_saved_flags;
 
        /*
         * We provide a per-port pm hook.
@@ -1238,6 +1247,7 @@ static void serial8250_start_tx(struct uart_port *port)
                if (up->bugs & UART_BUG_TXEN) {
                        unsigned char lsr, iir;
                        lsr = serial_in(up, UART_LSR);
+                       up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
                        iir = serial_in(up, UART_IIR) & 0x0f;
                        if ((up->port.type == PORT_RM9000) ?
                                (lsr & UART_LSR_THRE &&
@@ -1290,18 +1300,10 @@ receive_chars(struct uart_8250_port *up, unsigned int *status)
                flag = TTY_NORMAL;
                up->port.icount.rx++;
 
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-               /*
-                * Recover the break flag from console xmit
-                */
-               if (up->port.line == up->port.cons->index) {
-                       lsr |= up->lsr_break_flag;
-                       up->lsr_break_flag = 0;
-               }
-#endif
+               lsr |= up->lsr_saved_flags;
+               up->lsr_saved_flags = 0;
 
-               if (unlikely(lsr & (UART_LSR_BI | UART_LSR_PE |
-                                   UART_LSR_FE | UART_LSR_OE))) {
+               if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
                        /*
                         * For statistics only
                         */
@@ -1392,6 +1394,8 @@ static unsigned int check_modem_status(struct uart_8250_port *up)
 {
        unsigned int status = serial_in(up, UART_MSR);
 
+       status |= up->msr_saved_flags;
+       up->msr_saved_flags = 0;
        if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
            up->port.info != NULL) {
                if (status & UART_MSR_TERI)
@@ -1591,7 +1595,8 @@ static void serial8250_timeout(unsigned long data)
 static void serial8250_backup_timeout(unsigned long data)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)data;
-       unsigned int iir, ier = 0;
+       unsigned int iir, ier = 0, lsr;
+       unsigned long flags;
 
        /*
         * Must disable interrupts or else we risk racing with the interrupt
@@ -1610,9 +1615,13 @@ static void serial8250_backup_timeout(unsigned long data)
         * the "Diva" UART used on the management processor on many HP
         * ia64 and parisc boxes.
         */
+       spin_lock_irqsave(&up->port.lock, flags);
+       lsr = serial_in(up, UART_LSR);
+       up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
+       spin_unlock_irqrestore(&up->port.lock, flags);
        if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
            (!uart_circ_empty(&up->port.info->xmit) || up->port.x_char) &&
-           (serial_in(up, UART_LSR) & UART_LSR_THRE)) {
+           (lsr & UART_LSR_THRE)) {
                iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
                iir |= UART_IIR_THRI;
        }
@@ -1631,13 +1640,14 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
        unsigned long flags;
-       unsigned int ret;
+       unsigned int lsr;
 
        spin_lock_irqsave(&up->port.lock, flags);
-       ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
+       lsr = serial_in(up, UART_LSR);
+       up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
        spin_unlock_irqrestore(&up->port.lock, flags);
 
-       return ret;
+       return lsr & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
 }
 
 static unsigned int serial8250_get_mctrl(struct uart_port *port)
@@ -1708,8 +1718,7 @@ static inline void wait_for_xmitr(struct uart_8250_port *up, int bits)
        do {
                status = serial_in(up, UART_LSR);
 
-               if (status & UART_LSR_BI)
-                       up->lsr_break_flag = UART_LSR_BI;
+               up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
 
                if (--tmout == 0)
                        break;
@@ -1718,8 +1727,12 @@ static inline void wait_for_xmitr(struct uart_8250_port *up, int bits)
 
        /* Wait up to 1s for flow control if necessary */
        if (up->port.flags & UPF_CONS_FLOW) {
-               tmout = 1000000;
-               while (!(serial_in(up, UART_MSR) & UART_MSR_CTS) && --tmout) {
+               unsigned int tmout;
+               for (tmout = 1000000; tmout; tmout--) {
+                       unsigned int msr = serial_in(up, UART_MSR);
+                       up->msr_saved_flags |= msr & MSR_SAVE_FLAGS;
+                       if (msr & UART_MSR_CTS)
+                               break;
                        udelay(1);
                        touch_nmi_watchdog();
                }
@@ -1888,6 +1901,18 @@ static int serial8250_startup(struct uart_port *port)
 
        spin_unlock_irqrestore(&up->port.lock, flags);
 
+       /*
+        * Clear the interrupt registers again for luck, and clear the
+        * saved flags to avoid getting false values from polling
+        * routines or the previous session.
+        */
+       serial_inp(up, UART_LSR);
+       serial_inp(up, UART_RX);
+       serial_inp(up, UART_IIR);
+       serial_inp(up, UART_MSR);
+       up->lsr_saved_flags = 0;
+       up->msr_saved_flags = 0;
+
        /*
         * Finally, enable interrupts.  Note: Modem status interrupts
         * are set via set_termios(), which will be occurring imminently
@@ -1906,14 +1931,6 @@ static int serial8250_startup(struct uart_port *port)
                (void) inb_p(icp);
        }
 
-       /*
-        * And clear the interrupt registers again for luck.
-        */
-       (void) serial_inp(up, UART_LSR);
-       (void) serial_inp(up, UART_RX);
-       (void) serial_inp(up, UART_IIR);
-       (void) serial_inp(up, UART_MSR);
-
        return 0;
 }
 
@@ -2484,6 +2501,16 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
        wait_for_xmitr(up, BOTH_EMPTY);
        serial_out(up, UART_IER, ier);
 
+       /*
+        *      The receive handling will happen properly because the
+        *      receive ready bit will still be set; it is not cleared
+        *      on read.  However, modem control will not, we must
+        *      call it if we have saved something in the saved flags
+        *      while processing with interrupts off.
+        */
+       if (up->msr_saved_flags)
+               check_modem_status(up);
+
        if (locked)
                spin_unlock(&up->port.lock);
        local_irq_restore(flags);
index 5e485876f54c740004457ee0f4bbb5a020e9c50d..bd66339f7a3f6578a3c008b39a8a7db6c4c0060b 100644 (file)
@@ -580,6 +580,138 @@ static int pci_netmos_init(struct pci_dev *dev)
        return num_serial;
 }
 
+/*
+ * ITE support by Niels de Vos <niels.devos@wincor-nixdorf.com>
+ *
+ * These chips are available with optionally one parallel port and up to
+ * two serial ports. Unfortunately they all have the same product id.
+ *
+ * Basic configuration is done over a region of 32 I/O ports. The base
+ * ioport is called INTA or INTC, depending on docs/other drivers.
+ *
+ * The region of the 32 I/O ports is configured in POSIO0R...
+ */
+
+/* registers */
+#define ITE_887x_MISCR         0x9c
+#define ITE_887x_INTCBAR       0x78
+#define ITE_887x_UARTBAR       0x7c
+#define ITE_887x_PS0BAR                0x10
+#define ITE_887x_POSIO0                0x60
+
+/* I/O space size */
+#define ITE_887x_IOSIZE                32
+/* I/O space size (bits 26-24; 8 bytes = 011b) */
+#define ITE_887x_POSIO_IOSIZE_8                (3 << 24)
+/* I/O space size (bits 26-24; 32 bytes = 101b) */
+#define ITE_887x_POSIO_IOSIZE_32       (5 << 24)
+/* Decoding speed (1 = slow, 2 = medium, 3 = fast) */
+#define ITE_887x_POSIO_SPEED           (3 << 29)
+/* enable IO_Space bit */
+#define ITE_887x_POSIO_ENABLE          (1 << 31)
+
+static int __devinit pci_ite887x_init(struct pci_dev *dev)
+{
+       /* inta_addr are the configuration addresses of the ITE */
+       static const short inta_addr[] = { 0x2a0, 0x2c0, 0x220, 0x240, 0x1e0,
+                                                       0x200, 0x280, 0 };
+       int ret, i, type;
+       struct resource *iobase = NULL;
+       u32 miscr, uartbar, ioport;
+
+       /* search for the base-ioport */
+       i = 0;
+       while (inta_addr[i] && iobase == NULL) {
+               iobase = request_region(inta_addr[i], ITE_887x_IOSIZE,
+                                                               "ite887x");
+               if (iobase != NULL) {
+                       /* write POSIO0R - speed | size | ioport */
+                       pci_write_config_dword(dev, ITE_887x_POSIO0,
+                               ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
+                               ITE_887x_POSIO_IOSIZE_32 | inta_addr[i]);
+                       /* write INTCBAR - ioport */
+                       pci_write_config_dword(dev, ITE_887x_INTCBAR, inta_addr[i]);
+                       ret = inb(inta_addr[i]);
+                       if (ret != 0xff) {
+                               /* ioport connected */
+                               break;
+                       }
+                       release_region(iobase->start, ITE_887x_IOSIZE);
+                       iobase = NULL;
+               }
+               i++;
+       }
+
+       if (!inta_addr[i]) {
+               printk(KERN_ERR "ite887x: could not find iobase\n");
+               return -ENODEV;
+       }
+
+       /* start of undocumented type checking (see parport_pc.c) */
+       type = inb(iobase->start + 0x18) & 0x0f;
+
+       switch (type) {
+       case 0x2:       /* ITE8871 (1P) */
+       case 0xa:       /* ITE8875 (1P) */
+               ret = 0;
+               break;
+       case 0xe:       /* ITE8872 (2S1P) */
+               ret = 2;
+               break;
+       case 0x6:       /* ITE8873 (1S) */
+               ret = 1;
+               break;
+       case 0x8:       /* ITE8874 (2S) */
+               ret = 2;
+               break;
+       default:
+               moan_device("Unknown ITE887x", dev);
+               ret = -ENODEV;
+       }
+
+       /* configure all serial ports */
+       for (i = 0; i < ret; i++) {
+               /* read the I/O port from the device */
+               pci_read_config_dword(dev, ITE_887x_PS0BAR + (0x4 * (i + 1)),
+                                                               &ioport);
+               ioport &= 0x0000FF00;   /* the actual base address */
+               pci_write_config_dword(dev, ITE_887x_POSIO0 + (0x4 * (i + 1)),
+                       ITE_887x_POSIO_ENABLE | ITE_887x_POSIO_SPEED |
+                       ITE_887x_POSIO_IOSIZE_8 | ioport);
+
+               /* write the ioport to the UARTBAR */
+               pci_read_config_dword(dev, ITE_887x_UARTBAR, &uartbar);
+               uartbar &= ~(0xffff << (16 * i));       /* clear half the reg */
+               uartbar |= (ioport << (16 * i));        /* set the ioport */
+               pci_write_config_dword(dev, ITE_887x_UARTBAR, uartbar);
+
+               /* get current config */
+               pci_read_config_dword(dev, ITE_887x_MISCR, &miscr);
+               /* disable interrupts (UARTx_Routing[3:0]) */
+               miscr &= ~(0xf << (12 - 4 * i));
+               /* activate the UART (UARTx_En) */
+               miscr |= 1 << (23 - i);
+               /* write new config with activated UART */
+               pci_write_config_dword(dev, ITE_887x_MISCR, miscr);
+       }
+
+       if (ret <= 0) {
+               /* the device has no UARTs if we get here */
+               release_region(iobase->start, ITE_887x_IOSIZE);
+       }
+
+       return ret;
+}
+
+static void __devexit pci_ite887x_exit(struct pci_dev *dev)
+{
+       u32 ioport;
+       /* the ioport is bit 0-15 in POSIO0R */
+       pci_read_config_dword(dev, ITE_887x_POSIO0, &ioport);
+       ioport &= 0xffff;
+       release_region(ioport, ITE_887x_IOSIZE);
+}
+
 static int
 pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
                  struct uart_port *port, int idx)
@@ -652,6 +784,18 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
                .init           = pci_inteli960ni_init,
                .setup          = pci_default_setup,
        },
+       /*
+        * ITE
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_ITE,
+               .device         = PCI_DEVICE_ID_ITE_8872,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .init           = pci_ite887x_init,
+               .setup          = pci_default_setup,
+               .exit           = __devexit_p(pci_ite887x_exit),
+       },
        /*
         * Panacom
         */
@@ -933,6 +1077,7 @@ enum pci_board_num_t {
 
        pbn_b1_2_1250000,
 
+       pbn_b1_bt_1_115200,
        pbn_b1_bt_2_921600,
 
        pbn_b1_1_1382400,
@@ -983,6 +1128,7 @@ enum pci_board_num_t {
        pbn_exar_XR17C152,
        pbn_exar_XR17C154,
        pbn_exar_XR17C158,
+       pbn_pasemi_1682M,
 };
 
 /*
@@ -1211,6 +1357,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .uart_offset    = 8,
        },
 
+       [pbn_b1_bt_1_115200] = {
+               .flags          = FL_BASE1|FL_BASE_BARS,
+               .num_ports      = 1,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
+
        [pbn_b1_bt_2_921600] = {
                .flags          = FL_BASE1|FL_BASE_BARS,
                .num_ports      = 2,
@@ -1498,6 +1651,18 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .base_baud      = 921600,
                .uart_offset    = 0x200,
        },
+       /*
+        * PA Semi PWRficient PA6T-1682M on-chip UART
+        */
+       [pbn_pasemi_1682M] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 1,
+               .base_baud      = 8333333,
+       },
+};
+
+static const struct pci_device_id softmodem_blacklist[] = {
+       { PCI_VDEVICE ( AL, 0x5457 ), }, /* ALi Corporation M5457 AC'97 Modem */
 };
 
 /*
@@ -1508,6 +1673,7 @@ static struct pciserial_board pci_boards[] __devinitdata = {
 static int __devinit
 serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
 {
+       const struct pci_device_id *blacklist;
        int num_iomem, num_port, first_port = -1, i;
        
        /*
@@ -1522,6 +1688,18 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
            (dev->class & 0xff) > 6)
                return -ENODEV;
 
+       /*
+        * Do not access blacklisted devices that are known not to
+        * feature serial ports.
+        */
+       for (blacklist = softmodem_blacklist;
+            blacklist < softmodem_blacklist + ARRAY_SIZE(softmodem_blacklist);
+            blacklist++) {
+               if (dev->vendor == blacklist->vendor &&
+                   dev->device == blacklist->device)
+                       return -ENODEV;
+       }
+
        num_iomem = num_port = 0;
        for (i = 0; i < PCI_NUM_BAR_RESOURCES; i++) {
                if (pci_resource_flags(dev, i) & IORESOURCE_IO) {
@@ -2364,6 +2542,13 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_b0_1_115200 },
+       /*
+        * ITE
+        */
+       {       PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8872,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0,
+               pbn_b1_bt_1_115200 },
 
        /*
         * IntaShield IS-200
@@ -2381,6 +2566,13 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
                PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS8,
                0, 0, pbn_b2_8_921600 },
+       /*
+        * PA Semi PA6T-1682M on-chip UART
+        */
+       {       PCI_VENDOR_ID_PASEMI, 0xa004,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_pasemi_1682M },
+
        /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
index 030a6063541dc36466b15cec3bc1005cbed30809..a055f58f342f3a1570f8648eb35c4df8550be353 100644 (file)
@@ -1146,11 +1146,14 @@ static void uart_set_termios(struct tty_struct *tty, struct ktermios *old_termio
 
        /*
         * These are the bits that are used to setup various
-        * flags in the low level driver.
+        * flags in the low level driver. We can ignore the Bfoo
+        * bits in c_cflag; c_[io]speed will always be set
+        * appropriately by set_termios() in tty_ioctl.c
         */
 #define RELEVANT_IFLAG(iflag)  ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
        if ((cflag ^ old_termios->c_cflag) == 0 &&
+           tty->termios->c_ospeed == old_termios->c_ospeed &&
+           tty->termios->c_ispeed == old_termios->c_ispeed &&
            RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0)
                return;
 
index b8f91e018b216be2945f7ced663071e087d2a335..0930e2a855147d3deb47bc4b9e7ef78a028af667 100644 (file)
@@ -37,7 +37,7 @@
 
 #include <asm/io.h>
 
-static char *serial_version = "1.09";
+static char *serial_version = "1.10";
 static char *serial_name = "TX39/49 Serial driver";
 
 #define PASS_LIMIT     256
@@ -436,8 +436,10 @@ static unsigned int serial_txx9_get_mctrl(struct uart_port *port)
        struct uart_txx9_port *up = (struct uart_txx9_port *)port;
        unsigned int ret;
 
-       ret =  ((sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS)
-               | ((sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : TIOCM_CTS);
+       /* no modem control lines */
+       ret = TIOCM_CAR | TIOCM_DSR;
+       ret |= (sio_in(up, TXX9_SIFLCR) & TXX9_SIFLCR_RTSSC) ? 0 : TIOCM_RTS;
+       ret |= (sio_in(up, TXX9_SICISR) & TXX9_SICISR_CTSS) ? 0 : TIOCM_CTS;
 
        return ret;
 }
@@ -557,6 +559,12 @@ serial_txx9_set_termios(struct uart_port *port, struct ktermios *termios,
        unsigned long flags;
        unsigned int baud, quot;
 
+       /*
+        * We don't support modem control lines.
+        */
+       termios->c_cflag &= ~(HUPCL | CMSPAR);
+       termios->c_cflag |= CLOCAL;
+
        cval = sio_in(up, TXX9_SILCR);
        /* byte size and parity */
        cval &= ~TXX9_SILCR_UMODE_MASK;
index 7dd73546bf43cb4541d68ad2393a07c3be5db121..7580aa5da0f866ba72705eb00cdee6b5b3af355c 100644 (file)
@@ -6,6 +6,9 @@ menuconfig USB_SUPPORT
        bool "USB support"
        depends on HAS_IOMEM
        default y
+       ---help---
+         This option adds core support for Universal Serial Bus (USB).
+         You will also need drivers from the following menu to make use of it.
 
 if USB_SUPPORT
 
@@ -18,6 +21,7 @@ config USB_ARCH_HAS_HCD
        default y if USB_ARCH_HAS_EHCI
        default y if PCMCIA && !M32R                    # sl811_cs
        default y if ARM                                # SL-811
+       default y if SUPERH                             # r8a66597-hcd
        default PCI
 
 # many non-PCI SOC chips embed OHCI
index 02c52f8d5dbf2b097af0b5f9e6b0a389afa7af6a..a73e714288e51fa11dbfb86cc71e71039e3f4ae1 100644 (file)
@@ -456,7 +456,6 @@ static int cxacru_start_wait_urb(struct urb *urb, struct completion *done,
                                 int* actual_length)
 {
        struct timer_list timer;
-       int status = urb->status;
 
        init_timer(&timer);
        timer.expires = jiffies + msecs_to_jiffies(CMD_TIMEOUT);
@@ -468,7 +467,7 @@ static int cxacru_start_wait_urb(struct urb *urb, struct completion *done,
 
        if (actual_length)
                *actual_length = urb->actual_length;
-       return status;
+       return urb->status; /* must read status after completion */
 }
 
 static int cxacru_cm(struct cxacru_data *instance, enum cxacru_cm_request cm,
index a1a1c9d467e028157c84289a9d92ccd0fe97c4b9..29807d048b0413ee0c83b2654dbdda560cf3a741 100644 (file)
@@ -1721,9 +1721,12 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf,
 
        ret = uea_boot(sc);
        if (ret < 0)
-               goto error;
+               goto error_rm_grp;
 
        return 0;
+
+error_rm_grp:
+       sysfs_remove_group(&intf->dev.kobj, &attr_grp);
 error:
        kfree(sc);
        return ret;
index fe940e0536e03488016d1171da3866ce8bb6dd00..f51e22490edfaccae55b641723c939ce0019087b 100644 (file)
@@ -921,6 +921,10 @@ skip_normal_probe:
                        return -EINVAL;
                }
        }
+
+       /* Accept probe requests only for the control interface */
+       if (intf != control_interface)
+               return -ENODEV;
        
        if (usb_interface_claimed(data_interface)) { /* valid in this context */
                dev_dbg(&intf->dev,"The data interface isn't available");
@@ -1109,10 +1113,12 @@ static void acm_disconnect(struct usb_interface *intf)
                return;
        }
        if (acm->country_codes){
-               device_remove_file(&intf->dev, &dev_attr_wCountryCodes);
-               device_remove_file(&intf->dev, &dev_attr_iCountryCodeRelDate);
+               device_remove_file(&acm->control->dev,
+                               &dev_attr_wCountryCodes);
+               device_remove_file(&acm->control->dev,
+                               &dev_attr_iCountryCodeRelDate);
        }
-       device_remove_file(&intf->dev, &dev_attr_bmCapabilities);
+       device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
        acm->dev = NULL;
        usb_set_intfdata(acm->control, NULL);
        usb_set_intfdata(acm->data, NULL);
index 654857493a82e35e0837e840e3942b46b43c1251..a1ad11d0c47cacaa2b5b2a3fdd4ff7c0a62d563f 100644 (file)
@@ -1224,6 +1224,8 @@ static int usb_autopm_do_device(struct usb_device *udev, int inc_usage_cnt)
        udev->auto_pm = 1;
        udev->pm_usage_cnt += inc_usage_cnt;
        WARN_ON(udev->pm_usage_cnt < 0);
+       if (inc_usage_cnt)
+               udev->last_busy = jiffies;
        if (inc_usage_cnt >= 0 && udev->pm_usage_cnt > 0) {
                if (udev->state == USB_STATE_SUSPENDED)
                        status = usb_resume_both(udev);
@@ -1232,8 +1234,6 @@ static int usb_autopm_do_device(struct usb_device *udev, int inc_usage_cnt)
                else if (inc_usage_cnt)
                        udev->last_busy = jiffies;
        } else if (inc_usage_cnt <= 0 && udev->pm_usage_cnt <= 0) {
-               if (inc_usage_cnt)
-                       udev->last_busy = jiffies;
                status = usb_suspend_both(udev, PMSG_SUSPEND);
        }
        usb_pm_unlock(udev);
@@ -1342,16 +1342,15 @@ static int usb_autopm_do_interface(struct usb_interface *intf,
        else {
                udev->auto_pm = 1;
                intf->pm_usage_cnt += inc_usage_cnt;
+               udev->last_busy = jiffies;
                if (inc_usage_cnt >= 0 && intf->pm_usage_cnt > 0) {
                        if (udev->state == USB_STATE_SUSPENDED)
                                status = usb_resume_both(udev);
                        if (status != 0)
                                intf->pm_usage_cnt -= inc_usage_cnt;
-                       else if (inc_usage_cnt)
+                       else
                                udev->last_busy = jiffies;
                } else if (inc_usage_cnt <= 0 && intf->pm_usage_cnt <= 0) {
-                       if (inc_usage_cnt)
-                               udev->last_busy = jiffies;
                        status = usb_suspend_both(udev, PMSG_SUSPEND);
                }
        }
index e341a1da517fe8589c7153b0bf7811f84c435e51..f7b337feb3eac28ddcc997069b81fe16243fde8a 100644 (file)
@@ -1644,9 +1644,10 @@ static int finish_port_resume(struct usb_device *udev)
         * and device drivers will know about any resume quirks.
         */
        if (status == 0) {
+               devstatus = 0;
                status = usb_get_status(udev, USB_RECIP_DEVICE, 0, &devstatus);
                if (status >= 0)
-                       status = (status == 2 ? 0 : -ENODEV);
+                       status = (status > 0 ? 0 : -ENODEV);
        }
 
        if (status) {
index b6bd05e3d439eb41f6c87633d9bba10960d45498..d8f7b089a8f0ad243f3218cbb50c78deed02301b 100644 (file)
@@ -637,12 +637,12 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char
        memset(buf,0,size);     // Make sure we parse really received data
 
        for (i = 0; i < 3; ++i) {
-               /* retry on length 0 or stall; some devices are flakey */
+               /* retry on length 0 or error; some devices are flakey */
                result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
                                USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
                                (type << 8) + index, 0, buf, size,
                                USB_CTRL_GET_TIMEOUT);
-               if (result == 0 || result == -EPIPE)
+               if (result <= 0 && result != -ETIMEDOUT)
                        continue;
                if (result > 1 && ((u8 *)buf)[1] != type) {
                        result = -EPROTO;
@@ -1358,6 +1358,30 @@ static int usb_if_uevent(struct device *dev, char **envp, int num_envp,
        usb_dev = interface_to_usbdev(intf);
        alt = intf->cur_altsetting;
 
+#ifdef CONFIG_USB_DEVICEFS
+       if (add_uevent_var(envp, num_envp, &i,
+                          buffer, buffer_size, &length,
+                          "DEVICE=/proc/bus/usb/%03d/%03d",
+                          usb_dev->bus->busnum, usb_dev->devnum))
+               return -ENOMEM;
+#endif
+
+       if (add_uevent_var(envp, num_envp, &i,
+                          buffer, buffer_size, &length,
+                          "PRODUCT=%x/%x/%x",
+                          le16_to_cpu(usb_dev->descriptor.idVendor),
+                          le16_to_cpu(usb_dev->descriptor.idProduct),
+                          le16_to_cpu(usb_dev->descriptor.bcdDevice)))
+               return -ENOMEM;
+
+       if (add_uevent_var(envp, num_envp, &i,
+                          buffer, buffer_size, &length,
+                          "TYPE=%d/%d/%d",
+                          usb_dev->descriptor.bDeviceClass,
+                          usb_dev->descriptor.bDeviceSubClass,
+                          usb_dev->descriptor.bDeviceProtocol))
+               return -ENOMEM;
+
        if (add_uevent_var(envp, num_envp, &i,
                   buffer, buffer_size, &length,
                   "INTERFACE=%d/%d/%d",
index b7917c5a3c6f4182f6f085e8186790b17577f8d1..9e467118dc946cf1b8a3f46240c5c5f9f645dcac 100644 (file)
@@ -30,6 +30,8 @@
 static const struct usb_device_id usb_quirk_list[] = {
        /* HP 5300/5370C scanner */
        { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 },
+       /* Hewlett-Packard PhotoSmart 720 / PhotoSmart 935 (storage) */
+       { USB_DEVICE(0x03f0, 0x4002), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Acer Peripherals Inc. (now BenQ Corp.) Prisa 640BU */
        { USB_DEVICE(0x04a5, 0x207e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Benq S2W 3300U */
@@ -56,6 +58,8 @@ static const struct usb_device_id usb_quirk_list[] = {
        { USB_DEVICE(0x04b8, 0x0121), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Seiko Epson Corp.*/
        { USB_DEVICE(0x04b8, 0x0122), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Samsung ML-2010 printer */
+       { USB_DEVICE(0x04e8, 0x326c), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Samsung ML-2510 Series printer */
        { USB_DEVICE(0x04e8, 0x327e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Elsa MicroLink 56k (V.250) */
@@ -64,12 +68,20 @@ static const struct usb_device_id usb_quirk_list[] = {
        { USB_DEVICE(0x05d8, 0x4005), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Agfa Snapscan1212u */
        { USB_DEVICE(0x06bd, 0x2061), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Seagate RSS LLC */
+       { USB_DEVICE(0x0bc2, 0x3000), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Umax [hex] Astra 3400U */
        { USB_DEVICE(0x1606, 0x0060), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
 
        /* Philips PSC805 audio device */
        { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME },
 
+       /* Alcor multi-card reader */
+       { USB_DEVICE(0x058f, 0x6366), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+
+       /* Canon EOS 5D in PC Connection mode */
+       { USB_DEVICE(0x04a9, 0x3101), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+
        /* RIM Blackberry */
        { USB_DEVICE(0x0fca, 0x0001), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        { USB_DEVICE(0x0fca, 0x0004), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
index f2fbdc7fe376ddf7397f056ab78eee74bc19f427..d008d1360a7aea6abf391da60a9a8eb0d5c8f5f2 100644 (file)
@@ -34,8 +34,6 @@
  * bypassing some hardware (and driver) issues.  UML could help too.
  */
 
-#define DEBUG
-
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
index be7a1bd2823b865ed777e0562ac774417057fa74..965ad7bec7b7a2f19b3e9ad9757aae2ff5b8a9c3 100644 (file)
@@ -599,7 +599,6 @@ enum fsg_buffer_state {
 
 struct fsg_buffhd {
        void                            *buf;
-       dma_addr_t                      dma;
        enum fsg_buffer_state           state;
        struct fsg_buffhd               *next;
 
@@ -1295,6 +1294,7 @@ static int class_setup_req(struct fsg_dev *fsg,
        struct usb_request      *req = fsg->ep0req;
        int                     value = -EOPNOTSUPP;
        u16                     w_index = le16_to_cpu(ctrl->wIndex);
+       u16                     w_value = le16_to_cpu(ctrl->wValue);
        u16                     w_length = le16_to_cpu(ctrl->wLength);
 
        if (!fsg->config)
@@ -1308,7 +1308,7 @@ static int class_setup_req(struct fsg_dev *fsg,
                        if (ctrl->bRequestType != (USB_DIR_OUT |
                                        USB_TYPE_CLASS | USB_RECIP_INTERFACE))
                                break;
-                       if (w_index != 0) {
+                       if (w_index != 0 || w_value != 0) {
                                value = -EDOM;
                                break;
                        }
@@ -1324,7 +1324,7 @@ static int class_setup_req(struct fsg_dev *fsg,
                        if (ctrl->bRequestType != (USB_DIR_IN |
                                        USB_TYPE_CLASS | USB_RECIP_INTERFACE))
                                break;
-                       if (w_index != 0) {
+                       if (w_index != 0 || w_value != 0) {
                                value = -EDOM;
                                break;
                        }
@@ -1343,7 +1343,7 @@ static int class_setup_req(struct fsg_dev *fsg,
                        if (ctrl->bRequestType != (USB_DIR_OUT |
                                        USB_TYPE_CLASS | USB_RECIP_INTERFACE))
                                break;
-                       if (w_index != 0) {
+                       if (w_index != 0 || w_value != 0) {
                                value = -EDOM;
                                break;
                        }
@@ -2611,7 +2611,6 @@ static int send_status(struct fsg_dev *fsg)
 
                fsg->intr_buffhd = bh;          // Point to the right buffhd
                fsg->intreq->buf = bh->inreq->buf;
-               fsg->intreq->dma = bh->inreq->dma;
                fsg->intreq->context = bh;
                start_transfer(fsg, fsg->intr_in, fsg->intreq,
                                &fsg->intreq_busy, &bh->state);
@@ -3200,7 +3199,6 @@ reset:
                if ((rc = alloc_request(fsg, fsg->bulk_out, &bh->outreq)) != 0)
                        goto reset;
                bh->inreq->buf = bh->outreq->buf = bh->buf;
-               bh->inreq->dma = bh->outreq->dma = bh->dma;
                bh->inreq->context = bh->outreq->context = bh;
                bh->inreq->complete = bulk_in_complete;
                bh->outreq->complete = bulk_out_complete;
index 10b2b33b8698e54c48b3f2ce701cfa3c09c0406a..d57bcfbc08a530b31cdb5e6c75871057c6a794ae 100644 (file)
@@ -1277,31 +1277,32 @@ static void setup_received_irq(struct fsl_udc *udc,
 
        udc_reset_ep_queue(udc, 0);
 
+       /* We process some stardard setup requests here */
        switch (setup->bRequest) {
-               /* Request that need Data+Status phase from udc */
        case USB_REQ_GET_STATUS:
-               if ((setup->bRequestType & (USB_DIR_IN | USB_TYPE_STANDARD))
+               /* Data+Status phase from udc */
+               if ((setup->bRequestType & (USB_DIR_IN | USB_TYPE_MASK))
                                        != (USB_DIR_IN | USB_TYPE_STANDARD))
                        break;
                ch9getstatus(udc, setup->bRequestType, wValue, wIndex, wLength);
-               break;
+               return;
 
-               /* Requests that need Status phase from udc */
        case USB_REQ_SET_ADDRESS:
+               /* Status phase from udc */
                if (setup->bRequestType != (USB_DIR_OUT | USB_TYPE_STANDARD
                                                | USB_RECIP_DEVICE))
                        break;
                ch9setaddress(udc, wValue, wIndex, wLength);
-               break;
+               return;
 
-               /* Handled by udc, no data, status by udc */
        case USB_REQ_CLEAR_FEATURE:
        case USB_REQ_SET_FEATURE:
-       {       /* status transaction */
+               /* Status phase from udc */
+       {
                int rc = -EOPNOTSUPP;
 
-               if ((setup->bRequestType & USB_RECIP_MASK)
-                               == USB_RECIP_ENDPOINT) {
+               if ((setup->bRequestType & (USB_RECIP_MASK | USB_TYPE_MASK))
+                               == (USB_RECIP_ENDPOINT | USB_TYPE_STANDARD)) {
                        int pipe = get_pipe_by_windex(wIndex);
                        struct fsl_ep *ep;
 
@@ -1315,8 +1316,9 @@ static void setup_received_irq(struct fsl_udc *udc,
                                                ? 1 : 0);
                        spin_lock(&udc->lock);
 
-               } else if ((setup->bRequestType & USB_RECIP_MASK)
-                               == USB_RECIP_DEVICE) {
+               } else if ((setup->bRequestType & (USB_RECIP_MASK
+                               | USB_TYPE_MASK)) == (USB_RECIP_DEVICE
+                               | USB_TYPE_STANDARD)) {
                        /* Note: The driver has not include OTG support yet.
                         * This will be set when OTG support is added */
                        if (!udc->gadget.is_otg)
@@ -1329,39 +1331,42 @@ static void setup_received_irq(struct fsl_udc *udc,
                                        USB_DEVICE_A_ALT_HNP_SUPPORT)
                                udc->gadget.a_alt_hnp_support = 1;
                        rc = 0;
-               }
+               } else
+                       break;
+
                if (rc == 0) {
                        if (ep0_prime_status(udc, EP_DIR_IN))
                                ep0stall(udc);
                }
-               break;
+               return;
        }
-               /* Requests handled by gadget */
-       default:
-               if (wLength) {
-                       /* Data phase from gadget, status phase from udc */
-                       udc->ep0_dir = (setup->bRequestType & USB_DIR_IN)
-                                       ?  USB_DIR_IN : USB_DIR_OUT;
-                       spin_unlock(&udc->lock);
-                       if (udc->driver->setup(&udc->gadget,
-                                       &udc->local_setup_buff) < 0)
-                               ep0stall(udc);
-                       spin_lock(&udc->lock);
-                       udc->ep0_state = (setup->bRequestType & USB_DIR_IN)
-                                       ?  DATA_STATE_XMIT : DATA_STATE_RECV;
 
-               } else {
-                       /* No data phase, IN status from gadget */
-                       udc->ep0_dir = USB_DIR_IN;
-                       spin_unlock(&udc->lock);
-                       if (udc->driver->setup(&udc->gadget,
-                                       &udc->local_setup_buff) < 0)
-                               ep0stall(udc);
-                       spin_lock(&udc->lock);
-                       udc->ep0_state = WAIT_FOR_OUT_STATUS;
-               }
+       default:
                break;
        }
+
+       /* Requests handled by gadget */
+       if (wLength) {
+               /* Data phase from gadget, status phase from udc */
+               udc->ep0_dir = (setup->bRequestType & USB_DIR_IN)
+                               ?  USB_DIR_IN : USB_DIR_OUT;
+               spin_unlock(&udc->lock);
+               if (udc->driver->setup(&udc->gadget,
+                               &udc->local_setup_buff) < 0)
+                       ep0stall(udc);
+               spin_lock(&udc->lock);
+               udc->ep0_state = (setup->bRequestType & USB_DIR_IN)
+                               ?  DATA_STATE_XMIT : DATA_STATE_RECV;
+       } else {
+               /* No data phase, IN status from gadget */
+               udc->ep0_dir = USB_DIR_IN;
+               spin_unlock(&udc->lock);
+               if (udc->driver->setup(&udc->gadget,
+                               &udc->local_setup_buff) < 0)
+                       ep0stall(udc);
+               spin_lock(&udc->lock);
+               udc->ep0_state = WAIT_FOR_OUT_STATUS;
+       }
 }
 
 /* Process request for Data or Status phase of ep0
index 72b4ebbf132d1ed636b2ebc60953f97b23fe99cc..1407ad1c81288bdfa1343e871bcd5be36d4622bf 100644 (file)
@@ -967,7 +967,7 @@ static int pxa2xx_udc_pullup(struct usb_gadget *_gadget, int is_active)
        udc = container_of(_gadget, struct pxa2xx_udc, gadget);
 
        /* not all boards support pullup control */
-       if (!udc->mach->udc_command)
+       if (!udc->mach->gpio_pullup && !udc->mach->udc_command)
                return -EOPNOTSUPP;
 
        is_active = (is_active != 0);
@@ -2309,7 +2309,7 @@ static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state)
 {
        struct pxa2xx_udc       *udc = platform_get_drvdata(dev);
 
-       if (!udc->mach->udc_command)
+       if (!udc->mach->gpio_pullup && !udc->mach->udc_command)
                WARN("USB host won't detect disconnect!\n");
        pullup(udc, 0);
 
index 2f529828c74d23232a0d060b8d00108e6834ccea..565d6ef4c4cf5befc157aba3639c83cafa4adabe 100644 (file)
@@ -237,7 +237,7 @@ config USB_SL811_CS
          module will be called "sl811_cs".
 
 config USB_R8A66597_HCD
-       tristate "R8A66597 HCD suppoort"
+       tristate "R8A66597 HCD support"
        depends on USB
        help
          The R8A66597 is a USB 2.0 host and peripheral controller.
index 5d1b12aad7766acc39d338c9200dfc4ca6b86601..b1d19268cb23df9688be260794ef475bddbe0340 100644 (file)
@@ -1,8 +1,6 @@
 /*
  * EHCI HCD (Host Controller Driver) for USB.
  *
- * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
- *
  * Bus Glue for AMD Alchemy Au1xxx
  *
  * Based on "ohci-au1xxx.c" by Matt Porter <mporter@kernel.crashing.org>
@@ -196,6 +194,9 @@ static const struct hc_driver ehci_au1xxx_hc_driver = {
 
        /*
         * basic lifecycle operations
+        *
+        * FIXME -- ehci_init() doesn't do enough here.
+        * See ehci-ppc-soc for a complete implementation.
         */
        .reset = ehci_init,
        .start = ehci_run,
index c4e15ed1405a96eaa85003ae796ba316b37f9714..35cdba10411b3c09bf7a3e72b697cc0f0fef6931 100644 (file)
@@ -275,58 +275,6 @@ static void ehci_work(struct ehci_hcd *ehci);
 
 /*-------------------------------------------------------------------------*/
 
-#ifdef CONFIG_CPU_FREQ
-
-#include <linux/cpufreq.h>
-
-static void ehci_cpufreq_pause (struct ehci_hcd *ehci)
-{
-       unsigned long   flags;
-
-       spin_lock_irqsave(&ehci->lock, flags);
-       if (!ehci->cpufreq_changing++)
-               qh_inactivate_split_intr_qhs(ehci);
-       spin_unlock_irqrestore(&ehci->lock, flags);
-}
-
-static void ehci_cpufreq_unpause (struct ehci_hcd *ehci)
-{
-       unsigned long   flags;
-
-       spin_lock_irqsave(&ehci->lock, flags);
-       if (!--ehci->cpufreq_changing)
-               qh_reactivate_split_intr_qhs(ehci);
-       spin_unlock_irqrestore(&ehci->lock, flags);
-}
-
-/*
- * ehci_cpufreq_notifier is needed to avoid MMF errors that occur when
- * EHCI controllers that don't cache many uframes get delayed trying to
- * read main memory during CPU frequency transitions.  This can cause
- * split interrupt transactions to not be completed in the required uframe.
- * This has been observed on the Broadcom/ServerWorks HT1000 controller.
- */
-static int ehci_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
-                                void *data)
-{
-       struct ehci_hcd *ehci = container_of(nb, struct ehci_hcd,
-                                            cpufreq_transition);
-
-       switch (val) {
-       case CPUFREQ_PRECHANGE:
-               ehci_cpufreq_pause(ehci);
-               break;
-       case CPUFREQ_POSTCHANGE:
-               ehci_cpufreq_unpause(ehci);
-               break;
-       }
-       return 0;
-}
-
-#endif
-
-/*-------------------------------------------------------------------------*/
-
 static void ehci_watchdog (unsigned long param)
 {
        struct ehci_hcd         *ehci = (struct ehci_hcd *) param;
@@ -460,10 +408,6 @@ static void ehci_stop (struct usb_hcd *hcd)
        ehci_writel(ehci, 0, &ehci->regs->intr_enable);
        spin_unlock_irq(&ehci->lock);
 
-#ifdef CONFIG_CPU_FREQ
-       cpufreq_unregister_notifier(&ehci->cpufreq_transition,
-                                   CPUFREQ_TRANSITION_NOTIFIER);
-#endif
        /* let companion controllers work when we aren't */
        ehci_writel(ehci, 0, &ehci->regs->configured_flag);
 
@@ -569,17 +513,6 @@ static int ehci_init(struct usb_hcd *hcd)
        }
        ehci->command = temp;
 
-#ifdef CONFIG_CPU_FREQ
-       INIT_LIST_HEAD(&ehci->split_intr_qhs);
-       /*
-        * If the EHCI controller caches enough uframes, this probably
-        * isn't needed unless there are so many low/full speed devices
-        * that the controller's can't cache it all.
-        */
-       ehci->cpufreq_transition.notifier_call = ehci_cpufreq_notifier;
-       cpufreq_register_notifier(&ehci->cpufreq_transition,
-                                 CPUFREQ_TRANSITION_NOTIFIER);
-#endif
        return 0;
 }
 
index 8816d09903d0b11317e1ddcbaacc479158365c1d..0431397836f65e859f1a2b1829f418fa3697f65d 100644 (file)
@@ -94,9 +94,6 @@ static struct ehci_qh *ehci_qh_alloc (struct ehci_hcd *ehci, gfp_t flags)
        qh->qh_dma = dma;
        // INIT_LIST_HEAD (&qh->qh_list);
        INIT_LIST_HEAD (&qh->qtd_list);
-#ifdef CONFIG_CPU_FREQ
-       INIT_LIST_HEAD (&qh->split_intr_qhs);
-#endif
 
        /* dummy td enables safe urb queuing */
        qh->dummy = ehci_qtd_alloc (ehci, flags);
index c2cedb09ed8bf02699aff32c0010e8d81ab0d841..4f99b0eb27bc2bdaea9729897b46c44dae4c763b 100644 (file)
@@ -6,7 +6,7 @@
  * Bus Glue for PPC On-Chip EHCI driver
  * Tested on AMCC 440EPx
  *
- * Based on "ehci-au12xx.c" by David Brownell <dbrownell@users.sourceforge.net>
+ * Based on "ehci-au1xxx.c" by K.Boge <karsten.boge@amd.com>
  *
  * This file is licenced under the GPL.
  */
 
 extern int usb_disabled(void);
 
+/* called during probe() after chip reset completes */
+static int ehci_ppc_soc_setup(struct usb_hcd *hcd)
+{
+       struct ehci_hcd *ehci = hcd_to_ehci(hcd);
+       int             retval;
+
+       retval = ehci_halt(ehci);
+       if (retval)
+               return retval;
+
+       retval = ehci_init(hcd);
+       if (retval)
+               return retval;
+
+       ehci->sbrn = 0x20;
+       return ehci_reset(ehci);
+}
+
 /**
  * usb_ehci_ppc_soc_probe - initialize PPC-SoC-based HCDs
  * Context: !in_interrupt()
@@ -120,7 +138,7 @@ static const struct hc_driver ehci_ppc_soc_hc_driver = {
        /*
         * basic lifecycle operations
         */
-       .reset = ehci_init,
+       .reset = ehci_ppc_soc_setup,
        .start = ehci_run,
        .stop = ehci_stop,
        .shutdown = ehci_shutdown,
index 2284028f8aa5e2056d0d309effb03173c9b4ea3f..140bfa423e07d39b18815221723b5181654ebd15 100644 (file)
@@ -312,10 +312,6 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
                struct urb      *urb;
                u32             token = 0;
 
-               /* ignore QHs that are currently inactive */
-               if (qh->hw_info1 & __constant_cpu_to_le32(QH_INACTIVATE))
-                       break;
-
                qtd = list_entry (entry, struct ehci_qtd, qtd_list);
                urb = qtd->urb;
 
index d4a8ace496769308338bce8e081511d80032e1d6..e682f2342ef826693678262c0eb7009c72fcecbe 100644 (file)
@@ -479,109 +479,6 @@ static int disable_periodic (struct ehci_hcd *ehci)
 }
 
 /*-------------------------------------------------------------------------*/
-#ifdef CONFIG_CPU_FREQ
-
-static int safe_to_modify_i (struct ehci_hcd *ehci, struct ehci_qh *qh)
-{
-       int now; /* current (frame * 8) + uframe */
-       int prev_start, next_start; /* uframes from/to split start */
-       int start_uframe = ffs(le32_to_cpup (&qh->hw_info2) & QH_SMASK);
-       int end_uframe = fls((le32_to_cpup (&qh->hw_info2) & QH_CMASK) >> 8);
-       int split_duration = end_uframe - start_uframe;
-
-       now = readl(&ehci->regs->frame_index) % (ehci->periodic_size << 3);
-
-       next_start = ((1024 << 3) + (qh->start << 3) + start_uframe - now)
-                       % (qh->period << 3);
-       prev_start = (qh->period << 3) - next_start;
-
-       /*
-        * Make sure there will be at least one uframe when qh is safe.
-        */
-       if ((qh->period << 3) <= (ehci->i_thresh + 2 + split_duration))
-               /* never safe */
-               return -EINVAL;
-
-       /*
-        * Wait 1 uframe after transaction should have started, to make
-        * sure controller has time to write back overlay, so we can
-        * check QTD_STS_STS to see if transaction is in progress.
-        */
-       if ((next_start > ehci->i_thresh) && (prev_start > 1))
-               /* safe to set "i" bit if split isn't in progress */
-               return (qh->hw_token & STATUS_BIT(ehci)) ? 0 : 1;
-       else
-               return 0;
-}
-
-/* Set inactivate bit for all the split interrupt QHs. */
-static void qh_inactivate_split_intr_qhs (struct ehci_hcd *ehci)
-{
-       struct ehci_qh  *qh;
-       int             not_done, safe;
-       u32             inactivate = INACTIVATE_BIT(ehci);
-       u32             active = ACTIVE_BIT(ehci);
-
-       do {
-               not_done = 0;
-               list_for_each_entry(qh, &ehci->split_intr_qhs,
-                               split_intr_qhs) {
-                       if (qh->hw_info1 & inactivate)
-                               /* already off */
-                               continue;
-                       /*
-                        * To avoid setting "I" after the start split happens,
-                        * don't set it if the QH might be cached in the
-                        * controller.  Some HCs (Broadcom/ServerWorks HT1000)
-                        * will stop in the middle of a split transaction when
-                        * the "I" bit is set.
-                        */
-                       safe = safe_to_modify_i(ehci, qh);
-                       if (safe == 0) {
-                               not_done = 1;
-                       } else if (safe > 0) {
-                               qh->was_active = qh->hw_token & active;
-                               qh->hw_info1 |= inactivate;
-                       }
-               }
-       } while (not_done);
-       wmb();
-}
-
-static void qh_reactivate_split_intr_qhs (struct ehci_hcd *ehci)
-{
-       struct ehci_qh  *qh;
-       u32             token;
-       int             not_done, safe;
-       u32             inactivate = INACTIVATE_BIT(ehci);
-       u32             active = ACTIVE_BIT(ehci);
-       u32             halt = HALT_BIT(ehci);
-
-       do {
-               not_done = 0;
-               list_for_each_entry(qh, &ehci->split_intr_qhs, split_intr_qhs) {
-                       if (!(qh->hw_info1 & inactivate)) /* already on */
-                               continue;
-                       /*
-                        * Don't reactivate if cached, or controller might
-                        * overwrite overlay after we modify it!
-                        */
-                       safe = safe_to_modify_i(ehci, qh);
-                       if (safe == 0) {
-                               not_done = 1;
-                       } else if (safe > 0) {
-                               /* See EHCI 1.0 section 4.15.2.4. */
-                               token = qh->hw_token;
-                               qh->hw_token = (token | halt) & ~active;
-                               wmb();
-                               qh->hw_info1 &= ~inactivate;
-                               wmb();
-                               qh->hw_token = (token & ~halt) | qh->was_active;
-                       }
-               }
-       } while (not_done);
-}
-#endif
 
 /* periodic schedule slots have iso tds (normal or split) first, then a
  * sparse tree for active interrupt transfers.
@@ -599,17 +496,6 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
                period, hc32_to_cpup(ehci, &qh->hw_info2) & (QH_CMASK | QH_SMASK),
                qh, qh->start, qh->usecs, qh->c_usecs);
 
-#ifdef CONFIG_CPU_FREQ
-       /*
-        * If low/full speed interrupt QHs are inactive (because of
-        * cpufreq changing processor speeds), start QH with I flag set--
-        * it will automatically be cleared when cpufreq is done.
-        */
-       if (ehci->cpufreq_changing)
-               if (!(qh->hw_info1 & (cpu_to_le32(1 << 13))))
-                       qh->hw_info1 |= INACTIVATE_BIT(ehci);
-#endif
-
        /* high bandwidth, or otherwise every microframe */
        if (period == 0)
                period = 1;
@@ -658,12 +544,6 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
                ? ((qh->usecs + qh->c_usecs) / qh->period)
                : (qh->usecs * 8);
 
-#ifdef CONFIG_CPU_FREQ
-       /* add qh to list of low/full speed interrupt QHs, if applicable */
-       if (!(qh->hw_info1 & (cpu_to_le32(1 << 13)))) {
-               list_add(&qh->split_intr_qhs, &ehci->split_intr_qhs);
-       }
-#endif
        /* maybe enable periodic schedule processing */
        if (!ehci->periodic_sched++)
                return enable_periodic (ehci);
@@ -683,13 +563,6 @@ static void qh_unlink_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
        // THEN
        //   qh->hw_info1 |= __constant_cpu_to_hc32(1 << 7 /* "ignore" */);
 
-#ifdef CONFIG_CPU_FREQ
-       /* remove qh from list of low/full speed interrupt QHs */
-       if (!(qh->hw_info1 & (cpu_to_le32(1 << 13)))) {
-               list_del_init(&qh->split_intr_qhs);
-       }
-#endif
-
        /* high bandwidth, or otherwise part of every microframe */
        if ((period = qh->period) == 0)
                period = 1;
index 2c68a04230c18f822a72cfce68d79f53fd6cd2f6..951d69fec513a2b12fa7c5f666844af4f0729128 100644 (file)
@@ -71,12 +71,6 @@ struct ehci_hcd {                    /* one per controller */
        __u32                   hcs_params;     /* cached register copy */
        spinlock_t              lock;
 
-#ifdef CONFIG_CPU_FREQ
-       struct notifier_block   cpufreq_transition;
-       int                     cpufreq_changing;
-       struct list_head        split_intr_qhs;
-#endif
-
        /* async schedule support */
        struct ehci_qh          *async;
        struct ehci_qh          *reclaim;
@@ -439,10 +433,6 @@ struct ehci_qh {
        __hc32                  hw_next;        /* see EHCI 3.6.1 */
        __hc32                  hw_info1;       /* see EHCI 3.6.2 */
 #define        QH_HEAD         0x00008000
-#define        QH_INACTIVATE   0x00000080
-
-#define INACTIVATE_BIT(ehci)   cpu_to_hc32(ehci, QH_INACTIVATE)
-
        __hc32                  hw_info2;        /* see EHCI 3.6.2 */
 #define        QH_SMASK        0x000000ff
 #define        QH_CMASK        0x0000ff00
@@ -492,10 +482,6 @@ struct ehci_qh {
        unsigned short          start;          /* where polling starts */
 #define NO_FRAME ((unsigned short)~0)                  /* pick new start */
        struct usb_device       *dev;           /* access to TT */
-#ifdef CONFIG_CPU_FREQ
-       struct list_head        split_intr_qhs; /* list of split qhs */
-       __le32                  was_active;     /* active bit before "i" set */
-#endif
 } __attribute__ ((aligned (32)));
 
 /*-------------------------------------------------------------------------*/
index 6f9e43e9a6cab69072fe420a460d74074f77e6b7..f61c6cdd06f2443ecbc0ed333df7a92cee618494 100644 (file)
@@ -74,7 +74,7 @@ urb_print (struct urb * urb, char * str, int small)
 
 #define ohci_dbg_sw(ohci, next, size, format, arg...) \
        do { \
-       if (next) { \
+       if (next != NULL) { \
                unsigned s_len; \
                s_len = scnprintf (*next, *size, format, ## arg ); \
                *size -= s_len; *next += s_len; \
index d60f1985320cfc630e107e81bd3c406a4229a083..40a1de4c256efafabc5ca528d97b6f6361413def 100644 (file)
@@ -2208,8 +2208,6 @@ static int __init r8a66597_probe(struct platform_device *pdev)
 clean_up:
        if (reg)
                iounmap(reg);
-       if (res)
-               release_mem_region(res->start, 1);
 
        return ret;
 }
index 7f765ec038cd4eb3846276c3c1f88879851260c0..b88eb3c62c0254b2358b693926b836bffa9d1df5 100644 (file)
@@ -1520,12 +1520,15 @@ static void u132_hcd_endp_work_scheduler(struct work_struct *work)
                 }
         }
 }
+#ifdef CONFIG_PM
 
 static void port_power(struct u132 *u132, int pn, int is_on)
 {
         u132->port[pn].power = is_on;
 }
 
+#endif
+
 static void u132_power(struct u132 *u132, int is_on)
 {
         struct usb_hcd *hcd = u132_to_hcd(u132)
index cff6fd190a28273869c4f9b1203e75ccee1ccc85..77bb893bf2e922c51bb51ef4e2ac69f6d2cd2a86 100644 (file)
@@ -18,7 +18,6 @@
 
 static struct usb_device_id id_table [] = {
        { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */
-       { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */
        { },
 };
 MODULE_DEVICE_TABLE(usb, id_table);
index e67ce25f7512627dad57bf4930d2ca26c6bc413a..86724e885704b01dcfb77d9291d3958690f32932 100644 (file)
@@ -383,6 +383,10 @@ static void belkin_sa_set_termios (struct usb_serial_port *port, struct ktermios
        }
 
        baud = tty_get_baud_rate(port->tty);
+       if (baud == 0) {
+               dbg("%s - tty_get_baud_rate says 0 baud", __FUNCTION__);
+               return;
+       }
        urb_value = BELKIN_SA_BAUD(baud);
        /* Clip to maximum speed */
        if (urb_value == 0)
index 7b1673a440775aaef3673915432cbed74c508051..1370c423d7c28bbfb967d1d42262a2628d33e616 100644 (file)
@@ -538,6 +538,8 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_VCP_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_TERATRONIK_D2XX_PID) },
        { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) },
+       { USB_DEVICE(EVOLUTION_VID, EVO_HYBRID_PID) },
+       { USB_DEVICE(EVOLUTION_VID, EVO_RCM4_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ARTEMIS_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ATIK_ATK16C_PID) },
index d9e49716db13584eff75ddbe8307929738b0b957..c70e1de6389ee046d5ee1170c2445fabf9721436 100644 (file)
  */
 #define EVOLUTION_VID          0xDEEE  /* Vendor ID */
 #define EVOLUTION_ER1_PID      0x0300  /* ER1 Control Module */
+#define EVO_8U232AM_PID        0x02FF  /* Evolution robotics RCM2 (FT232AM)*/
+#define EVO_HYBRID_PID         0x0302  /* Evolution robotics RCM4 PID (FT232BM)*/
+#define EVO_RCM4_PID           0x0303  /* Evolution robotics RCM4 PID */
 
 /* Pyramid Computer GmbH */
 #define FTDI_PYRAMID_PID       0xE6C8  /* Pyramid Appliance Display */
index 04bd3b7a298516a4f4409033df182ddfaf54ea80..f1c90cfe72515365236c9ddf61e1c41ee90fe82a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Garmin GPS driver
  *
- * Copyright (C) 2006 Hermann Kneissel herkne@users.sourceforge.net
+ * Copyright (C) 2006,2007 Hermann Kneissel herkne@users.sourceforge.net
  *
  * The latest version of the driver can be found at
  * http://sourceforge.net/projects/garmin-gps/
@@ -34,6 +34,7 @@
 #include <linux/module.h>
 #include <linux/spinlock.h>
 #include <asm/uaccess.h>
+#include <asm/atomic.h>
 #include <linux/usb.h>
 #include <linux/usb/serial.h>
 
@@ -52,7 +53,7 @@ static int debug = 0;
  */
 
 #define VERSION_MAJOR  0
-#define VERSION_MINOR  28
+#define VERSION_MINOR  31
 
 #define _STR(s) #s
 #define _DRIVER_VERSION(a,b) "v" _STR(a) "." _STR(b)
@@ -141,6 +142,8 @@ struct garmin_data {
        __u8   inbuffer [GPS_IN_BUFSIZ];  /* tty -> usb */
        __u8   outbuffer[GPS_OUT_BUFSIZ]; /* usb -> tty */
        __u8   privpkt[4*6];
+       atomic_t req_count;
+       atomic_t resp_count;
        spinlock_t lock;
        struct list_head pktlist;
 };
@@ -171,8 +174,6 @@ struct garmin_data {
 #define CLEAR_HALT_REQUIRED       0x0001
 
 #define FLAGS_QUEUING             0x0100
-#define FLAGS_APP_RESP_SEEN       0x0200
-#define FLAGS_APP_REQ_SEEN        0x0400
 #define FLAGS_DROP_DATA           0x0800
 
 #define FLAGS_GSP_SKIP            0x1000
@@ -186,7 +187,8 @@ struct garmin_data {
 /* function prototypes */
 static void gsp_next_packet(struct garmin_data * garmin_data_p);
 static int  garmin_write_bulk(struct usb_serial_port *port,
-                            const unsigned char *buf, int count);
+                            const unsigned char *buf, int count,
+                            int dismiss_ack);
 
 /* some special packets to be send or received */
 static unsigned char const GARMIN_START_SESSION_REQ[]
@@ -233,9 +235,7 @@ static struct usb_driver garmin_driver = {
 
 static inline int noResponseFromAppLayer(struct garmin_data * garmin_data_p)
 {
-       return ((garmin_data_p->flags
-                               & (FLAGS_APP_REQ_SEEN|FLAGS_APP_RESP_SEEN))
-               == FLAGS_APP_REQ_SEEN);
+       return atomic_read(&garmin_data_p->req_count) == atomic_read(&garmin_data_p->resp_count);
 }
 
 
@@ -463,7 +463,7 @@ static int gsp_rec_packet(struct garmin_data * garmin_data_p, int count)
        usbdata[2] = __cpu_to_le32(size);
 
        garmin_write_bulk (garmin_data_p->port, garmin_data_p->inbuffer,
-                          GARMIN_PKTHDR_LENGTH+size);
+                          GARMIN_PKTHDR_LENGTH+size, 0);
 
        /* if this was an abort-transfer command, flush all
           queued data. */
@@ -818,7 +818,7 @@ static int nat_receive(struct garmin_data * garmin_data_p,
                        if (garmin_data_p->insize >= len) {
                                garmin_write_bulk (garmin_data_p->port,
                                                   garmin_data_p->inbuffer,
-                                                  len);
+                                                  len, 0);
                                garmin_data_p->insize = 0;
 
                                /* if this was an abort-transfer command,
@@ -893,10 +893,11 @@ static int garmin_clear(struct garmin_data * garmin_data_p)
 
        struct usb_serial_port *port = garmin_data_p->port;
 
-       if (port != NULL && garmin_data_p->flags & FLAGS_APP_RESP_SEEN) {
+       if (port != NULL && atomic_read(&garmin_data_p->resp_count)) {
                /* send a terminate command */
                status = garmin_write_bulk(port, GARMIN_STOP_TRANSFER_REQ,
-                                          sizeof(GARMIN_STOP_TRANSFER_REQ));
+                                          sizeof(GARMIN_STOP_TRANSFER_REQ),
+                                          1);
        }
 
        /* flush all queued data */
@@ -939,7 +940,8 @@ static int garmin_init_session(struct usb_serial_port *port)
                dbg("%s - starting session ...", __FUNCTION__);
                garmin_data_p->state = STATE_ACTIVE;
                status = garmin_write_bulk(port, GARMIN_START_SESSION_REQ,
-                                          sizeof(GARMIN_START_SESSION_REQ));
+                                          sizeof(GARMIN_START_SESSION_REQ),
+                                          0);
 
                if (status >= 0) {
 
@@ -950,7 +952,8 @@ static int garmin_init_session(struct usb_serial_port *port)
                        /* not needed, but the win32 driver does it too ... */
                        status = garmin_write_bulk(port,
                                                   GARMIN_START_SESSION_REQ2,
-                                                  sizeof(GARMIN_START_SESSION_REQ2));
+                                                  sizeof(GARMIN_START_SESSION_REQ2),
+                                                  0);
                        if (status >= 0) {
                                status = 0;
                                spin_lock_irqsave(&garmin_data_p->lock, flags);
@@ -987,6 +990,8 @@ static int garmin_open (struct usb_serial_port *port, struct file *filp)
        garmin_data_p->mode  = initial_mode;
        garmin_data_p->count = 0;
        garmin_data_p->flags = 0;
+       atomic_set(&garmin_data_p->req_count, 0);
+       atomic_set(&garmin_data_p->resp_count, 0);
        spin_unlock_irqrestore(&garmin_data_p->lock, flags);
 
        /* shutdown any bulk reads that might be going on */
@@ -1035,28 +1040,39 @@ static void garmin_write_bulk_callback (struct urb *urb)
 {
        unsigned long flags;
        struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
-       struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
        int status = urb->status;
 
-       /* free up the transfer buffer, as usb_free_urb() does not do this */
-       kfree (urb->transfer_buffer);
+       if (port) {
+               struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
 
-       dbg("%s - port %d", __FUNCTION__, port->number);
+               dbg("%s - port %d", __FUNCTION__, port->number);
 
-       if (status) {
-               dbg("%s - nonzero write bulk status received: %d",
-                       __FUNCTION__, status);
-               spin_lock_irqsave(&garmin_data_p->lock, flags);
-               garmin_data_p->flags |= CLEAR_HALT_REQUIRED;
-               spin_unlock_irqrestore(&garmin_data_p->lock, flags);
+               if (GARMIN_LAYERID_APPL == getLayerId(urb->transfer_buffer)
+                   && (garmin_data_p->mode == MODE_GARMIN_SERIAL))  {
+                       gsp_send_ack(garmin_data_p, ((__u8 *)urb->transfer_buffer)[4]);
+               }
+
+               if (status) {
+                       dbg("%s - nonzero write bulk status received: %d",
+                           __FUNCTION__, urb->status);
+                       spin_lock_irqsave(&garmin_data_p->lock, flags);
+                       garmin_data_p->flags |= CLEAR_HALT_REQUIRED;
+                       spin_unlock_irqrestore(&garmin_data_p->lock, flags);
+               }
+
+               usb_serial_port_softint(port);
        }
 
-       usb_serial_port_softint(port);
+       /* Ignore errors that resulted from garmin_write_bulk with dismiss_ack=1 */
+
+       /* free up the transfer buffer, as usb_free_urb() does not do this */
+       kfree (urb->transfer_buffer);
 }
 
 
 static int garmin_write_bulk (struct usb_serial_port *port,
-                             const unsigned char *buf, int count)
+                             const unsigned char *buf, int count,
+                             int dismiss_ack)
 {
        unsigned long flags;
        struct usb_serial *serial = port->serial;
@@ -1093,13 +1109,12 @@ static int garmin_write_bulk (struct usb_serial_port *port,
                                usb_sndbulkpipe (serial->dev,
                                port->bulk_out_endpointAddress),
                                buffer, count,
-                               garmin_write_bulk_callback, port);
+                               garmin_write_bulk_callback,
+                               dismiss_ack ? NULL : port);
        urb->transfer_flags |= URB_ZERO_PACKET;
 
        if (GARMIN_LAYERID_APPL == getLayerId(buffer)) {
-               spin_lock_irqsave(&garmin_data_p->lock, flags);
-               garmin_data_p->flags |= FLAGS_APP_REQ_SEEN;
-               spin_unlock_irqrestore(&garmin_data_p->lock, flags);
+               atomic_inc(&garmin_data_p->req_count);
                if (garmin_data_p->mode == MODE_GARMIN_SERIAL)  {
                        pkt_clear(garmin_data_p);
                        garmin_data_p->state = STATE_GSP_WAIT_DATA;
@@ -1114,13 +1129,6 @@ static int garmin_write_bulk (struct usb_serial_port *port,
                        "failed with status = %d\n",
                                __FUNCTION__, status);
                count = status;
-       } else {
-
-               if (GARMIN_LAYERID_APPL == getLayerId(buffer)
-                   && (garmin_data_p->mode == MODE_GARMIN_SERIAL))  {
-
-                       gsp_send_ack(garmin_data_p, buffer[4]);
-               }
        }
 
        /* we are done with this urb, so let the host driver
@@ -1135,7 +1143,6 @@ static int garmin_write_bulk (struct usb_serial_port *port,
 static int garmin_write (struct usb_serial_port *port,
                         const unsigned char *buf, int count)
 {
-       unsigned long flags;
        int pktid, pktsiz, len;
        struct garmin_data * garmin_data_p = usb_get_serial_port_data(port);
        __le32 *privpkt = (__le32 *)garmin_data_p->privpkt;
@@ -1186,9 +1193,7 @@ static int garmin_write (struct usb_serial_port *port,
                                break;
 
                        case PRIV_PKTID_RESET_REQ:
-                               spin_lock_irqsave(&garmin_data_p->lock, flags);
-                               garmin_data_p->flags |= FLAGS_APP_REQ_SEEN;
-                               spin_unlock_irqrestore(&garmin_data_p->lock, flags);
+                               atomic_inc(&garmin_data_p->req_count);
                                break;
 
                        case PRIV_PKTID_SET_DEF_MODE:
@@ -1241,8 +1246,6 @@ static int garmin_chars_in_buffer (struct usb_serial_port *port)
 static void garmin_read_process(struct garmin_data * garmin_data_p,
                                 unsigned char *data, unsigned data_length)
 {
-       unsigned long flags;
-
        if (garmin_data_p->flags & FLAGS_DROP_DATA) {
                /* abort-transfer cmd is actice */
                dbg("%s - pkt dropped", __FUNCTION__);
@@ -1254,9 +1257,7 @@ static void garmin_read_process(struct garmin_data * garmin_data_p,
                   the device */
                if (0 == memcmp(data, GARMIN_APP_LAYER_REPLY,
                                sizeof(GARMIN_APP_LAYER_REPLY))) {
-                       spin_lock_irqsave(&garmin_data_p->lock, flags);
-                       garmin_data_p->flags |= FLAGS_APP_RESP_SEEN;
-                       spin_unlock_irqrestore(&garmin_data_p->lock, flags);
+                       atomic_inc(&garmin_data_p->resp_count);
                }
 
                /* if throttling is active or postprecessing is required
index 0455c1552ae90e9e00dde3f8bc52bd63625c66f4..6a3a704b58498bff271b34351dd382049f7cbcd2 100644 (file)
@@ -545,6 +545,7 @@ static struct usb_device_id ipaq_id_table [] = {
        { USB_DEVICE(0x413C, 0x4009) }, /* Dell Axim USB Sync */
        { USB_DEVICE(0x4505, 0x0010) }, /* Smartphone */
        { USB_DEVICE(0x5E04, 0xCE00) }, /* SAGEM Wireless Assistant */
+       { USB_DEVICE(0x0BB4, 0x00CF) }, /* HTC smartphone modems */
        { }                             /* Terminating entry */
 };
 
index 84c12b5f12715675148551bbee25ca5be5ae2b19..4cb3c165742bbb59d2cc2be66bb6da7488700196 100644 (file)
@@ -110,6 +110,7 @@ static int  option_send_setup(struct usb_serial_port *port);
 #define HUAWEI_PRODUCT_E220                    0x1003
 
 #define NOVATELWIRELESS_VENDOR_ID              0x1410
+#define DELL_VENDOR_ID                         0x413C
 
 #define ANYDATA_VENDOR_ID                      0x16d5
 #define ANYDATA_PRODUCT_ADU_E100A              0x6501
@@ -119,8 +120,6 @@ static int  option_send_setup(struct usb_serial_port *port);
 #define BANDRICH_PRODUCT_C100_1                        0x1002
 #define BANDRICH_PRODUCT_C100_2                        0x1003
 
-#define DELL_VENDOR_ID                         0x413C
-
 static struct usb_device_id option_ids[] = {
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
        { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
@@ -171,11 +170,16 @@ static struct usb_device_id option_ids[] = {
        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */
        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */
        { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2410) }, /* Novatel EU740 */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
        { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
        { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
        { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
-       { USB_DEVICE(DELL_VENDOR_ID, 0x8118) },         /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard */
        { } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, option_ids);
index d7db71eca5209bf386a8edc2286f232c0c8ed886..833ada47fc5429938af9045baa7e9fb68dda4b1a 100644 (file)
@@ -818,19 +818,17 @@ static int oti6858_ioctl(struct usb_serial_port *port, struct file *file,
 
        switch (cmd) {
                case TCGETS:
-                       if (copy_to_user(user_arg, port->tty->termios,
-                                               sizeof(struct ktermios))) {
+                       if (kernel_termios_to_user_termios((struct ktermios __user *)arg,
+                                                          port->tty->termios))
                                return -EFAULT;
-                       }
                        return 0;
 
                case TCSETS:
                case TCSETSW:   /* FIXME: this is not the same! */
                case TCSETSF:   /* FIXME: this is not the same! */
-                       if (copy_from_user(port->tty->termios, user_arg,
-                                               sizeof(struct ktermios))) {
+                       if (user_termios_to_kernel_termios(port->tty->termios,
+                                               (struct ktermios __user *)arg))
                                return -EFAULT;
-                       }
                        oti6858_set_termios(port, NULL);
                        return 0;
 
index 86899d55d8d818fcc0b81e7cd0a67c2d7ec19c0b..51669b7622bb8fdeaf80bdfd29017603d58ec5cb 100644 (file)
 #include <linux/usb/serial.h>
 
 
-#ifndef CONFIG_USB_SAFE_PADDED
-#define CONFIG_USB_SAFE_PADDED 0
+#ifndef CONFIG_USB_SERIAL_SAFE_PADDED
+#define CONFIG_USB_SERIAL_SAFE_PADDED 0
 #endif
 
 static int debug;
 static int safe = 1;
-static int padded = CONFIG_USB_SAFE_PADDED;
+static int padded = CONFIG_USB_SERIAL_SAFE_PADDED;
 
 #define DRIVER_VERSION "v0.0b"
 #define DRIVER_AUTHOR "sl@lineo.com, tbr@lineo.com"
index 7d84a7647e81efeec0c025df2ecf783ade3b16aa..30e08c0bcdc2d3c26311f17f2088e45ed35b10a6 100644 (file)
@@ -104,6 +104,8 @@ static struct usb_device_id id_table [] = {
                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
        { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_TJ25_ID),
                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
+       { USB_DEVICE(ACER_VENDOR_ID, ACER_S10_ID),
+               .driver_info = (kernel_ulong_t)&palm_os_4_probe },
        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SCH_I330_ID), 
                .driver_info = (kernel_ulong_t)&palm_os_4_probe },
        { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_SPH_I500_ID), 
index 4ce6f62a6f398f69caaa60ab7ab3c4a50506081f..57229cf66477b10f444f4326da1cef4c4409d620 100644 (file)
@@ -48,6 +48,9 @@
 #define SONY_CLIE_UX50_ID              0x0144
 #define SONY_CLIE_TJ25_ID              0x0169
 
+#define ACER_VENDOR_ID                 0x0502
+#define ACER_S10_ID                    0x0001
+
 #define SAMSUNG_VENDOR_ID              0x04E8
 #define SAMSUNG_SCH_I330_ID            0x8001
 #define SAMSUNG_SPH_I500_ID            0x6601
index d8d008d4294643419b52c798eea81fd941fdc1f9..2d92ce31018fff95e5769f50d12598cfb9e8aac8 100644 (file)
@@ -342,7 +342,7 @@ UNUSUAL_DEV(  0x04b0, 0x040d, 0x0100, 0x0100,
                US_FL_FIX_CAPACITY),
 
 /* Reported by Emil Larsson <emil@swip.net> */
-UNUSUAL_DEV(  0x04b0, 0x0411, 0x0100, 0x0100,
+UNUSUAL_DEV(  0x04b0, 0x0411, 0x0100, 0x0101,
                "NIKON",
                "NIKON DSC D80",
                US_SC_DEVICE, US_PR_DEVICE, NULL,
index 28842d208bb031738c8b68d79a6ac8ec91196fe7..25e557d4fe6b054f23716d7ef06b84b8e9227bb9 100644 (file)
@@ -112,13 +112,6 @@ module_param(delay_use, uint, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
 
 
-/* These are used to make sure the module doesn't unload before all the
- * threads have exited.
- */
-static atomic_t total_threads = ATOMIC_INIT(0);
-static DECLARE_COMPLETION(threads_gone);
-
-
 /*
  * The entries in this table correspond, line for line,
  * with the entries of us_unusual_dev_list[].
@@ -879,9 +872,6 @@ static void quiesce_and_remove_host(struct us_data *us)
        usb_stor_stop_transport(us);
        wake_up(&us->delay_wait);
 
-       /* It doesn't matter if the SCSI-scanning thread is still running.
-        * The thread will exit when it sees the DISCONNECTING flag. */
-
        /* queuecommand won't accept any new commands and the control
         * thread won't execute a previously-queued command.  If there
         * is such a command pending, complete it with an error. */
@@ -891,12 +881,16 @@ static void quiesce_and_remove_host(struct us_data *us)
                scsi_lock(host);
                us->srb->scsi_done(us->srb);
                us->srb = NULL;
+               complete(&us->notify);          /* in case of an abort */
                scsi_unlock(host);
        }
        mutex_unlock(&us->dev_mutex);
 
        /* Now we own no commands so it's safe to remove the SCSI host */
        scsi_remove_host(host);
+
+       /* Wait for the SCSI-scanning thread to stop */
+       wait_for_completion(&us->scanning_done);
 }
 
 /* Second stage of disconnect processing: deallocate all resources */
@@ -947,9 +941,8 @@ retry:
                /* Should we unbind if no devices were detected? */
        }
 
-       scsi_host_put(us_to_host(us));
        usb_autopm_put_interface(us->pusb_intf);
-       complete_and_exit(&threads_gone, 0);
+       complete_and_exit(&us->scanning_done, 0);
 }
 
 
@@ -984,6 +977,7 @@ static int storage_probe(struct usb_interface *intf,
        init_MUTEX_LOCKED(&(us->sema));
        init_completion(&(us->notify));
        init_waitqueue_head(&us->delay_wait);
+       init_completion(&us->scanning_done);
 
        /* Associate the us_data structure with the USB device */
        result = associate_dev(us, intf);
@@ -1033,11 +1027,6 @@ static int storage_probe(struct usb_interface *intf,
                goto BadDevice;
        }
 
-       /* Take a reference to the host for the scanning thread and
-        * count it among all the threads we have launched.  Then
-        * start it up. */
-       scsi_host_get(us_to_host(us));
-       atomic_inc(&total_threads);
        usb_autopm_get_interface(intf); /* dropped in the scanning thread */
        wake_up_process(th);
 
@@ -1104,16 +1093,6 @@ static void __exit usb_stor_exit(void)
        US_DEBUGP("-- calling usb_deregister()\n");
        usb_deregister(&usb_storage_driver) ;
 
-       /* Don't return until all of our control and scanning threads
-        * have exited.  Since each thread signals threads_gone as its
-        * last act, we have to call wait_for_completion the right number
-        * of times.
-        */
-       while (atomic_read(&total_threads) > 0) {
-               wait_for_completion(&threads_gone);
-               atomic_dec(&total_threads);
-       }
-
        usb_usual_clear_present(USB_US_TYPE_STOR);
 }
 
index 6445665b1577c258d3a722e19e9a56fac549267a..8d87503e256072efa90c16672b22db4a00fded87 100644 (file)
@@ -150,6 +150,7 @@ struct us_data {
        struct semaphore        sema;            /* to sleep thread on      */
        struct completion       notify;          /* thread begin/end        */
        wait_queue_head_t       delay_wait;      /* wait during scan, reset */
+       struct completion       scanning_done;   /* wait for scan thread    */
 
        /* subdriver information */
        void                    *extra;          /* Any extra data          */
index 80a81eccad363aeaf25d21fb805f4972c8bb5fdd..832e4613673a3eaf910ff650b5de5ca77385fb31 100644 (file)
@@ -115,6 +115,52 @@ static int nocursor = 0;
 module_param(nocursor, int, 0644);
 MODULE_PARM_DESC(nocursor, "cursor enable/disable");
 
+/* fb_blank
+ * Blank the screen. Depending on the mode, the screen will be
+ * activated with the backlight color, or desactivated
+ */
+static int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi)
+{
+       struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
+
+       print_dbg("fb_blank %d %p", blank_mode, fbi);
+
+       switch (blank_mode) {
+
+       case VESA_NO_BLANKING:
+                       /* Turn on panel */
+                       fbdev->regs->lcd_control |= LCD_CONTROL_GO;
+#ifdef CONFIG_MIPS_PB1100
+                       if (drv_info.panel_idx == 1) {
+                               au_writew(au_readw(PB1100_G_CONTROL)
+                                         | (PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD),
+                       PB1100_G_CONTROL);
+                       }
+#endif
+               au_sync();
+               break;
+
+       case VESA_VSYNC_SUSPEND:
+       case VESA_HSYNC_SUSPEND:
+       case VESA_POWERDOWN:
+                       /* Turn off panel */
+                       fbdev->regs->lcd_control &= ~LCD_CONTROL_GO;
+#ifdef CONFIG_MIPS_PB1100
+                       if (drv_info.panel_idx == 1) {
+                               au_writew(au_readw(PB1100_G_CONTROL)
+                                         & ~(PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD),
+                       PB1100_G_CONTROL);
+                       }
+#endif
+               au_sync();
+               break;
+       default:
+               break;
+
+       }
+       return 0;
+}
+
 /*
  * Set hardware with var settings. This will enable the controller with a specific
  * mode, normally validated with the fb_check_var method
@@ -272,52 +318,6 @@ int au1100fb_fb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned
        return 0;
 }
 
-/* fb_blank
- * Blank the screen. Depending on the mode, the screen will be
- * activated with the backlight color, or desactivated
- */
-int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi)
-{
-       struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
-
-       print_dbg("fb_blank %d %p", blank_mode, fbi);
-
-       switch (blank_mode) {
-
-       case VESA_NO_BLANKING:
-                       /* Turn on panel */
-                       fbdev->regs->lcd_control |= LCD_CONTROL_GO;
-#ifdef CONFIG_MIPS_PB1100
-                       if (drv_info.panel_idx == 1) {
-                               au_writew(au_readw(PB1100_G_CONTROL)
-                                         | (PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD),
-                       PB1100_G_CONTROL);
-                       }
-#endif
-               au_sync();
-               break;
-
-       case VESA_VSYNC_SUSPEND:
-       case VESA_HSYNC_SUSPEND:
-       case VESA_POWERDOWN:
-                       /* Turn off panel */
-                       fbdev->regs->lcd_control &= ~LCD_CONTROL_GO;
-#ifdef CONFIG_MIPS_PB1100
-                       if (drv_info.panel_idx == 1) {
-                               au_writew(au_readw(PB1100_G_CONTROL)
-                                         & ~(PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD),
-                       PB1100_G_CONTROL);
-                       }
-#endif
-               au_sync();
-               break;
-       default:
-               break;
-
-       }
-       return 0;
-}
-
 /* fb_pan_display
  * Pan display in x and/or y as specified
  */
index 7fa1afeae8dc6d413c86af1741925823fc729960..dda0586ab3f333d920c97327d1e8aef2479f8e9e 100644 (file)
@@ -738,9 +738,8 @@ const struct consw newport_con = {
 #ifdef MODULE
 static int __init newport_console_init(void)
 {
-
        if (!sgi_gfxaddr)
-               return NULL;
+               return 0;
 
        if (!npregs)
                npregs = (struct newport_regs *)/* ioremap cannot fail */
index 5715b8ad0ddc87ae0c301c3b432df4d268541446..94f4511023d810a49f4a8cb859025c854a97c886 100644 (file)
@@ -1391,7 +1391,7 @@ init_imstt(struct fb_info *info)
                }
        }
 
-#if USE_NV_MODES && defined(CONFIG_PPC)
+#if USE_NV_MODES && defined(CONFIG_PPC32)
        {
                int vmode = init_vmode, cmode = init_cmode;
 
index 81e571d59b50a949589162e5ca28681a45964e0f..a280a52f8efec27d49a440d604bd0cf9311440ba 100644 (file)
@@ -66,7 +66,7 @@ static void set_ctrlr_state(struct pxafb_info *fbi, u_int state);
 
 #ifdef CONFIG_FB_PXA_PARAMETERS
 #define PXAFB_OPTIONS_SIZE 256
-static char g_options[PXAFB_OPTIONS_SIZE] __initdata = "";
+static char g_options[PXAFB_OPTIONS_SIZE] __devinitdata = "";
 #endif
 
 static inline void pxafb_schedule_work(struct pxafb_info *fbi, u_int state)
index 2fbd8dd16df5d289c8f46029de1559673dcbce67..6840dfebe4d4c82a5abc242a8ee1d66570f100ab 100644 (file)
@@ -170,22 +170,24 @@ void __w1_remove_master_device(struct w1_master *dev)
 
 void w1_remove_master_device(struct w1_bus_master *bm)
 {
-       struct w1_master *dev = NULL;
+       struct w1_master *dev, *found = NULL;
 
        list_for_each_entry(dev, &w1_masters, w1_master_entry) {
                if (!dev->initialized)
                        continue;
 
-               if (dev->bus_master->data == bm->data)
+               if (dev->bus_master->data == bm->data) {
+                       found = dev;
                        break;
+               }
        }
 
-       if (!dev) {
+       if (!found) {
                printk(KERN_ERR "Device doesn't exist.\n");
                return;
        }
 
-       __w1_remove_master_device(dev);
+       __w1_remove_master_device(found);
 }
 
 EXPORT_SYMBOL(w1_add_master_device);
index 9130f1c12c265887d02633ef932fe31fadc5526f..808b4f8675c5609ccd195deb755c40233ddf3059 100644 (file)
@@ -78,7 +78,7 @@ static ssize_t zorro_read_config(struct kobject *kobj,
 static struct bin_attribute zorro_config_attr = {
        .attr = {
                .name = "config",
-               .mode = S_IRUGO | S_IWUSR,
+               .mode = S_IRUGO,
        },
        .size = sizeof(struct ConfigDev),
        .read = zorro_read_config,
index 08fa320b7e6d20deedb124a1ea549c79ba4e597a..15e05a15b575cb8d06d0cdd8742b4aad6b8e72bf 100644 (file)
@@ -92,23 +92,6 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
        return fid;
 }
 
-struct p9_fid *v9fs_fid_lookup_remove(struct dentry *dentry)
-{
-       struct p9_fid *fid;
-       struct v9fs_dentry *dent;
-
-       dent = dentry->d_fsdata;
-       fid = v9fs_fid_lookup(dentry);
-       if (!IS_ERR(fid)) {
-               spin_lock(&dent->lock);
-               list_del(&fid->dlist);
-               spin_unlock(&dent->lock);
-       }
-
-       return fid;
-}
-
-
 /**
  * v9fs_fid_clone - lookup the fid for a dentry, clone a private copy and
  *     release it
index 47a0ba742872aa1a18d172c28b8bd884fe98d730..26e07df783b9e76ec7fa6fa4e932428ad9fa989d 100644 (file)
@@ -28,6 +28,5 @@ struct v9fs_dentry {
 };
 
 struct p9_fid *v9fs_fid_lookup(struct dentry *dentry);
-struct p9_fid *v9fs_fid_lookup_remove(struct dentry *dentry);
 struct p9_fid *v9fs_fid_clone(struct dentry *dentry);
 int v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid);
index 2d4c8a3e604e776a8a5fe680d5e974c729770dd0..45ff3d63b758bd09feea0162cc0a0cbeca0473ad 100644 (file)
@@ -587,19 +587,20 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
        unhashed = autofs4_lookup_unhashed(sbi, dentry->d_parent, &dentry->d_name);
        if (!unhashed) {
                /*
-                * Mark the dentry incomplete, but add it. This is needed so
-                * that the VFS layer knows about the dentry, and we can count
-                * on catching any lookups through the revalidate.
-                *
-                * Let all the hard work be done by the revalidate function that
-                * needs to be able to do this anyway..
-                *
-                * We need to do this before we release the directory semaphore.
+                * Mark the dentry incomplete but don't hash it. We do this
+                * to serialize our inode creation operations (symlink and
+                * mkdir) which prevents deadlock during the callback to
+                * the daemon. Subsequent user space lookups for the same
+                * dentry are placed on the wait queue while the daemon
+                * itself is allowed passage unresticted so the create
+                * operation itself can then hash the dentry. Finally,
+                * we check for the hashed dentry and return the newly
+                * hashed dentry.
                 */
                dentry->d_op = &autofs4_root_dentry_operations;
 
                dentry->d_fsdata = NULL;
-               d_add(dentry, NULL);
+               d_instantiate(dentry, NULL);
        } else {
                struct autofs_info *ino = autofs4_dentry_ino(unhashed);
                DPRINTK("rehash %p with %p", dentry, unhashed);
@@ -607,15 +608,17 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
                 * If we are racing with expire the request might not
                 * be quite complete but the directory has been removed
                 * so it must have been successful, so just wait for it.
+                * We need to ensure the AUTOFS_INF_EXPIRING flag is clear
+                * before continuing as revalidate may fail when calling
+                * try_to_fill_dentry (returning EAGAIN) if we don't.
                 */
-               if (ino && (ino->flags & AUTOFS_INF_EXPIRING)) {
+               while (ino && (ino->flags & AUTOFS_INF_EXPIRING)) {
                        DPRINTK("wait for incomplete expire %p name=%.*s",
                                unhashed, unhashed->d_name.len,
                                unhashed->d_name.name);
                        autofs4_wait(sbi, unhashed, NFY_NONE);
                        DPRINTK("request completed");
                }
-               d_rehash(unhashed);
                dentry = unhashed;
        }
 
@@ -658,7 +661,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
         * for all system calls, but it should be OK for the operations
         * we permit from an autofs.
         */
-       if (dentry->d_inode && d_unhashed(dentry)) {
+       if (!oz_mode && d_unhashed(dentry)) {
                /*
                 * A user space application can (and has done in the past)
                 * remove and re-create this directory during the callback.
@@ -716,7 +719,7 @@ static int autofs4_dir_symlink(struct inode *dir,
        strcpy(cp, symname);
 
        inode = autofs4_get_inode(dir->i_sb, ino);
-       d_instantiate(dentry, inode);
+       d_add(dentry, inode);
 
        if (dir == dir->i_sb->s_root->d_inode)
                dentry->d_op = &autofs4_root_dentry_operations;
@@ -844,7 +847,7 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
                return -ENOSPC;
 
        inode = autofs4_get_inode(dir->i_sb, ino);
-       d_instantiate(dentry, inode);
+       d_add(dentry, inode);
 
        if (dir == dir->i_sb->s_root->d_inode)
                dentry->d_op = &autofs4_root_dentry_operations;
index 6d84ca2beead8db4b0cd324c6c1ccc9d5b56a0d3..bed6215c0794ef8d9264b113aff767dc85ef4025 100644 (file)
@@ -3,7 +3,10 @@ Version 1.50
 Fix NTLMv2 signing. NFS server mounted over cifs works (if cifs mount is
 done with "serverino" mount option).  Add support for POSIX Unlink
 (helps with certain sharing violation cases when server such as
-Samba supports newer POSIX CIFS Protocol Extensions).
+Samba supports newer POSIX CIFS Protocol Extensions). Add "nounix"
+mount option to allow disabling the CIFS Unix Extensions for just
+that mount. Fix hang on spinlock in find_writable_file (race when
+reopening file after session crash).
 
 Version 1.49
 ------------
index 85f1eb14083eb2c3057027f60863f80db82df1b8..b806b11b5560e912f67fca11219381328744dd34 100644 (file)
@@ -444,6 +444,13 @@ A partial list of the supported mount options follows:
  noposixpaths   If CIFS Unix extensions are supported, do not request
                posix path name support (this may cause servers to
                reject creatingfile with certain reserved characters).
+ nounix         Disable the CIFS Unix Extensions for this mount (tree
+               connection). This is rarely needed, but it may be useful
+               in order to turn off multiple settings all at once (ie
+               posix acls, posix locks, posix paths, symlink support
+               and retrieving uids/gids/mode from the server) or to
+               work around a bug in server which implement the Unix
+               Extensions.
  nobrl          Do not send byte range lock requests to the server.
                This is necessary for certain applications that break
                with cifs style mandatory byte range locks (and most
@@ -451,6 +458,12 @@ A partial list of the supported mount options follows:
                byte range locks).
  remount        remount the share (often used to change from ro to rw mounts
                or vice versa)
+ servern        Specify the server 's netbios name (RFC1001 name) to use
+               when attempting to setup a session to the server.  This is
+               This is needed for mounting to some older servers (such
+               as OS/2 or Windows 98 and Windows ME) since they do not
+               support a default server name.  A server name can be up
+               to 15 characters long and is usually uppercased.
  sfu            When the CIFS Unix Extensions are not negotiated, attempt to
                create device files and fifos in a format compatible with
                Services for Unix (SFU).  In addition retrieve bits 10-12
index d7bd51575fd63888ab34f4de3f4c579187b02b81..29d4b2715254847cdf702283b96681e50ce1ed4a 100644 (file)
@@ -82,8 +82,7 @@ u) DOS attrs - returned as pseudo-xattr in Samba format (check VFAT and NTFS for
 
 v) mount check for unmatched uids
 
-w) Add mount option for Linux extension disable per mount, and partial
-disable per mount (uid off, symlink/fifo/mknod on but what about posix acls?)
+w) Add support for new vfs entry points for setlease and fallocate 
 
 x) Fix Samba 3 server to handle Linux kernel aio so dbench with lots of 
 processes can proceed better in parallel (on the server)
index e13592afca9c830565c420295cbc186e9f834fee..894b1f7b299d5d5dc679b391bb54ca6e1abc092e 100644 (file)
@@ -1904,6 +1904,25 @@ static int cifs_readpage(struct file *file, struct page *page)
        return rc;
 }
 
+static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
+{
+       struct cifsFileInfo *open_file;
+
+       read_lock(&GlobalSMBSeslock);
+       list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
+               if (open_file->closePend)
+                       continue;
+               if (open_file->pfile &&
+                   ((open_file->pfile->f_flags & O_RDWR) ||
+                    (open_file->pfile->f_flags & O_WRONLY))) {
+                       read_unlock(&GlobalSMBSeslock);
+                       return 1;
+               }
+       }
+       read_unlock(&GlobalSMBSeslock);
+       return 0;
+}
+
 /* We do not want to update the file size from server for inodes
    open for write - to avoid races with writepage extending
    the file - in the future we could consider allowing
@@ -1912,19 +1931,13 @@ static int cifs_readpage(struct file *file, struct page *page)
    page caching in the current Linux kernel design */
 int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
 {
-       struct cifsFileInfo *open_file = NULL;
-
-       if (cifsInode)
-               open_file =  find_writable_file(cifsInode);
+       if (!cifsInode)
+               return 1;
 
-       if (open_file) {
+       if (is_inode_writable(cifsInode)) {
+               /* This inode is open for write at least once */
                struct cifs_sb_info *cifs_sb;
 
-               /* there is not actually a write pending so let
-               this handle go free and allow it to
-               be closable if needed */
-               atomic_dec(&open_file->wrtPending);
-
                cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
                if ( cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO ) {
                        /* since no page cache to corrupt on directio
index 2ea027dda215cc2053d6645ca8a306ed959220c6..892be9b4d1f362351de1c0075b2f9b3086aff514 100644 (file)
@@ -372,6 +372,10 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
 
        /* 2000 big enough to fit max user, domain, NOS name etc. */
        str_area = kmalloc(2000, GFP_KERNEL);
+       if (str_area == NULL) {
+               cifs_small_buf_release(smb_buf);
+               return -ENOMEM;
+       }
        bcc_ptr = str_area;
 
        ses->flags &= ~CIFS_SES_LANMAN;
index 6874785bb65a846bafc6eb4242875bac9439ba3c..901dc55e9f54f444d3368c39af72fcab082726e5 100644 (file)
@@ -958,36 +958,22 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
        ssize_t ret2;
        size_t bytes;
 
-       dio->bio = NULL;
        dio->inode = inode;
        dio->rw = rw;
        dio->blkbits = blkbits;
        dio->blkfactor = inode->i_blkbits - blkbits;
-       dio->start_zero_done = 0;
-       dio->size = 0;
        dio->block_in_file = offset >> blkbits;
-       dio->blocks_available = 0;
-       dio->cur_page = NULL;
 
-       dio->boundary = 0;
-       dio->reap_counter = 0;
        dio->get_block = get_block;
        dio->end_io = end_io;
-       dio->map_bh.b_private = NULL;
-       dio->map_bh.b_state = 0;
        dio->final_block_in_bio = -1;
        dio->next_block_for_io = -1;
 
-       dio->page_errors = 0;
-       dio->io_error = 0;
-       dio->result = 0;
        dio->iocb = iocb;
        dio->i_size = i_size_read(inode);
 
        spin_lock_init(&dio->bio_lock);
        dio->refcount = 1;
-       dio->bio_list = NULL;
-       dio->waiter = NULL;
 
        /*
         * In case of non-aligned buffers, we may need 2 more
@@ -995,8 +981,6 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
         */
        if (unlikely(dio->blkfactor))
                dio->pages_in_io = 2;
-       else
-               dio->pages_in_io = 0;
 
        for (seg = 0; seg < nr_segs; seg++) {
                user_addr = (unsigned long)iov[seg].iov_base;
@@ -1184,7 +1168,7 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
                }
        }
 
-       dio = kmalloc(sizeof(*dio), GFP_KERNEL);
+       dio = kzalloc(sizeof(*dio), GFP_KERNEL);
        retval = -ENOMEM;
        if (!dio)
                goto out;
index 131954b3fb98b588db1802301c70ffe2c0196963..5d40ad13ab5cb036ba14d5f886b46ee445d29915 100644 (file)
@@ -357,6 +357,10 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
                ecryptfs_printk(KERN_DEBUG, "Is a special file; returning\n");
                goto out;
        }
+       if (special_file(lower_inode->i_mode)) {
+               ecryptfs_printk(KERN_DEBUG, "Is a special file; returning\n");
+               goto out;
+       }
        if (!nd) {
                ecryptfs_printk(KERN_DEBUG, "We have a NULL nd, just leave"
                                "as we *think* we are about to unlink\n");
index 7bdea7937ee896179e34b3fe0102f76803fedecb..c21a8cc0627709db512597ff2af82ab7c094e67d 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -779,19 +779,12 @@ static int de_thread(struct task_struct *tsk)
        struct task_struct *leader = NULL;
        int count;
 
-       /*
-        * Tell all the sighand listeners that this sighand has
-        * been detached. The signalfd_detach() function grabs the
-        * sighand lock, if signal listeners are present on the sighand.
-        */
-       signalfd_detach(tsk);
-
        /*
         * If we don't share sighandlers, then we aren't sharing anything
         * and we can just re-use it all.
         */
        if (atomic_read(&oldsighand->count) <= 1) {
-               BUG_ON(atomic_read(&sig->count) != 1);
+               signalfd_detach(tsk);
                exit_itimers(sig);
                return 0;
        }
@@ -930,12 +923,11 @@ static int de_thread(struct task_struct *tsk)
        sig->flags = 0;
 
 no_thread_group:
+       signalfd_detach(tsk);
        exit_itimers(sig);
        if (leader)
                release_task(leader);
 
-       BUG_ON(atomic_read(&sig->count) != 1);
-
        if (atomic_read(&oldsighand->count) == 1) {
                /*
                 * Now that we nuked the rest of the thread group,
@@ -1084,9 +1076,12 @@ int flush_old_exec(struct linux_binprm * bprm)
         */
        current->mm->task_size = TASK_SIZE;
 
-       if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || 
-           file_permission(bprm->file, MAY_READ) ||
-           (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)) {
+       if (bprm->e_uid != current->euid || bprm->e_gid != current->egid) {
+               suid_keys(current);
+               set_dumpable(current->mm, suid_dumpable);
+               current->pdeath_signal = 0;
+       } else if (file_permission(bprm->file, MAY_READ) ||
+                       (bprm->interp_flags & BINPRM_FLAGS_ENFORCE_NONDUMP)) {
                suid_keys(current);
                set_dumpable(current->mm, suid_dumpable);
        }
@@ -1177,8 +1172,10 @@ void compute_creds(struct linux_binprm *bprm)
 {
        int unsafe;
 
-       if (bprm->e_uid != current->uid)
+       if (bprm->e_uid != current->uid) {
                suid_keys(current);
+               current->pdeath_signal = 0;
+       }
        exec_keys(current);
 
        task_lock(current);
index bc6185933664b68e76694de35ed1df68c6408699..664c164aa67c19bef7583ce6fa7014cc715ffef5 100644 (file)
@@ -566,6 +566,9 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
                struct jffs2_full_dirent **prev = &dir_f->dents;
                uint32_t nhash = full_name_hash(name, namelen);
 
+               /* We don't actually want to reserve any space, but we do
+                  want to be holding the alloc_sem when we write to flash */
+               down(&c->alloc_sem);
                down(&dir_f->sem);
 
                while ((*prev) && (*prev)->nhash <= nhash) {
index 965625a0977d4de5395c74eb74247d3785189425..ee4814dd98f9cb5745e2195db44ade96b85cdd5d 100644 (file)
@@ -320,7 +320,21 @@ int proc_pid_status(struct task_struct *task, char *buffer)
        return buffer - orig;
 }
 
-static clock_t task_utime(struct task_struct *p)
+/*
+ * Use precise platform statistics if available:
+ */
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+static cputime_t task_utime(struct task_struct *p)
+{
+       return p->utime;
+}
+
+static cputime_t task_stime(struct task_struct *p)
+{
+       return p->stime;
+}
+#else
+static cputime_t task_utime(struct task_struct *p)
 {
        clock_t utime = cputime_to_clock_t(p->utime),
                total = utime + cputime_to_clock_t(p->stime);
@@ -337,10 +351,10 @@ static clock_t task_utime(struct task_struct *p)
        }
        utime = (clock_t)temp;
 
-       return utime;
+       return clock_t_to_cputime(utime);
 }
 
-static clock_t task_stime(struct task_struct *p)
+static cputime_t task_stime(struct task_struct *p)
 {
        clock_t stime;
 
@@ -349,10 +363,12 @@ static clock_t task_stime(struct task_struct *p)
         * the total, to make sure the total observed by userspace
         * grows monotonically - apps rely on that):
         */
-       stime = nsec_to_clock_t(p->se.sum_exec_runtime) - task_utime(p);
+       stime = nsec_to_clock_t(p->se.sum_exec_runtime) -
+                       cputime_to_clock_t(task_utime(p));
 
-       return stime;
+       return clock_t_to_cputime(stime);
 }
+#endif
 
 static int do_task_stat(struct task_struct *task, char *buffer, int whole)
 {
@@ -368,8 +384,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
        unsigned long long start_time;
        unsigned long cmin_flt = 0, cmaj_flt = 0;
        unsigned long  min_flt = 0,  maj_flt = 0;
-       cputime_t cutime, cstime;
-       clock_t utime, stime;
+       cputime_t cutime, cstime, utime, stime;
        unsigned long rsslim = 0;
        char tcomm[sizeof(task->comm)];
        unsigned long flags;
@@ -387,8 +402,7 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
 
        sigemptyset(&sigign);
        sigemptyset(&sigcatch);
-       cutime = cstime = cputime_zero;
-       utime = stime = 0;
+       cutime = cstime = utime = stime = cputime_zero;
 
        rcu_read_lock();
        if (lock_task_sighand(task, &flags)) {
@@ -414,15 +428,15 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
                        do {
                                min_flt += t->min_flt;
                                maj_flt += t->maj_flt;
-                               utime += task_utime(t);
-                               stime += task_stime(t);
+                               utime = cputime_add(utime, task_utime(t));
+                               stime = cputime_add(stime, task_stime(t));
                                t = next_thread(t);
                        } while (t != task);
 
                        min_flt += sig->min_flt;
                        maj_flt += sig->maj_flt;
-                       utime += cputime_to_clock_t(sig->utime);
-                       stime += cputime_to_clock_t(sig->stime);
+                       utime = cputime_add(utime, sig->utime);
+                       stime = cputime_add(stime, sig->stime);
                }
 
                sid = signal_session(sig);
@@ -471,8 +485,8 @@ static int do_task_stat(struct task_struct *task, char *buffer, int whole)
                cmin_flt,
                maj_flt,
                cmaj_flt,
-               utime,
-               stime,
+               cputime_to_clock_t(utime),
+               cputime_to_clock_t(stime),
                cputime_to_clock_t(cutime),
                cputime_to_clock_t(cstime),
                priority,
index 7b941abbcde09401404a73c5298b73611eea23da..a8e293d3003432ff493eff7069f32305fa35006a 100644 (file)
@@ -56,12 +56,18 @@ static int signalfd_lock(struct signalfd_ctx *ctx, struct signalfd_lockctx *lk)
                sighand = lock_task_sighand(lk->tsk, &lk->flags);
        rcu_read_unlock();
 
-       if (sighand && !ctx->tsk) {
+       if (!sighand)
+               return 0;
+
+       if (!ctx->tsk) {
                unlock_task_sighand(lk->tsk, &lk->flags);
-               sighand = NULL;
+               return 0;
        }
 
-       return sighand != NULL;
+       if (lk->tsk->tgid == current->tgid)
+               lk->tsk = current;
+
+       return 1;
 }
 
 static void signalfd_unlock(struct signalfd_lockctx *lk)
@@ -331,7 +337,7 @@ asmlinkage long sys_signalfd(int ufd, sigset_t __user *user_mask, size_t sizemas
 
                init_waitqueue_head(&ctx->wqh);
                ctx->sigmask = sigmask;
-               ctx->tsk = current;
+               ctx->tsk = current->group_leader;
 
                sighand = current->sighand;
                /*
index 135353f8a296773605fe9ca744fe4612fff0f678..5afe2a26f5d877f69b268c1fb827aa8dbea55ea0 100644 (file)
@@ -248,12 +248,7 @@ int sysfs_create_bin_file(struct kobject * kobj, struct bin_attribute * attr)
 
 void sysfs_remove_bin_file(struct kobject * kobj, struct bin_attribute * attr)
 {
-       if (sysfs_hash_and_remove(kobj->sd, attr->attr.name) < 0) {
-               printk(KERN_ERR "%s: "
-                       "bad dentry or inode or no such file: \"%s\"\n",
-                       __FUNCTION__, attr->attr.name);
-               dump_stack();
-       }
+       sysfs_hash_and_remove(kobj->sd, attr->attr.name);
 }
 
 EXPORT_SYMBOL_GPL(sysfs_create_bin_file);
index 048e6054c2fdb7b60f35945eb87067463eee5896..83e76b3813c9af674fb2c6fda9c2f891c89e0964 100644 (file)
@@ -762,12 +762,15 @@ static int sysfs_count_nlink(struct sysfs_dirent *sd)
 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
                                struct nameidata *nd)
 {
+       struct dentry *ret = NULL;
        struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
        struct sysfs_dirent * sd;
        struct bin_attribute *bin_attr;
        struct inode *inode;
        int found = 0;
 
+       mutex_lock(&sysfs_mutex);
+
        for (sd = parent_sd->s_children; sd; sd = sd->s_sibling) {
                if (sysfs_type(sd) &&
                    !strcmp(sd->s_name, dentry->d_name.name)) {
@@ -778,14 +781,14 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
 
        /* no such entry */
        if (!found)
-               return NULL;
+               goto out_unlock;
 
        /* attach dentry and inode */
        inode = sysfs_get_inode(sd);
-       if (!inode)
-               return ERR_PTR(-ENOMEM);
-
-       mutex_lock(&sysfs_mutex);
+       if (!inode) {
+               ret = ERR_PTR(-ENOMEM);
+               goto out_unlock;
+       }
 
        if (inode->i_state & I_NEW) {
                /* initialize inode according to type */
@@ -815,9 +818,9 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
        sysfs_instantiate(dentry, inode);
        sysfs_attach_dentry(sd, dentry);
 
+ out_unlock:
        mutex_unlock(&sysfs_mutex);
-
-       return NULL;
+       return ret;
 }
 
 const struct inode_operations sysfs_dir_inode_operations = {
@@ -942,6 +945,8 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd,
        if (error)
                goto out_drop;
 
+       mutex_lock(&sysfs_mutex);
+
        dup_name = sd->s_name;
        sd->s_name = new_name;
 
@@ -949,8 +954,6 @@ int sysfs_rename_dir(struct kobject *kobj, struct sysfs_dirent *new_parent_sd,
        d_add(new_dentry, NULL);
        d_move(sd->s_dentry, new_dentry);
 
-       mutex_lock(&sysfs_mutex);
-
        sysfs_unlink_sibling(sd);
        sysfs_get(new_parent_sd);
        sysfs_put(sd->s_parent);
index e30d4b3bd83610d40628e70345dc786f09e75c3a..64bb92bb677338ec3c2ee872e0431719fb16bc91 100644 (file)
@@ -255,6 +255,8 @@ static inline void memset_io(volatile void __iomem *addr, unsigned char val,
        memset((void __force *)addr, val, count);
 }
 
+#define mmiowb()
+
 #define IO_SPACE_LIMIT 0xffffffff
 
 extern void __iomem *__ioremap(unsigned long offset, size_t size,
index bb82e70cde8d048fb01c3594b0233ba8c9d83fbd..0e680f47209fbc87ca98f90683f8cc57510d10e8 100644 (file)
@@ -27,13 +27,7 @@ static __inline__ void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  */
 static __inline__ pgd_t *pgd_alloc(struct mm_struct *mm)
 {
-       unsigned int pgd_size = (USER_PTRS_PER_PGD * sizeof(pgd_t));
-       pgd_t *pgd = kmalloc(pgd_size, GFP_KERNEL);
-
-       if (pgd)
-               memset(pgd, 0, pgd_size);
-
-       return pgd;
+       return kcalloc(USER_PTRS_PER_PGD, sizeof(pgd_t), GFP_KERNEL);
 }
 
 static inline void pgd_free(pgd_t *pgd)
@@ -44,18 +38,9 @@ static inline void pgd_free(pgd_t *pgd)
 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
                                          unsigned long address)
 {
-       int count = 0;
        pte_t *pte;
 
-       do {
-               pte = (pte_t *) __get_free_page(GFP_KERNEL | __GFP_REPEAT);
-               if (pte)
-                       clear_page(pte);
-               else {
-                       current->state = TASK_UNINTERRUPTIBLE;
-                       schedule_timeout(HZ);
-               }
-       } while (!pte && (count++ < 10));
+       pte = (pte_t *)get_zeroed_page(GFP_KERNEL | __GFP_REPEAT);
 
        return pte;
 }
@@ -63,18 +48,9 @@ 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)
 {
-       int count = 0;
        struct page *pte;
 
-       do {
-               pte = alloc_pages(GFP_KERNEL, 0);
-               if (pte)
-                       clear_page(page_address(pte));
-               else {
-                       current->state = TASK_UNINTERRUPTIBLE;
-                       schedule_timeout(HZ);
-               }
-       } while (!pte && (count++ < 10));
+       pte = alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
 
        return pte;
 }
index c07bdd10b8911733ce4c3fd7ebb3816db36951f6..018f6e2a02425d4acc7372fc0111c701332cff68 100644 (file)
@@ -32,8 +32,6 @@
 #define USER_PTRS_PER_PGD      (TASK_SIZE / PGDIR_SIZE)
 #define FIRST_USER_ADDRESS     0
 
-#define PTE_PHYS_MASK  0x1ffff000
-
 #ifndef __ASSEMBLY__
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 extern void paging_init(void);
@@ -265,7 +263,7 @@ static inline pte_t pte_mkyoung(pte_t pte)
  * trivial.
  */
 #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-#define pte_page(x)    phys_to_page(pte_val(x) & PTE_PHYS_MASK)
+#define pte_page(x)    (pfn_to_page(pte_pfn(x)))
 
 /*
  * Mark the prot value as uncacheable and unbufferable
index 7b65b5b0003439c15852912d587ffc2a80ec293c..e8e0bd64112052dd82fc9723e7695d17940dedc4 100644 (file)
@@ -112,6 +112,9 @@ extern void __iomem * __ioremap(unsigned long offset, unsigned long size, unsign
  * writew/writel functions and the other mmio helpers. The returned
  * address is not guaranteed to be usable directly as a virtual
  * address. 
+ *
+ * If the area you are trying to map is a PCI BAR you should have a
+ * look at pci_iomap().
  */
 
 static inline void __iomem * ioremap(unsigned long offset, unsigned long size)
index 673b85c9b273e7f13dc241c5a019e48a8fb11b8d..3ebb17893aa524d49d4bcdec543148ee7e72a326 100644 (file)
@@ -15,7 +15,8 @@
 
 static inline void wait_for_init_deassert(atomic_t *deassert)
 {
-       while (!atomic_read(deassert));
+       while (!atomic_read(deassert))
+               cpu_relax();
        return;
 }
 
index efc903b7348668f6152ee7c252fd5e17290bc3c0..84ff58314501cfa3c83cf4a7024ad19ec00f9fa9 100644 (file)
@@ -31,7 +31,8 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
 static inline void wait_for_init_deassert(atomic_t *deassert)
 {
 #ifdef WAKE_SECONDARY_VIA_INIT
-       while (!atomic_read(deassert));
+       while (!atomic_read(deassert))
+               cpu_relax();
 #endif
        return;
 }
index ff30c98f87b023290c8d1355f3873540e7d6c2ae..70a958a8e3816f738558ca33b00a49d3e14cd3a0 100644 (file)
@@ -33,11 +33,12 @@ extern int nmi_watchdog_tick (struct pt_regs * regs, unsigned reason);
 
 extern atomic_t nmi_active;
 extern unsigned int nmi_watchdog;
-#define NMI_DEFAULT     -1
+#define NMI_DISABLED    -1
 #define NMI_NONE       0
 #define NMI_IO_APIC    1
 #define NMI_LOCAL_APIC 2
 #define NMI_INVALID    3
+#define NMI_DEFAULT    NMI_DISABLED
 
 struct ctl_table;
 struct file;
index 1fc3b83325dab4fa0c20fb46abbc6d16228b34fa..50c2b83fd5a04cccf72996add92fae7b2ba0b407 100644 (file)
@@ -55,7 +55,7 @@ ia64_atomic64_add (__s64 i, atomic64_t *v)
 
        do {
                CMPXCHG_BUGCHECK(v);
-               old = atomic_read(v);
+               old = atomic64_read(v);
                new = old + i;
        } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old);
        return new;
@@ -83,7 +83,7 @@ ia64_atomic64_sub (__s64 i, atomic64_t *v)
 
        do {
                CMPXCHG_BUGCHECK(v);
-               old = atomic_read(v);
+               old = atomic64_read(v);
                new = old - i;
        } while (ia64_cmpxchg(acq, v, old, new, sizeof(atomic64_t)) != old);
        return new;
index efa1b8f7251d9f12eeab86432eae8aac919b6646..bba5baa3c7fc97ca9fcfd9f63d26d118c8c24a98 100644 (file)
@@ -124,6 +124,11 @@ static inline void ia64_resend_irq(unsigned int vector)
 extern irq_desc_t irq_desc[NR_IRQS];
 
 #ifndef CONFIG_IA64_GENERIC
+static inline ia64_vector __ia64_irq_to_vector(int irq)
+{
+       return irq_cfg[irq].vector;
+}
+
 static inline unsigned int
 __ia64_local_vector_to_irq (ia64_vector vec)
 {
@@ -145,7 +150,7 @@ __ia64_local_vector_to_irq (ia64_vector vec)
 static inline ia64_vector
 irq_to_vector (int irq)
 {
-       return irq_cfg[irq].vector;
+       return platform_irq_to_vector(irq);
 }
 
 /*
index 5cf8bf1e805e6931ee51ea50f24c82fa336b7cda..c201a2020aa49e1a8a30deff30892b143e3dc157 100644 (file)
@@ -30,6 +30,7 @@ typedef void ia64_mv_send_ipi_t (int, int, int, int);
 typedef void ia64_mv_timer_interrupt_t (int, void *);
 typedef void ia64_mv_global_tlb_purge_t (struct mm_struct *, unsigned long, unsigned long, unsigned long);
 typedef void ia64_mv_tlb_migrate_finish_t (struct mm_struct *);
+typedef u8 ia64_mv_irq_to_vector (int);
 typedef unsigned int ia64_mv_local_vector_to_irq (u8);
 typedef char *ia64_mv_pci_get_legacy_mem_t (struct pci_bus *);
 typedef int ia64_mv_pci_legacy_read_t (struct pci_bus *, u16 port, u32 *val,
@@ -145,6 +146,7 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *);
 #  define platform_dma_sync_sg_for_device ia64_mv.dma_sync_sg_for_device
 #  define platform_dma_mapping_error           ia64_mv.dma_mapping_error
 #  define platform_dma_supported       ia64_mv.dma_supported
+#  define platform_irq_to_vector       ia64_mv.irq_to_vector
 #  define platform_local_vector_to_irq ia64_mv.local_vector_to_irq
 #  define platform_pci_get_legacy_mem  ia64_mv.pci_get_legacy_mem
 #  define platform_pci_legacy_read     ia64_mv.pci_legacy_read
@@ -198,6 +200,7 @@ struct ia64_machine_vector {
        ia64_mv_dma_sync_sg_for_device *dma_sync_sg_for_device;
        ia64_mv_dma_mapping_error *dma_mapping_error;
        ia64_mv_dma_supported *dma_supported;
+       ia64_mv_irq_to_vector *irq_to_vector;
        ia64_mv_local_vector_to_irq *local_vector_to_irq;
        ia64_mv_pci_get_legacy_mem_t *pci_get_legacy_mem;
        ia64_mv_pci_legacy_read_t *pci_legacy_read;
@@ -247,6 +250,7 @@ struct ia64_machine_vector {
        platform_dma_sync_sg_for_device,        \
        platform_dma_mapping_error,                     \
        platform_dma_supported,                 \
+       platform_irq_to_vector,                 \
        platform_local_vector_to_irq,           \
        platform_pci_get_legacy_mem,            \
        platform_pci_legacy_read,               \
@@ -366,6 +370,9 @@ extern ia64_mv_dma_supported                swiotlb_dma_supported;
 #ifndef platform_dma_supported
 # define  platform_dma_supported       swiotlb_dma_supported
 #endif
+#ifndef platform_irq_to_vector
+# define platform_irq_to_vector                __ia64_irq_to_vector
+#endif
 #ifndef platform_local_vector_to_irq
 # define platform_local_vector_to_irq  __ia64_local_vector_to_irq
 #endif
index 2d36f6840f0bffb5d7719df6b01e66aad1606dc3..7f21249fba3fd2193b811c156484f1e2b95a1120 100644 (file)
@@ -2,6 +2,7 @@
 
 extern ia64_mv_send_ipi_t ia64_send_ipi;
 extern ia64_mv_global_tlb_purge_t ia64_global_tlb_purge;
+extern ia64_mv_irq_to_vector __ia64_irq_to_vector;
 extern ia64_mv_local_vector_to_irq __ia64_local_vector_to_irq;
 extern ia64_mv_pci_get_legacy_mem_t ia64_pci_get_legacy_mem;
 extern ia64_mv_pci_legacy_read_t ia64_pci_legacy_read;
index eaa2fce0fecde4e836def5815e13b619cb5db9ee..61439a7f5b08a76263983695d23ec7562bbea96e 100644 (file)
@@ -35,6 +35,7 @@ extern ia64_mv_send_ipi_t sn2_send_IPI;
 extern ia64_mv_timer_interrupt_t sn_timer_interrupt;
 extern ia64_mv_global_tlb_purge_t sn2_global_tlb_purge;
 extern ia64_mv_tlb_migrate_finish_t    sn_tlb_migrate_finish;
+extern ia64_mv_irq_to_vector sn_irq_to_vector;
 extern ia64_mv_local_vector_to_irq sn_local_vector_to_irq;
 extern ia64_mv_pci_get_legacy_mem_t sn_pci_get_legacy_mem;
 extern ia64_mv_pci_legacy_read_t sn_pci_legacy_read;
@@ -104,6 +105,7 @@ extern ia64_mv_pci_fixup_bus_t              sn_pci_fixup_bus;
 #define platform_readw_relaxed         __sn_readw_relaxed
 #define platform_readl_relaxed         __sn_readl_relaxed
 #define platform_readq_relaxed         __sn_readq_relaxed
+#define platform_irq_to_vector         sn_irq_to_vector
 #define platform_local_vector_to_irq   sn_local_vector_to_irq
 #define platform_pci_get_legacy_mem    sn_pci_get_legacy_mem
 #define platform_pci_legacy_read       sn_pci_legacy_read
index 0c48929ab444e07aeb8e1e5f7580add25ff85fe2..b8d2f4be7fd74d97b8dcf3f38aefd02b440a921b 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 9e6d0d6debdb39e5617902ed6231047edc0bb743..1431ea0b59e01e5f31c4c075893bf2a4397f55b3 100644 (file)
@@ -4,17 +4,15 @@
 
 #ifdef __KERNEL__
 
+#include <linux/const.h>
+
 /* PAGE_SHIFT determines the page size */
 #ifndef CONFIG_SUN3
 #define PAGE_SHIFT     (12)
 #else
 #define PAGE_SHIFT     (13)
 #endif
-#ifdef __ASSEMBLY__
-#define PAGE_SIZE      (1 << PAGE_SHIFT)
-#else
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#endif
+#define PAGE_SIZE      (_AC(1, UL) << PAGE_SHIFT)
 #define PAGE_MASK      (~(PAGE_SIZE-1))
 
 #include <asm/setup.h>
@@ -27,6 +25,8 @@
 
 #ifndef __ASSEMBLY__
 
+#include <linux/compiler.h>
+
 #include <asm/module.h>
 
 #define get_user_page(vaddr)           __get_free_page(GFP_KERNEL)
index 8455f778b601e64aa02f47be6c59a4cce35423ea..4453ec379c5dabd2e723f8b8105ca6066e2b6f14 100644 (file)
@@ -38,12 +38,8 @@ static inline void wrusp(unsigned long usp)
 #ifndef CONFIG_SUN3
 #define TASK_SIZE      (0xF0000000UL)
 #else
-#ifdef __ASSEMBLY__
-#define TASK_SIZE      (0x0E000000)
-#else
 #define TASK_SIZE      (0x0E000000UL)
 #endif
-#endif
 
 /* This decides where the kernel will search for a free chunk of vm
  * space during mmap's.
index 0e520f328f53c58e5fd16b7200eca540286f7a24..8c14170996bb743da077b9dee455de66c6ad38b6 100644 (file)
@@ -141,6 +141,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define    BOTHER 0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -156,10 +157,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                      /* Shift from CBAUD to CIBAUD */
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index 00edabd7616869015ce4751f190de23483738d2b..0823032e404572fe7bbeca5a639fddd0595248b2 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 e1e6a1d2333aeb295bb22de8c18e0da4ecd27491..46251016e8212bdfef68b594e6ad1cf0e939248d 100644 (file)
@@ -65,4 +65,6 @@ extern unsigned int kobjsize(const void *objp);
 #define        VMALLOC_START   0
 #define        VMALLOC_END     0xffffffff
 
+#include <asm-generic/pgtable.h>
+
 #endif /* _M68KNOMMU_PGTABLE_H */
index 064405c207bf33753864c17ae7161e36afc52dc5..8fdc2b47afb9889d08030a5952ae655d4ce85553 100644 (file)
 #define MCSR_ICPERR    0x40000000UL /* I-Cache Parity Error */
 #define MCSR_DCP_PERR  0x20000000UL /* D-Cache Push Parity Error */
 #define MCSR_DCPERR    0x10000000UL /* D-Cache Parity Error */
-#define MCSR_GL_CI     0x00010000UL /* Guarded Load or Cache-Inhibited stwcx. */
 #define MCSR_BUS_IAERR         0x00000080UL /* Instruction Address Error */
 #define MCSR_BUS_RAERR         0x00000040UL /* Read Address Error */
 #define MCSR_BUS_WAERR         0x00000020UL /* Write Address Error */
 #define MCSR_BUS_WBERR         0x00000004UL /* Write Data Bus Error */
 #define MCSR_BUS_IPERR         0x00000002UL /* Instruction parity Error */
 #define MCSR_BUS_RPERR         0x00000001UL /* Read parity Error */
+
+/* e500 parts may set unused bits in MCSR; mask these off */
+#define MCSR_MASK      (MCSR_MCP | MCSR_ICPERR | MCSR_DCP_PERR | \
+                       MCSR_DCPERR | MCSR_BUS_IAERR | MCSR_BUS_RAERR | \
+                       MCSR_BUS_WAERR | MCSR_BUS_IBERR | MCSR_BUS_RBERR | \
+                       MCSR_BUS_WBERR | MCSR_BUS_IPERR | MCSR_BUS_RPERR)
 #endif
 #ifdef CONFIG_E200
 #define MCSR_MCP       0x80000000UL /* Machine Check Input Pin */
 #define MCSR_BUS_DRERR         0x00000008UL /* Read Bus Error on data load */
 #define MCSR_BUS_WRERR         0x00000004UL /* Write Bus Error on buffered
                                        store or cache line push */
+
+/* e200 parts may set unused bits in MCSR; mask these off */
+#define MCSR_MASK      (MCSR_MCP | MCSR_CP_PERR | MCSR_CPERR | \
+                       MCSR_EXCP_ERR | MCSR_BUS_IRERR | MCSR_BUS_DRERR | \
+                       MCSR_BUS_WRERR)
 #endif
 
 /* Bit definitions for the DBSR. */
index ea486952f778cb323c4072c8aa1cefaea7f858b2..2d184655bc5d9b3cad0e9c1bddec672af404c042 100644 (file)
@@ -67,8 +67,17 @@ typedef struct {
 
 #endif /* __GNUC__ */
 
-#define atomic_read(v)          ((v)->counter)
-#define atomic_set(v,i)         (((v)->counter) = (i))
+static inline int atomic_read(const atomic_t *v)
+{
+       barrier();
+       return v->counter;
+}
+
+static inline void atomic_set(atomic_t *v, int i)
+{
+       v->counter = i;
+       barrier();
+}
 
 static __inline__ int atomic_add_return(int i, atomic_t * v)
 {
@@ -182,8 +191,17 @@ typedef struct {
 
 #endif /* __GNUC__ */
 
-#define atomic64_read(v)          ((v)->counter)
-#define atomic64_set(v,i)         (((v)->counter) = (i))
+static inline long long atomic64_read(const atomic64_t *v)
+{
+       barrier();
+       return v->counter;
+}
+
+static inline void atomic64_set(atomic64_t *v, long long i)
+{
+       v->counter = i;
+       barrier();
+}
 
 static __inline__ long long atomic64_add_return(long long i, atomic64_t * v)
 {
index f738d2827582e01408559acf690cf49399d72ddf..1982fb3441644f3f178691c69aebd66b8e9dfb26 100644 (file)
@@ -258,19 +258,6 @@ struct ciw {
 /* Sick revalidation of device. */
 #define CIO_REVALIDATE 0x0008
 
-struct diag210 {
-       __u16 vrdcdvno : 16;   /* device number (input) */
-       __u16 vrdclen  : 16;   /* data block length (input) */
-       __u32 vrdcvcla : 8;    /* virtual device class (output) */
-       __u32 vrdcvtyp : 8;    /* virtual device type (output) */
-       __u32 vrdcvsta : 8;    /* virtual device status (output) */
-       __u32 vrdcvfla : 8;    /* virtual device flags (output) */
-       __u32 vrdcrccl : 8;    /* real device class (output) */
-       __u32 vrdccrty : 8;    /* real device type (output) */
-       __u32 vrdccrmd : 8;    /* real device model (output) */
-       __u32 vrdccrft : 8;    /* real device feature (output) */
-} __attribute__ ((packed,aligned(4)));
-
 struct ccw_dev_id {
        u8 ssid;
        u16 devno;
@@ -285,8 +272,6 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
        return 0;
 }
 
-extern int diag210(struct diag210 *addr);
-
 extern void wait_cons_dev(void);
 
 extern void css_schedule_reprobe(void);
diff --git a/include/asm-s390/diag.h b/include/asm-s390/diag.h
new file mode 100644 (file)
index 0000000..72b2e2f
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * s390 diagnose functions
+ *
+ * Copyright IBM Corp. 2007
+ * Author(s): Michael Holzheu <holzheu@de.ibm.com>
+ */
+
+#ifndef _ASM_S390_DIAG_H
+#define _ASM_S390_DIAG_H
+
+/*
+ * Diagnose 10: Release pages
+ */
+extern void diag10(unsigned long addr);
+
+/*
+ * Diagnose 14: Input spool file manipulation
+ */
+extern int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode);
+
+/*
+ * Diagnose 210: Get information about a virtual device
+ */
+struct diag210 {
+       u16 vrdcdvno;   /* device number (input) */
+       u16 vrdclen;    /* data block length (input) */
+       u8 vrdcvcla;    /* virtual device class (output) */
+       u8 vrdcvtyp;    /* virtual device type (output) */
+       u8 vrdcvsta;    /* virtual device status (output) */
+       u8 vrdcvfla;    /* virtual device flags (output) */
+       u8 vrdcrccl;    /* real device class (output) */
+       u8 vrdccrty;    /* real device type (output) */
+       u8 vrdccrmd;    /* real device model (output) */
+       u8 vrdccrft;    /* real device feature (output) */
+} __attribute__((packed, aligned(4)));
+
+extern int diag210(struct diag210 *addr);
+
+#endif /* _ASM_S390_DIAG_H */
index 56c8a6c80e2e18183b6bc4c11c0b53771bcee9f5..e45d3c9a4b7ee65a99f684a4e24ddbd9d0e17432 100644 (file)
@@ -19,8 +19,6 @@
 
 #define check_pgt_cache()      do {} while (0)
 
-extern void diag10(unsigned long addr);
-
 /*
  * Page allocation orders.
  */
index 6f492ac3fa136b8f9fdd55e91e0c21fc9633235b..84fefdaa01a53d8863fb145d0ff39e416328a597 100644 (file)
@@ -160,6 +160,25 @@ static inline void dma_sync_single_for_device(struct device *dev,
        dma_sync_single(dev, dma_handle, size, dir);
 }
 
+static inline void dma_sync_single_range_for_cpu(struct device *dev,
+                                                dma_addr_t dma_handle,
+                                                unsigned long offset,
+                                                size_t size,
+                                                enum dma_data_direction direction)
+{
+       dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction);
+}
+
+static inline void dma_sync_single_range_for_device(struct device *dev,
+                                                   dma_addr_t dma_handle,
+                                                   unsigned long offset,
+                                                   size_t size,
+                                                   enum dma_data_direction direction)
+{
+       dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
+}
+
+
 static inline void dma_sync_sg_for_cpu(struct device *dev,
                                       struct scatterlist *sg, int nelems,
                                       enum dma_data_direction dir)
index d505f357f819b61e96023d09e36fae1c2fa2b725..de4309960207779eb216d7d06ecc4cb9a6d32778 100644 (file)
@@ -141,6 +141,24 @@ static inline void dma_sync_single_for_device(struct device *dev,
        dma_sync_single(dev, dma_handle, size, dir);
 }
 
+static inline void dma_sync_single_range_for_cpu(struct device *dev,
+                                                dma_addr_t dma_handle,
+                                                unsigned long offset,
+                                                size_t size,
+                                                enum dma_data_direction direction)
+{
+       dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction);
+}
+
+static inline void dma_sync_single_range_for_device(struct device *dev,
+                                                   dma_addr_t dma_handle,
+                                                   unsigned long offset,
+                                                   size_t size,
+                                                   enum dma_data_direction direction)
+{
+       dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
+}
+
 static inline void dma_sync_sg_for_cpu(struct device *dev,
                                       struct scatterlist *sg, int nelems,
                                       enum dma_data_direction dir)
index d036e4419d7958a1245c631cd19d4ea76f3a9a65..27d076c46964a9fd537f7b8cca8c7169b9c8aa13 100644 (file)
@@ -68,7 +68,6 @@ struct sbus_dev {
 /* This struct describes the SBus(s) found on this machine. */
 struct sbus_bus {
        struct of_device        ofdev;
-       void                    *iommu;         /* Opaque IOMMU cookie */
        struct sbus_dev         *devices;       /* Link to devices on this SBus */
        struct sbus_bus         *next;          /* next SBus, if more than one SBus */
        int                     prom_node;      /* PROM device tree node for this SBus */
index ecfc86a4a725caee13da26b328f2992975534a92..266a42b8f99fad61d7f907bad23d306b4846846d 100644 (file)
@@ -203,4 +203,10 @@ extern struct task_struct *last_task_used_math;
 #define FP_INHIBIT_RESULTS ((last_task_used_math->thread.fsr >> 23) & _fex)
 #endif
 
+#ifdef CONFIG_SMP
+#define FP_TRAPPING_EXCEPTIONS ((current->thread.fsr >> 23) & 0x1f)
+#else
+#define FP_TRAPPING_EXCEPTIONS ((last_task_used_math->thread.fsr >> 23) & 0x1f)
+#endif
+
 #endif
index 303d85e2f82ee003b1a6866b766ebb1731975d0d..8653e86650097b4de2d7635a6231a1e684fd082c 100644 (file)
@@ -70,6 +70,7 @@
 #define HWCAP_SPARC_V9         16
 #define HWCAP_SPARC_ULTRA3     32
 #define HWCAP_SPARC_BLKINIT    64
+#define HWCAP_SPARC_N2         128
 
 /*
  * These are used to set parameters in the core dumps.
@@ -155,8 +156,13 @@ static inline unsigned int sparc64_elf_hwcap(void)
 
        if (tlb_type == cheetah || tlb_type == cheetah_plus)
                cap |= HWCAP_SPARC_ULTRA3;
-       else if (tlb_type == hypervisor)
-               cap |= HWCAP_SPARC_BLKINIT;
+       else if (tlb_type == hypervisor) {
+               if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 ||
+                   sun4v_chip_type == SUN4V_CHIP_NIAGARA2)
+                       cap |= HWCAP_SPARC_BLKINIT;
+               if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2)
+                       cap |= HWCAP_SPARC_N2;
+       }
 
        return cap;
 }
index caf8750792ff16e2cad134a3969f9cafb6455a6b..a1f53a4da405dd7496bee581e88a609a57455756 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <linux/compiler.h>
 
+register unsigned long __local_per_cpu_offset asm("g5");
+
 #ifdef CONFIG_SMP
 
 #define setup_per_cpu_areas()                  do { } while (0)
@@ -23,8 +25,6 @@ extern unsigned long __per_cpu_shift;
     __typeof__(type) per_cpu__##name                           \
     ____cacheline_aligned_in_smp
 
-register unsigned long __local_per_cpu_offset asm("g5");
-
 /* var is in discarded region: offset to particular copy we want */
 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)))
 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset))
index 89d42431efb58e0cba76b903623c678cdfaf1e67..c9331b02d9c85df91a829906c1dfa5b1c79af04e 100644 (file)
@@ -88,4 +88,6 @@
 
 #define FP_INHIBIT_RESULTS ((current_thread_info()->xfsr[0] >> 23) & _fex)
 
+#define FP_TRAPPING_EXCEPTIONS ((current_thread_info()->xfsr[0] >> 23) & 0x1f)
+
 #endif
index 64891cb10f05c572c6ec1e9a86f0eef14271a4b9..3f175fa7e6d2311095a7256a4a7da2a9d7a447cd 100644 (file)
@@ -141,7 +141,6 @@ do {                                                \
         * not preserve it's value.  Hairy, but it lets us remove 2 loads
         * and 2 stores in this critical code path.  -DaveM
         */
-#define EXTRA_CLOBBER ,"%l1"
 #define switch_to(prev, next, last)                                    \
 do {   if (test_thread_flag(TIF_PERFCTR)) {                            \
                unsigned long __tmp;                                    \
@@ -164,33 +163,34 @@ do {      if (test_thread_flag(TIF_PERFCTR)) {                            \
        "stx    %%i6, [%%sp + 2047 + 0x70]\n\t"                         \
        "stx    %%i7, [%%sp + 2047 + 0x78]\n\t"                         \
        "rdpr   %%wstate, %%o5\n\t"                                     \
-       "stx    %%o6, [%%g6 + %3]\n\t"                                  \
-       "stb    %%o5, [%%g6 + %2]\n\t"                                  \
-       "rdpr   %%cwp, %%o5\n\t"                                        \
+       "stx    %%o6, [%%g6 + %6]\n\t"                                  \
        "stb    %%o5, [%%g6 + %5]\n\t"                                  \
-       "mov    %1, %%g6\n\t"                                           \
-       "ldub   [%1 + %5], %%g1\n\t"                                    \
+       "rdpr   %%cwp, %%o5\n\t"                                        \
+       "stb    %%o5, [%%g6 + %8]\n\t"                                  \
+       "mov    %4, %%g6\n\t"                                           \
+       "ldub   [%4 + %8], %%g1\n\t"                                    \
        "wrpr   %%g1, %%cwp\n\t"                                        \
-       "ldx    [%%g6 + %3], %%o6\n\t"                                  \
-       "ldub   [%%g6 + %2], %%o5\n\t"                                  \
-       "ldub   [%%g6 + %4], %%o7\n\t"                                  \
+       "ldx    [%%g6 + %6], %%o6\n\t"                                  \
+       "ldub   [%%g6 + %5], %%o5\n\t"                                  \
+       "ldub   [%%g6 + %7], %%o7\n\t"                                  \
        "wrpr   %%o5, 0x0, %%wstate\n\t"                                \
        "ldx    [%%sp + 2047 + 0x70], %%i6\n\t"                         \
        "ldx    [%%sp + 2047 + 0x78], %%i7\n\t"                         \
-       "ldx    [%%g6 + %6], %%g4\n\t"                                  \
+       "ldx    [%%g6 + %9], %%g4\n\t"                                  \
        "brz,pt %%o7, 1f\n\t"                                           \
        " mov   %%g7, %0\n\t"                                           \
        "b,a ret_from_syscall\n\t"                                      \
        "1:\n\t"                                                        \
-       : "=&r" (last)                                                  \
+       : "=&r" (last), "=r" (current), "=r" (current_thread_info_reg), \
+         "=r" (__local_per_cpu_offset)                                 \
        : "0" (task_thread_info(next)),                                 \
          "i" (TI_WSTATE), "i" (TI_KSP), "i" (TI_NEW_CHILD),            \
          "i" (TI_CWP), "i" (TI_TASK)                                   \
        : "cc",                                                         \
                "g1", "g2", "g3",                   "g7",               \
-                     "l2", "l3", "l4", "l5", "l6", "l7",               \
+               "l1", "l2", "l3", "l4", "l5", "l6", "l7",               \
          "i0", "i1", "i2", "i3", "i4", "i5",                           \
-         "o0", "o1", "o2", "o3", "o4", "o5",       "o7" EXTRA_CLOBBER);\
+         "o0", "o1", "o2", "o3", "o4", "o5",       "o7");              \
        /* If you fuck with this, update ret_from_syscall code too. */  \
        if (test_thread_flag(TIF_PERFCTR)) {                            \
                write_pcr(current_thread_info()->pcr_reg);              \
index 5fb3c0de5cccba5a421a3820bb551619d489fad9..65b6acf3bb593af5edd4460d9a8bd3cdb32ff924 100644 (file)
@@ -64,11 +64,12 @@ extern int setup_nmi_watchdog(char *);
 
 extern atomic_t nmi_active;
 extern unsigned int nmi_watchdog;
-#define NMI_DEFAULT    -1
+#define NMI_DISABLED    -1
 #define NMI_NONE       0
 #define NMI_IO_APIC    1
 #define NMI_LOCAL_APIC 2
 #define NMI_INVALID    3
+#define NMI_DEFAULT    NMI_DISABLED
 
 struct ctl_table;
 struct file;
index 4bbd8601b8f04980f2f3adf7bd8aaadf053e02cb..d6579df8dadf629968c704c774081fa4ef422586 100644 (file)
@@ -63,8 +63,8 @@
 #define AUDIT_ADD_RULE         1011    /* Add syscall filtering rule */
 #define AUDIT_DEL_RULE         1012    /* Delete syscall filtering rule */
 #define AUDIT_LIST_RULES       1013    /* List syscall filtering rules */
-#define AUDIT_TTY_GET          1014    /* Get TTY auditing status */
-#define AUDIT_TTY_SET          1015    /* Set TTY auditing status */
+#define AUDIT_TTY_GET          1016    /* Get TTY auditing status */
+#define AUDIT_TTY_SET          1017    /* Set TTY auditing status */
 
 #define AUDIT_FIRST_USER_MSG   1100    /* Userspace messages mostly uninteresting to kernel */
 #define AUDIT_USER_AVC         1107    /* We filter this differently */
index d71d0121b7f96d65040472365ca7ad34f3694f1c..c792b4fd1588f1b36c987ebebc45e25489de6021 100644 (file)
@@ -1285,13 +1285,14 @@ void ide_init_sg_cmd(ide_drive_t *, struct request *);
 #define BAD_DMA_DRIVE          0
 #define GOOD_DMA_DRIVE         1
 
-#ifdef CONFIG_BLK_DEV_IDEDMA
 struct drive_list_entry {
        const char *id_model;
        const char *id_firmware;
 };
 
 int ide_in_drive_list(struct hd_driveid *, const struct drive_list_entry *);
+
+#ifdef CONFIG_BLK_DEV_IDEDMA
 int __ide_dma_bad_drive(ide_drive_t *);
 int __ide_dma_good_drive(ide_drive_t *);
 u8 ide_max_dma_mode(ide_drive_t *);
@@ -1312,7 +1313,6 @@ void ide_dma_host_off(ide_drive_t *);
 void ide_dma_off_quietly(ide_drive_t *);
 void ide_dma_host_on(ide_drive_t *);
 extern int __ide_dma_on(ide_drive_t *);
-extern int __ide_dma_check(ide_drive_t *);
 extern int ide_dma_setup(ide_drive_t *);
 extern void ide_dma_start(ide_drive_t *);
 extern int __ide_dma_end(ide_drive_t *);
index 506ad20c18f8736b355530cc01fa91ca149fe322..8bdb16bfe5fb698eb2d8e0a0fe8c6785434e53d0 100644 (file)
@@ -161,4 +161,7 @@ static inline void con_schedule_flip(struct tty_struct *t)
        schedule_delayed_work(&t->buf.work, 0);
 }
 
+/* mac_hid.c */
+extern int mac_hid_mouse_emulate_buttons(int, unsigned int, int);
+
 #endif
index e147cf50529f84c78e75d1c458da40b386c00ca9..5bdd656e88cf598a9e41758dc54bf35a644a2e69 100644 (file)
@@ -166,7 +166,7 @@ extern enum zone_type policy_zone;
 
 static inline void check_highest_zone(enum zone_type k)
 {
-       if (k > policy_zone)
+       if (k > policy_zone && k != ZONE_MOVABLE)
                policy_zone = k;
 }
 
index 655094dc9440fd5e8fdce2ab4f0380b83d72dd0e..1692dd6cb9153bd6fa2fcdf13f2352e84500eeae 100644 (file)
@@ -1042,7 +1042,7 @@ static inline void vma_nonlinear_insert(struct vm_area_struct *vma,
 }
 
 /* mmap.c */
-extern int __vm_enough_memory(long pages, int cap_sys_admin);
+extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin);
 extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
        unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
 extern struct vm_area_struct *vma_merge(struct mm_struct *,
index 3ea68cd3b61f29a04b708c8c8f4043cccf6b2450..4e5627379b0935b306261d7c9666786fa5357f24 100644 (file)
@@ -410,6 +410,24 @@ struct zonelist {
 #endif
 };
 
+#ifdef CONFIG_NUMA
+/*
+ * Only custom zonelists like MPOL_BIND need to be filtered as part of
+ * policies. As described in the comment for struct zonelist_cache, these
+ * zonelists will not have a zlcache so zlcache_ptr will not be set. Use
+ * that to determine if the zonelists needs to be filtered or not.
+ */
+static inline int alloc_should_filter_zonelist(struct zonelist *zonelist)
+{
+       return !zonelist->zlcache_ptr;
+}
+#else
+static inline int alloc_should_filter_zonelist(struct zonelist *zonelist)
+{
+       return 0;
+}
+#endif /* CONFIG_NUMA */
+
 #ifdef CONFIG_ARCH_POPULATES_NODE_MAP
 struct node_active_region {
        unsigned long start_pfn;
index 2ada8ee316b3b04e94ee25d3a9c1939384771c2b..4dc5fa8be781760aa307cff8d01488f270c47b9a 100644 (file)
@@ -159,7 +159,8 @@ struct ap_device_id {
 
 #define AP_DEVICE_ID_MATCH_DEVICE_TYPE         0x01
 
-#define ACPI_ID_LEN    9
+#define ACPI_ID_LEN    16 /* only 9 bytes needed here, 16 bytes are used */
+                          /* to workaround crosscompile issues */
 
 struct acpi_device_id {
        __u8 id[ACPI_ID_LEN];
index e7d8d4e19a533d3c9056d83aeb3902810a081160..038a0dc7273abee4592afe4b6c793722c06d2cf4 100644 (file)
@@ -557,6 +557,7 @@ int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
 int pcix_get_max_mmrbc(struct pci_dev *dev);
 int pcix_get_mmrbc(struct pci_dev *dev);
 int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc);
+int pcie_get_readrq(struct pci_dev *dev);
 int pcie_set_readrq(struct pci_dev *dev, int rq);
 void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
 int __must_check pci_assign_resource(struct pci_dev *dev, int i);
@@ -578,6 +579,9 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state);
 pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state);
 int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int enable);
 
+/* Functions for PCI Hotplug drivers to use */
+int pci_bus_find_capability (struct pci_bus *bus, unsigned int devfn, int cap);
+
 /* Helper functions for low-level code (drivers/pci/setup-[bus,res].c) */
 void pci_bus_assign_resources(struct pci_bus *bus);
 void pci_bus_size_bridges(struct pci_bus *bus);
index 07fc57429b58363367ec869a57db397daa0689c8..f77944e432f2d10aca19cc68a92d02f9d2f95df7 100644 (file)
 #define PCI_DEVICE_ID_ATI_RS400_166     0x5a32
 #define PCI_DEVICE_ID_ATI_RS400_200     0x5a33
 #define PCI_DEVICE_ID_ATI_RS480         0x5950
+#define PCI_DEVICE_ID_ATI_RD580                0x5952
+#define PCI_DEVICE_ID_ATI_RX790                0x5957
+#define PCI_DEVICE_ID_ATI_RS690                0x7910
 /* ATI IXP Chipset */
 #define PCI_DEVICE_ID_ATI_IXP200_IDE   0x4349
 #define PCI_DEVICE_ID_ATI_IXP200_SMBUS 0x4353
 #define PCI_DEVICE_ID_MPC8568          0x0021
 #define PCI_DEVICE_ID_MPC8567E         0x0022
 #define PCI_DEVICE_ID_MPC8567          0x0023
-#define PCI_DEVICE_ID_MPC8544E         0x0030
-#define PCI_DEVICE_ID_MPC8544          0x0031
+#define PCI_DEVICE_ID_MPC8533E         0x0030
+#define PCI_DEVICE_ID_MPC8533          0x0031
+#define PCI_DEVICE_ID_MPC8544E         0x0032
+#define PCI_DEVICE_ID_MPC8544          0x0033
 #define PCI_DEVICE_ID_MPC8641          0x7010
 #define PCI_DEVICE_ID_MPC8641D         0x7011
 
index 682ef87da6eb953348986927598eeaf8b2264ec4..ba78807eab919e5c9229c09476251df643d6012e 100644 (file)
@@ -681,7 +681,7 @@ enum cpu_idle_type {
 #define SCHED_LOAD_SHIFT       10
 #define SCHED_LOAD_SCALE       (1L << SCHED_LOAD_SHIFT)
 
-#define SCHED_LOAD_SCALE_FUZZ  (SCHED_LOAD_SCALE >> 1)
+#define SCHED_LOAD_SCALE_FUZZ  SCHED_LOAD_SCALE
 
 #ifdef CONFIG_SMP
 #define SD_LOAD_BALANCE                1       /* Do load balancing on this domain. */
@@ -1388,7 +1388,8 @@ extern void sched_exec(void);
 #define sched_exec()   {}
 #endif
 
-extern void sched_clock_unstable_event(void);
+extern void sched_clock_idle_sleep_event(void);
+extern void sched_clock_idle_wakeup_event(u64 delta_ns);
 
 #ifdef CONFIG_HOTPLUG_CPU
 extern void idle_task_exit(void);
index c11dc8aa0351e25be90e967a59d4f93b0f5e73b0..1a15526e9f677ce6bb402234cc4d000d5c7f7ad0 100644 (file)
@@ -54,7 +54,7 @@ extern int cap_inode_removexattr(struct dentry *dentry, char *name);
 extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
 extern void cap_task_reparent_to_init (struct task_struct *p);
 extern int cap_syslog (int type);
-extern int cap_vm_enough_memory (long pages);
+extern int cap_vm_enough_memory (struct mm_struct *mm, long pages);
 
 struct msghdr;
 struct sk_buff;
@@ -1125,6 +1125,7 @@ struct request_sock;
  *     Return 0 if permission is granted.
  * @vm_enough_memory:
  *     Check permissions for allocating a new virtual mapping.
+ *     @mm contains the mm struct it is being added to.
  *      @pages contains the number of pages.
  *     Return 0 if permission is granted.
  *
@@ -1169,7 +1170,7 @@ struct security_operations {
        int (*quota_on) (struct dentry * dentry);
        int (*syslog) (int type);
        int (*settime) (struct timespec *ts, struct timezone *tz);
-       int (*vm_enough_memory) (long pages);
+       int (*vm_enough_memory) (struct mm_struct *mm, long pages);
 
        int (*bprm_alloc_security) (struct linux_binprm * bprm);
        void (*bprm_free_security) (struct linux_binprm * bprm);
@@ -1469,10 +1470,14 @@ static inline int security_settime(struct timespec *ts, struct timezone *tz)
        return security_ops->settime(ts, tz);
 }
 
-
 static inline int security_vm_enough_memory(long pages)
 {
-       return security_ops->vm_enough_memory(pages);
+       return security_ops->vm_enough_memory(current->mm, pages);
+}
+
+static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
+{
+       return security_ops->vm_enough_memory(mm, pages);
 }
 
 static inline int security_bprm_alloc (struct linux_binprm *bprm)
@@ -2219,7 +2224,12 @@ static inline int security_settime(struct timespec *ts, struct timezone *tz)
 
 static inline int security_vm_enough_memory(long pages)
 {
-       return cap_vm_enough_memory(pages);
+       return cap_vm_enough_memory(current->mm, pages);
+}
+
+static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
+{
+       return cap_vm_enough_memory(mm, pages);
 }
 
 static inline int security_bprm_alloc (struct linux_binprm *bprm)
index ed3408b400f1e80674281925930f4e1238952c02..f9457861937c52042345bd7625023c36f626d64f 100644 (file)
@@ -10,6 +10,8 @@
 #include <linux/tiocl.h>
 #include <linux/vt_buffer.h>
 
+struct tty_struct;
+
 extern struct vc_data *sel_cons;
 
 extern void clear_selection(void);
index 1c5ed7d92b0ff7c52546294e09a98397d00491ca..96c0d93fc2cacd753926559b100c4791a621909c 100644 (file)
 #define UART_LSR_PE            0x04 /* Parity error indicator */
 #define UART_LSR_OE            0x02 /* Overrun error indicator */
 #define UART_LSR_DR            0x01 /* Receiver data ready */
+#define UART_LSR_BRK_ERROR_BITS        0x1E /* BI, FE, PE, OE bits */
 
 #define UART_MSR       6       /* In:  Modem Status Register */
 #define UART_MSR_DCD           0x80 /* Data Carrier Detect */
index c66c8a3410b926d10b0c2ac55e45d09277af96be..ae9b24c12f6a36b43ce0868255d38b9ad7228cbd 100644 (file)
@@ -617,7 +617,6 @@ struct v4l2_framebuffer
 #define V4L2_FBUF_CAP_LOCAL_ALPHA      0x0010
 #define V4L2_FBUF_CAP_GLOBAL_ALPHA     0x0020
 #define V4L2_FBUF_CAP_LOCAL_INV_ALPHA  0x0040
-#define V4L2_FBUF_CAP_GLOBAL_INV_ALPHA 0x0080
 /*  Flags for the 'flags' field. */
 #define V4L2_FBUF_FLAG_PRIMARY         0x0001
 #define V4L2_FBUF_FLAG_OVERLAY         0x0002
@@ -625,7 +624,6 @@ struct v4l2_framebuffer
 #define V4L2_FBUF_FLAG_LOCAL_ALPHA     0x0008
 #define V4L2_FBUF_FLAG_GLOBAL_ALPHA    0x0010
 #define V4L2_FBUF_FLAG_LOCAL_INV_ALPHA 0x0020
-#define V4L2_FBUF_FLAG_GLOBAL_INV_ALPHA        0x0040
 
 struct v4l2_clip
 {
index 93780abd01bc60a4d23e09f90f90a684de2ebe52..bb46e7645d537234bdc44221bccfa8e0e332e4c5 100644 (file)
@@ -145,13 +145,16 @@ do {                                                              \
              {                                                 \
                X##_e = 1;                                      \
                _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
+               FP_SET_EXCEPTION(FP_EX_INEXACT);                \
              }                                                 \
            else                                                \
              {                                                 \
                X##_e = 0;                                      \
                _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);             \
-               FP_SET_EXCEPTION(FP_EX_UNDERFLOW);              \
              }                                                 \
+           if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) ||          \
+               (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))     \
+               FP_SET_EXCEPTION(FP_EX_UNDERFLOW);              \
          }                                                     \
        else                                                    \
          {                                                     \
index d02eb64a865bb4acbe81a148584fd92341cd14ae..a6f873b45f98aa04466fcea158c13711157b0edb 100644 (file)
 #define FP_INHIBIT_RESULTS 0
 #endif
 
+#ifndef FP_TRAPPING_EXCEPTIONS
+#define FP_TRAPPING_EXCEPTIONS 0
+#endif
+
 #define FP_SET_EXCEPTION(ex)                           \
   _fex |= (ex)
   
 #define FP_UNSET_EXCEPTION(ex)                         \
   _fex &= ~(ex)
 
+#define FP_CUR_EXCEPTIONS                              \
+  (_fex)
+
 #define FP_CLEAR_EXCEPTIONS                            \
   _fex = 0
 
index 30712ddd8a5e6b6cc1add751f95948e9a3382bbd..8ec3799e42e17066dbd2d22e8f90d5069f91c283 100644 (file)
@@ -39,6 +39,8 @@
 #if !defined( IB_MAD_H )
 #define IB_MAD_H
 
+#include <linux/list.h>
+
 #include <rdma/ib_verbs.h>
 
 /* Management base version */
index 0627a6aa282ac220660d625cd832b34ed939de63..4bea182d7116c4aa80e863ed2d5a59fed24967e0 100644 (file)
@@ -46,6 +46,8 @@
 #include <linux/mm.h>
 #include <linux/dma-mapping.h>
 #include <linux/kref.h>
+#include <linux/list.h>
+#include <linux/rwsem.h>
 
 #include <asm/atomic.h>
 #include <asm/scatterlist.h>
@@ -731,11 +733,6 @@ struct ib_udata {
        size_t       outlen;
 };
 
-#define IB_UMEM_MAX_PAGE_CHUNK                                         \
-       ((PAGE_SIZE - offsetof(struct ib_umem_chunk, page_list)) /      \
-        ((void *) &((struct ib_umem_chunk *) 0)->page_list[1] -        \
-         (void *) &((struct ib_umem_chunk *) 0)->page_list[0]))
-
 struct ib_pd {
        struct ib_device       *device;
        struct ib_uobject      *uobject;
index 3401293359e82f7bff1c9b3beb3d87e3e23707ae..04f3ffb8d9d4adfd03b314db621f43c8c3ab11fe 100644 (file)
@@ -2023,7 +2023,7 @@ int __audit_signal_info(int sig, struct task_struct *t)
                axp->d.next = ctx->aux_pids;
                ctx->aux_pids = (void *)axp;
        }
-       BUG_ON(axp->pid_count > AUDIT_AUX_PIDS);
+       BUG_ON(axp->pid_count >= AUDIT_AUX_PIDS);
 
        axp->target_pid[axp->pid_count] = t->tgid;
        selinux_get_task_sid(t, &axp->target_sid[axp->pid_count]);
index 3415e9ad1391adc6422c9324b8efdc1bbd6c7ce2..e8935b195e8809fa1a23484d5007feb27887fd63 100644 (file)
@@ -1670,6 +1670,7 @@ pi_faulted:
                                         attempt);
                if (ret)
                        goto out;
+               uval = 0;
                goto retry_unlocked;
        }
 
index 203a518b6f1437d134c115ce7d43e1e04e1d5c25..853aefbd184bfeec03783686abd92bf3ee0de36e 100644 (file)
@@ -462,7 +462,9 @@ void free_irq(unsigned int irq, void *dev_id)
                 * We do this after actually deregistering it, to make sure that
                 * a 'real' IRQ doesn't run in parallel with our fake
                 */
+               local_irq_save(flags);
                handler(irq, dev_id);
+               local_irq_restore(flags);
        }
 #endif
 }
index 33c04ad511750bc693410d9866b98dcfa6c2cb3d..db0ead0363e2504be6760e73cbef5a2b981a8565 100644 (file)
@@ -784,8 +784,7 @@ EXPORT_SYMBOL_GPL(symbol_put_addr);
 static ssize_t show_refcnt(struct module_attribute *mattr,
                           struct module *mod, char *buffer)
 {
-       /* sysfs holds a reference */
-       return sprintf(buffer, "%u\n", module_refcount(mod)-1);
+       return sprintf(buffer, "%u\n", module_refcount(mod));
 }
 
 static struct module_attribute refcnt = {
index 55b3761edaa9afe42273a7b3adaa42b1547fb5ee..7a15afb73ed0352d9ee31f6d03334255c716e5a9 100644 (file)
@@ -547,9 +547,9 @@ sys_timer_create(const clockid_t which_clock,
                                new_timer->it_process = process;
                                list_add(&new_timer->list,
                                         &process->signal->posix_timers);
-                               spin_unlock_irqrestore(&process->sighand->siglock, flags);
                                if (new_timer->it_sigev_notify == (SIGEV_SIGNAL|SIGEV_THREAD_ID))
                                        get_task_struct(process);
+                               spin_unlock_irqrestore(&process->sighand->siglock, flags);
                        } else {
                                spin_unlock_irqrestore(&process->sighand->siglock, flags);
                                process = NULL;
@@ -605,13 +605,14 @@ static struct k_itimer * lock_timer(timer_t timer_id, unsigned long *flags)
        timr = (struct k_itimer *) idr_find(&posix_timers_id, (int) timer_id);
        if (timr) {
                spin_lock(&timr->it_lock);
-               spin_unlock(&idr_lock);
 
                if ((timr->it_id != timer_id) || !(timr->it_process) ||
                                timr->it_process->tgid != current->tgid) {
-                       unlock_timer(timr, *flags);
+                       spin_unlock(&timr->it_lock);
+                       spin_unlock_irqrestore(&idr_lock, *flags);
                        timr = NULL;
-               }
+               } else
+                       spin_unlock(&idr_lock);
        } else
                spin_unlock_irqrestore(&idr_lock, *flags);
 
index bd2cd062878d6fb1f4b40895ddee7dbe9f9468da..8451dfc31d25b4e0e6903e84a55de230fb5363e2 100644 (file)
@@ -1083,6 +1083,19 @@ int unregister_console(struct console *console)
 }
 EXPORT_SYMBOL(unregister_console);
 
+static int __init disable_boot_consoles(void)
+{
+       if (console_drivers != NULL) {
+               if (console_drivers->flags & CON_BOOT) {
+                       printk(KERN_INFO "turn off boot console %s%d\n",
+                               console_drivers->name, console_drivers->index);
+                       return unregister_console(console_drivers);
+               }
+       }
+       return 0;
+}
+late_initcall(disable_boot_consoles);
+
 /**
  * tty_write_message - write a message to a certain tty, not just the console.
  * @tty: the destination tty_struct
index 45e17b83b7f10ba8a99bf04e3a3bbd2571a345f3..96e9b82246d2b24ec17aec763d0943a2d05d5f86 100644 (file)
@@ -262,7 +262,8 @@ struct rq {
        s64 clock_max_delta;
 
        unsigned int clock_warps, clock_overflows;
-       unsigned int clock_unstable_events;
+       u64 idle_clock;
+       unsigned int clock_deep_idle_events;
        u64 tick_timestamp;
 
        atomic_t nr_iowait;
@@ -556,18 +557,40 @@ static inline struct rq *this_rq_lock(void)
 }
 
 /*
- * CPU frequency is/was unstable - start new by setting prev_clock_raw:
+ * We are going deep-idle (irqs are disabled):
  */
-void sched_clock_unstable_event(void)
+void sched_clock_idle_sleep_event(void)
 {
-       unsigned long flags;
-       struct rq *rq;
+       struct rq *rq = cpu_rq(smp_processor_id());
 
-       rq = task_rq_lock(current, &flags);
-       rq->prev_clock_raw = sched_clock();
-       rq->clock_unstable_events++;
-       task_rq_unlock(rq, &flags);
+       spin_lock(&rq->lock);
+       __update_rq_clock(rq);
+       spin_unlock(&rq->lock);
+       rq->clock_deep_idle_events++;
 }
+EXPORT_SYMBOL_GPL(sched_clock_idle_sleep_event);
+
+/*
+ * We just idled delta nanoseconds (called with irqs disabled):
+ */
+void sched_clock_idle_wakeup_event(u64 delta_ns)
+{
+       struct rq *rq = cpu_rq(smp_processor_id());
+       u64 now = sched_clock();
+
+       rq->idle_clock += delta_ns;
+       /*
+        * Override the previous timestamp and ignore all
+        * sched_clock() deltas that occured while we idled,
+        * and use the PM-provided delta_ns to advance the
+        * rq clock:
+        */
+       spin_lock(&rq->lock);
+       rq->prev_clock_raw = now;
+       rq->clock += delta_ns;
+       spin_unlock(&rq->lock);
+}
+EXPORT_SYMBOL_GPL(sched_clock_idle_wakeup_event);
 
 /*
  * resched_task - mark a task 'to be rescheduled now'.
@@ -2494,7 +2517,7 @@ group_next:
         * a think about bumping its value to force at least one task to be
         * moved
         */
-       if (*imbalance + SCHED_LOAD_SCALE_FUZZ < busiest_load_per_task/2) {
+       if (*imbalance + SCHED_LOAD_SCALE_FUZZ < busiest_load_per_task) {
                unsigned long tmp, pwr_now, pwr_move;
                unsigned int imbn;
 
@@ -3020,6 +3043,7 @@ static inline void rebalance_domains(int cpu, enum cpu_idle_type idle)
        struct sched_domain *sd;
        /* Earliest time when we have to do rebalance again */
        unsigned long next_balance = jiffies + 60*HZ;
+       int update_next_balance = 0;
 
        for_each_domain(cpu, sd) {
                if (!(sd->flags & SD_LOAD_BALANCE))
@@ -3056,8 +3080,10 @@ static inline void rebalance_domains(int cpu, enum cpu_idle_type idle)
                if (sd->flags & SD_SERIALIZE)
                        spin_unlock(&balancing);
 out:
-               if (time_after(next_balance, sd->last_balance + interval))
+               if (time_after(next_balance, sd->last_balance + interval)) {
                        next_balance = sd->last_balance + interval;
+                       update_next_balance = 1;
+               }
 
                /*
                 * Stop the load balance at this level. There is another
@@ -3067,7 +3093,14 @@ out:
                if (!balance)
                        break;
        }
-       rq->next_balance = next_balance;
+
+       /*
+        * next_balance will be updated only when there is a need.
+        * When the cpu is attached to null domain for ex, it will not be
+        * updated.
+        */
+       if (likely(update_next_balance))
+               rq->next_balance = next_balance;
 }
 
 /*
@@ -4890,7 +4923,7 @@ static inline void sched_init_granularity(void)
        if (sysctl_sched_granularity > gran_limit)
                sysctl_sched_granularity = gran_limit;
 
-       sysctl_sched_runtime_limit = sysctl_sched_granularity * 4;
+       sysctl_sched_runtime_limit = sysctl_sched_granularity * 8;
        sysctl_sched_wakeup_granularity = sysctl_sched_granularity / 2;
 }
 
@@ -5234,15 +5267,16 @@ static void migrate_dead_tasks(unsigned int dead_cpu)
 static struct ctl_table sd_ctl_dir[] = {
        {
                .procname       = "sched_domain",
-               .mode           = 0755,
+               .mode           = 0555,
        },
        {0,},
 };
 
 static struct ctl_table sd_ctl_root[] = {
        {
+               .ctl_name       = CTL_KERN,
                .procname       = "kernel",
-               .mode           = 0755,
+               .mode           = 0555,
                .child          = sd_ctl_dir,
        },
        {0,},
@@ -5318,7 +5352,7 @@ static ctl_table *sd_alloc_ctl_cpu_table(int cpu)
        for_each_domain(cpu, sd) {
                snprintf(buf, 32, "domain%d", i);
                entry->procname = kstrdup(buf, GFP_KERNEL);
-               entry->mode = 0755;
+               entry->mode = 0555;
                entry->child = sd_alloc_ctl_domain_table(sd);
                entry++;
                i++;
@@ -5338,7 +5372,7 @@ static void init_sched_domain_sysctl(void)
        for (i = 0; i < cpu_num; i++, entry++) {
                snprintf(buf, 32, "cpu%d", i);
                entry->procname = kstrdup(buf, GFP_KERNEL);
-               entry->mode = 0755;
+               entry->mode = 0555;
                entry->child = sd_alloc_ctl_cpu_table(i);
        }
        sd_sysctl_header = register_sysctl_table(sd_ctl_root);
index 87e524762b858725207b540c2f4e51a2f230fde3..ab18f45f2ab23f6b76f6d8bf9a99e170892c9542 100644 (file)
@@ -154,10 +154,11 @@ static void print_cpu(struct seq_file *m, int cpu)
        P(next_balance);
        P(curr->pid);
        P(clock);
+       P(idle_clock);
        P(prev_clock_raw);
        P(clock_warps);
        P(clock_overflows);
-       P(clock_unstable_events);
+       P(clock_deep_idle_events);
        P(clock_max_delta);
        P(cpu_load[0]);
        P(cpu_load[1]);
index b27c01a66448a4bee1e023ccd809b28b0b719b36..ad63109e413c1819804f326f50ff262dce9b171a 100644 (file)
@@ -378,7 +378,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
        /* We only dequeue private signals from ourselves, we don't let
         * signalfd steal them
         */
-       if (tsk == current)
+       if (likely(tsk == current))
                signr = __dequeue_signal(&tsk->pending, mask, info);
        if (!signr) {
                signr = __dequeue_signal(&tsk->signal->shared_pending,
@@ -425,7 +425,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
                if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT))
                        tsk->signal->flags |= SIGNAL_STOP_DEQUEUED;
        }
-       if ( signr &&
+       if (signr && likely(tsk == current) &&
             ((info->si_code & __SI_MASK) == __SI_TIMER) &&
             info->si_sys_private){
                /*
index 8bdb8c07e04f60a7c299b6907bd947bbdfe3f699..9029690f4faed4ba0928812ac4a05dbbf006add6 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/capability.h>
 #include <linux/ctype.h>
 #include <linux/utsname.h>
-#include <linux/capability.h>
 #include <linux/smp_lock.h>
 #include <linux/fs.h>
 #include <linux/init.h>
index e5c2c514174ad28e4f2354ef94bb8da1b46bfa46..ba3d104994d914643e4c673b1058e0c4a57cd813 100644 (file)
@@ -138,4 +138,7 @@ config HAS_DMA
        depends on !NO_DMA
        default y
 
+config CHECK_SIGNATURE
+       bool
+
 endmenu
index d9e5f1cd0bfbb4e4cedae4d68ec7af423c80fa79..6b0ba8cf4e5f9ab3fbc8fef0b4ead9c88af7cf4a 100644 (file)
@@ -21,7 +21,8 @@ CFLAGS_kobject_uevent.o += -DDEBUG
 endif
 
 obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
-obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o check_signature.o
+obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o
+obj-$(CONFIG_CHECK_SIGNATURE) += check_signature.o
 obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
 obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
index a57d262a5ed9b574a27445b8f72b6d6030a85c3b..864f2ec1966ec46fe66d5e30634c28ccf4ea26a8 100644 (file)
@@ -240,7 +240,20 @@ void ioport_unmap(void __iomem *addr)
 EXPORT_SYMBOL(ioport_map);
 EXPORT_SYMBOL(ioport_unmap);
 
-/* Create a virtual mapping cookie for a PCI BAR (memory or IO) */
+/**
+ * pci_iomap - create a virtual mapping cookie for a PCI BAR
+ * @dev: PCI device that owns the BAR
+ * @bar: BAR number
+ * @maxlen: length of the memory to map
+ *
+ * Using this function you will get a __iomem address to your device BAR.
+ * You can access it using ioread*() and iowrite*(). These functions hide
+ * the details if this is a MMIO or PIO address space and will just do what
+ * you expect from them in the correct way.
+ *
+ * @maxlen specifies the maximum length to map. If you want to get access to
+ * the complete BAR without checking for its length first, pass %0 here.
+ * */
 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
 {
        unsigned long start = pci_resource_start(dev, bar);
index d7ca59d66c5929194da1b9c0197d924aba2106cd..de4cf458d6e1979432aad46613d0816146347fc1 100644 (file)
@@ -643,7 +643,7 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
                        spin_unlock(&mm->page_table_lock);
                        ret = hugetlb_fault(mm, vma, vaddr, 0);
                        spin_lock(&mm->page_table_lock);
-                       if (!(ret & VM_FAULT_MAJOR))
+                       if (!(ret & VM_FAULT_ERROR))
                                continue;
 
                        remainder = 0;
index 71b84b45154afc59efa6e0ffd3f088603693417a..172abffeb2e386fe08a333051934b73fcd98707a 100644 (file)
@@ -149,7 +149,7 @@ static struct zonelist *bind_zonelist(nodemask_t *nodes)
           lower zones etc. Avoid empty zones because the memory allocator
           doesn't like them. If you implement node hot removal you
           have to fix that. */
-       k = policy_zone;
+       k = MAX_NR_ZONES - 1;
        while (1) {
                for_each_node_mask(nd, *nodes) { 
                        struct zone *z = &NODE_DATA(nd)->node_zones[k];
index b6537211b9ccfdfcf1f7d9d63c5891ba89e483e7..0d40e66c841b2d2cad8e03ebc6d5e16491b0774b 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -93,7 +93,7 @@ atomic_t vm_committed_space = ATOMIC_INIT(0);
  * Note this is a helper function intended to be used by LSMs which
  * wish to use this logic.
  */
-int __vm_enough_memory(long pages, int cap_sys_admin)
+int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
 {
        unsigned long free, allowed;
 
@@ -166,7 +166,7 @@ int __vm_enough_memory(long pages, int cap_sys_admin)
 
        /* Don't let a single process grow too big:
           leave 3% of the size of this process for other processes */
-       allowed -= current->mm->total_vm / 32;
+       allowed -= mm->total_vm / 32;
 
        /*
         * cast `allowed' as a signed long because vm_committed_space
@@ -2077,7 +2077,7 @@ int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
        if (__vma && __vma->vm_start < vma->vm_end)
                return -ENOMEM;
        if ((vma->vm_flags & VM_ACCOUNT) &&
-            security_vm_enough_memory(vma_pages(vma)))
+            security_vm_enough_memory_mm(mm, vma_pages(vma)))
                return -ENOMEM;
        vma_link(mm, vma, prev, rb_link, rb_parent);
        return 0;
index 9eef6a3985554fa9b69c54a0334865e54247e478..8ed0cb43118a1fc0586b165b49e6ad8e7c8a8efb 100644 (file)
@@ -1270,7 +1270,7 @@ EXPORT_SYMBOL(get_unmapped_area);
  * Note this is a helper function intended to be used by LSMs which
  * wish to use this logic.
  */
-int __vm_enough_memory(long pages, int cap_sys_admin)
+int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
 {
        unsigned long free, allowed;
 
index 3da85b81dabb32608fa065f8086de64f725f5af8..6427653023aabfb501a2c34d3cc18f39b686c532 100644 (file)
@@ -1157,6 +1157,7 @@ get_page_from_freelist(gfp_t gfp_mask, unsigned int order,
        nodemask_t *allowednodes = NULL;/* zonelist_cache approximation */
        int zlc_active = 0;             /* set if using zonelist_cache */
        int did_zlc_setup = 0;          /* just call zlc_setup() one time */
+       enum zone_type highest_zoneidx = -1; /* Gets set for policy zonelists */
 
 zonelist_scan:
        /*
@@ -1166,6 +1167,18 @@ zonelist_scan:
        z = zonelist->zones;
 
        do {
+               /*
+                * In NUMA, this could be a policy zonelist which contains
+                * zones that may not be allowed by the current gfp_mask.
+                * Check the zone is allowed by the current flags
+                */
+               if (unlikely(alloc_should_filter_zonelist(zonelist))) {
+                       if (highest_zoneidx == -1)
+                               highest_zoneidx = gfp_zone(gfp_mask);
+                       if (zone_idx(*z) > highest_zoneidx)
+                               continue;
+               }
+
                if (NUMA_BUILD && zlc_active &&
                        !zlc_zone_worth_trying(zonelist, z, allowednodes))
                                continue;
index a684778b2b41af38e06aa47e5fe66a7a988ad4c7..6f6abef83a1af82432305245755ab690c8363081 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -883,6 +883,7 @@ static void __slab_error(const char *function, struct kmem_cache *cachep,
   */
 
 static int use_alien_caches __read_mostly = 1;
+static int numa_platform __read_mostly = 1;
 static int __init noaliencache_setup(char *s)
 {
        use_alien_caches = 0;
@@ -1399,8 +1400,10 @@ void __init kmem_cache_init(void)
        int order;
        int node;
 
-       if (num_possible_nodes() == 1)
+       if (num_possible_nodes() == 1) {
                use_alien_caches = 0;
+               numa_platform = 0;
+       }
 
        for (i = 0; i < NUM_INIT_LISTS; i++) {
                kmem_list3_init(&initkmem_list3[i]);
@@ -3558,7 +3561,14 @@ static inline void __cache_free(struct kmem_cache *cachep, void *objp)
        check_irq_off();
        objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0));
 
-       if (cache_free_alien(cachep, objp))
+       /*
+        * Skip calling cache_free_alien() when the platform is not numa.
+        * This will avoid cache misses that happen while accessing slabp (which
+        * is per page memory  reference) to get nodeid. Instead use a global
+        * variable to skip the call, which is mostly likely to be present in
+        * the cache.
+        */
+       if (numa_platform && cache_free_alien(cachep, objp))
                return;
 
        if (likely(ac->avail < ac->limit)) {
index 69d02e3e439ec260ca273d39156ca31134232e8c..04151da399c6ce8c344409c2ce7fbf289ac645e5 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1877,9 +1877,16 @@ static struct kmem_cache_node * __init early_kmem_cache_node_alloc(gfp_t gfpflag
 
        BUG_ON(kmalloc_caches->size < sizeof(struct kmem_cache_node));
 
-       page = new_slab(kmalloc_caches, gfpflags | GFP_THISNODE, node);
+       page = new_slab(kmalloc_caches, gfpflags, node);
 
        BUG_ON(!page);
+       if (page_to_nid(page) != node) {
+               printk(KERN_ERR "SLUB: Unable to allocate memory from "
+                               "node %d\n", node);
+               printk(KERN_ERR "SLUB: Allocating a useless per node structure "
+                               "in order to be able to continue\n");
+       }
+
        n = page->freelist;
        BUG_ON(!n);
        page->freelist = get_freepointer(kmalloc_caches, n);
@@ -3112,7 +3119,7 @@ static int list_locations(struct kmem_cache *s, char *buf,
                unsigned long flags;
                struct page *page;
 
-               if (!atomic_read(&n->nr_slabs))
+               if (!atomic_long_read(&n->nr_slabs))
                        continue;
 
                spin_lock_irqsave(&n->list_lock, flags);
@@ -3247,7 +3254,7 @@ static unsigned long slab_objects(struct kmem_cache *s,
                }
 
                if (flags & SO_FULL) {
-                       int full_slabs = atomic_read(&n->nr_slabs)
+                       int full_slabs = atomic_long_read(&n->nr_slabs)
                                        - per_cpu[node]
                                        - n->nr_partial;
 
@@ -3283,7 +3290,7 @@ static int any_slab_objects(struct kmem_cache *s)
        for_each_node(node) {
                struct kmem_cache_node *n = get_node(s, node);
 
-               if (n->nr_partial || atomic_read(&n->nr_slabs))
+               if (n->nr_partial || atomic_long_read(&n->nr_slabs))
                        return 1;
        }
        return 0;
index 3047bf06c1f3256bd59965fc064a32b439135369..239f5a720d38fbe781751d2e3cb422cf49509d7d 100644 (file)
@@ -41,6 +41,15 @@ int page_to_nid(struct page *page)
        return section_to_node_table[page_to_section(page)];
 }
 EXPORT_SYMBOL(page_to_nid);
+
+static void set_section_nid(unsigned long section_nr, int nid)
+{
+       section_to_node_table[section_nr] = nid;
+}
+#else /* !NODE_NOT_IN_PAGE_FLAGS */
+static inline void set_section_nid(unsigned long section_nr, int nid)
+{
+}
 #endif
 
 #ifdef CONFIG_SPARSEMEM_EXTREME
@@ -68,10 +77,6 @@ static int __meminit sparse_index_init(unsigned long section_nr, int nid)
        struct mem_section *section;
        int ret = 0;
 
-#ifdef NODE_NOT_IN_PAGE_FLAGS
-       section_to_node_table[section_nr] = nid;
-#endif
-
        if (mem_section[root])
                return -EEXIST;
 
@@ -148,6 +153,7 @@ void __init memory_present(int nid, unsigned long start, unsigned long end)
                struct mem_section *ms;
 
                sparse_index_init(section, nid);
+               set_section_nid(section, nid);
 
                ms = __nr_to_section(section);
                if (!ms->section_mem_map)
index d419e10e3daa2dea26c6da35fb8e418b27629c6f..a6e65d024995ad49a1e9675dea9d36b343ceda60 100644 (file)
@@ -271,6 +271,12 @@ static void handle_write_error(struct address_space *mapping,
        unlock_page(page);
 }
 
+/* Request for sync pageout. */
+enum pageout_io {
+       PAGEOUT_IO_ASYNC,
+       PAGEOUT_IO_SYNC,
+};
+
 /* possible outcome of pageout() */
 typedef enum {
        /* failed to write page out, page is locked */
@@ -287,7 +293,8 @@ typedef enum {
  * pageout is called by shrink_page_list() for each dirty page.
  * Calls ->writepage().
  */
-static pageout_t pageout(struct page *page, struct address_space *mapping)
+static pageout_t pageout(struct page *page, struct address_space *mapping,
+                                               enum pageout_io sync_writeback)
 {
        /*
         * If the page is dirty, only perform writeback if that write
@@ -346,6 +353,15 @@ static pageout_t pageout(struct page *page, struct address_space *mapping)
                        ClearPageReclaim(page);
                        return PAGE_ACTIVATE;
                }
+
+               /*
+                * Wait on writeback if requested to. This happens when
+                * direct reclaiming a large contiguous area and the
+                * first attempt to free a range of pages fails.
+                */
+               if (PageWriteback(page) && sync_writeback == PAGEOUT_IO_SYNC)
+                       wait_on_page_writeback(page);
+
                if (!PageWriteback(page)) {
                        /* synchronous write or broken a_ops? */
                        ClearPageReclaim(page);
@@ -423,7 +439,8 @@ cannot_free:
  * shrink_page_list() returns the number of reclaimed pages
  */
 static unsigned long shrink_page_list(struct list_head *page_list,
-                                       struct scan_control *sc)
+                                       struct scan_control *sc,
+                                       enum pageout_io sync_writeback)
 {
        LIST_HEAD(ret_pages);
        struct pagevec freed_pvec;
@@ -458,8 +475,23 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                if (page_mapped(page) || PageSwapCache(page))
                        sc->nr_scanned++;
 
-               if (PageWriteback(page))
-                       goto keep_locked;
+               may_enter_fs = (sc->gfp_mask & __GFP_FS) ||
+                       (PageSwapCache(page) && (sc->gfp_mask & __GFP_IO));
+
+               if (PageWriteback(page)) {
+                       /*
+                        * Synchronous reclaim is performed in two passes,
+                        * first an asynchronous pass over the list to
+                        * start parallel writeback, and a second synchronous
+                        * pass to wait for the IO to complete.  Wait here
+                        * for any page for which writeback has already
+                        * started.
+                        */
+                       if (sync_writeback == PAGEOUT_IO_SYNC && may_enter_fs)
+                               wait_on_page_writeback(page);
+                       else
+                               goto keep_locked;
+               }
 
                referenced = page_referenced(page, 1);
                /* In active use or really unfreeable?  Activate it. */
@@ -478,8 +510,6 @@ static unsigned long shrink_page_list(struct list_head *page_list,
 #endif /* CONFIG_SWAP */
 
                mapping = page_mapping(page);
-               may_enter_fs = (sc->gfp_mask & __GFP_FS) ||
-                       (PageSwapCache(page) && (sc->gfp_mask & __GFP_IO));
 
                /*
                 * The page is mapped into the page tables of one or more
@@ -505,7 +535,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
                                goto keep_locked;
 
                        /* Page is dirty, try to write it out here */
-                       switch(pageout(page, mapping)) {
+                       switch (pageout(page, mapping, sync_writeback)) {
                        case PAGE_KEEP:
                                goto keep_locked;
                        case PAGE_ACTIVATE:
@@ -777,6 +807,7 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
                             (sc->order > PAGE_ALLOC_COSTLY_ORDER)?
                                             ISOLATE_BOTH : ISOLATE_INACTIVE);
                nr_active = clear_active_flags(&page_list);
+               __count_vm_events(PGDEACTIVATE, nr_active);
 
                __mod_zone_page_state(zone, NR_ACTIVE, -nr_active);
                __mod_zone_page_state(zone, NR_INACTIVE,
@@ -785,7 +816,29 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
                spin_unlock_irq(&zone->lru_lock);
 
                nr_scanned += nr_scan;
-               nr_freed = shrink_page_list(&page_list, sc);
+               nr_freed = shrink_page_list(&page_list, sc, PAGEOUT_IO_ASYNC);
+
+               /*
+                * If we are direct reclaiming for contiguous pages and we do
+                * not reclaim everything in the list, try again and wait
+                * for IO to complete. This will stall high-order allocations
+                * but that should be acceptable to the caller
+                */
+               if (nr_freed < nr_taken && !current_is_kswapd() &&
+                                       sc->order > PAGE_ALLOC_COSTLY_ORDER) {
+                       congestion_wait(WRITE, HZ/10);
+
+                       /*
+                        * The attempt at page out may have made some
+                        * of the pages active, mark them inactive again.
+                        */
+                       nr_active = clear_active_flags(&page_list);
+                       count_vm_events(PGDEACTIVATE, nr_active);
+
+                       nr_freed += shrink_page_list(&page_list, sc,
+                                                       PAGEOUT_IO_SYNC);
+               }
+
                nr_reclaimed += nr_freed;
                local_irq_disable();
                if (current_is_kswapd()) {
index 04ee43e7538f63af49529b31299747e7dac63f47..31128cb92a23fc9b3eba377b52705671a3c984c7 100644 (file)
@@ -55,6 +55,9 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev,
                .type = __constant_htons(ETH_P_SNAP),
        };
 
+       if (unlikely(!pskb_may_pull(skb, 5)))
+               goto drop;
+
        rcu_read_lock();
        proto = find_snap_client(skb_transport_header(skb));
        if (proto) {
@@ -62,14 +65,18 @@ static int snap_rcv(struct sk_buff *skb, struct net_device *dev,
                skb->transport_header += 5;
                skb_pull_rcsum(skb, 5);
                rc = proto->rcvfunc(skb, dev, &snap_packet_type, orig_dev);
-       } else {
-               skb->sk = NULL;
-               kfree_skb(skb);
-               rc = 1;
        }
-
        rcu_read_unlock();
+
+       if (unlikely(!proto))
+               goto drop;
+
+out:
        return rc;
+
+drop:
+       kfree_skb(skb);
+       goto out;
 }
 
 /*
index c0040c9064a144a0f7afb3e47411eaed6ce13576..bd08aa090763ad469e7e9c795f8057d8370e46f0 100644 (file)
@@ -319,7 +319,7 @@ static int vlandev_seq_show(struct seq_file *seq, void *offset)
        static const char fmt[] = "%30s %12lu\n";
        int i;
 
-       if ((vlandev == NULL) || (!(vlandev->priv_flags & IFF_802_1Q_VLAN)))
+       if (!(vlandev->priv_flags & IFF_802_1Q_VLAN))
                return 0;
 
        seq_printf(seq, "%s  VID: %d     REORDER_HDR: %i  dev->priv_flags: %hx\n",
index f2a041cb508a146264c9230368fa15acdcf9050b..d979d958ea199c88dea062fa9fa6f797872fda6a 100644 (file)
@@ -796,6 +796,7 @@ struct p9_fcall *p9_create_twrite_u(u32 fid, u64 offset, u32 count,
        if (err) {
                kfree(fc);
                fc = ERR_PTR(err);
+               goto error;
        }
 
        if (buf_check_overflow(bufp)) {
index acb038810f3995c2b5c4b7e742d91e34c33d83bc..5d70558c4c6124065cc3f6371473dd67ed0a9db9 100644 (file)
@@ -288,9 +288,10 @@ struct p9_conn *p9_conn_create(struct p9_transport *trans, int msize,
        m->extended = extended;
        m->trans = trans;
        m->tagpool = p9_idpool_create();
-       if (!m->tagpool) {
+       if (IS_ERR(m->tagpool)) {
+               mtmp = ERR_PTR(-ENOMEM);
                kfree(m);
-               return ERR_PTR(PTR_ERR(m->tagpool));
+               return mtmp;
        }
 
        m->err = 0;
@@ -308,8 +309,10 @@ struct p9_conn *p9_conn_create(struct p9_transport *trans, int msize,
        memset(&m->poll_waddr, 0, sizeof(m->poll_waddr));
        m->poll_task = NULL;
        n = p9_mux_poll_start(m);
-       if (n)
+       if (n) {
+               kfree(m);
                return ERR_PTR(n);
+       }
 
        n = trans->poll(trans, &m->pt);
        if (n & POLLIN) {
index 16be0c14780a18415bf203f617b8cb1c4cdb0808..8443af57a3740253f10ddcf505246165fee5e56a 100644 (file)
@@ -69,7 +69,6 @@ void ax25_protocol_release(unsigned int pid)
        if (protocol->pid == pid) {
                protocol_list = protocol->next;
                write_unlock_bh(&protocol_list_lock);
-               kfree(protocol);
                return;
        }
 
@@ -78,7 +77,6 @@ void ax25_protocol_release(unsigned int pid)
                        s = protocol->next;
                        protocol->next = protocol->next->next;
                        write_unlock_bh(&protocol_list_lock);
-                       kfree(s);
                        return;
                }
 
index 1ea2f86f7683b1b6ec101158db133bc37af7896f..1a430eccec9b8a25aef64971e812f4ec3483b242 100644 (file)
@@ -132,7 +132,7 @@ static void br_stp_start(struct net_bridge *br)
        } else {
                br->stp_enabled = BR_KERNEL_STP;
                printk(KERN_INFO "%s: starting userspace STP failed, "
-                               "staring kernel STP\n", br->dev->name);
+                               "starting kernel STP\n", br->dev->name);
 
                /* To start timers on any ports left in blocking */
                spin_lock_bh(&br->lock);
index 4f42263e0a8a8ba8e3e45d2979f34508b19ecbc4..c65f54e0e27febec09a75df717374ed05d015e11 100644 (file)
@@ -147,20 +147,27 @@ static ssize_t show_stp_state(struct device *d,
        return sprintf(buf, "%d\n", br->stp_enabled);
 }
 
-static void set_stp_state(struct net_bridge *br, unsigned long val)
-{
-       rtnl_lock();
-       spin_unlock_bh(&br->lock);
-       br_stp_set_enabled(br, val);
-       spin_lock_bh(&br->lock);
-       rtnl_unlock();
-}
 
 static ssize_t store_stp_state(struct device *d,
                               struct device_attribute *attr, const char *buf,
                               size_t len)
 {
-       return store_bridge_parm(d, buf, len, set_stp_state);
+       struct net_bridge *br = to_bridge(d);
+       char *endp;
+       unsigned long val;
+
+       if (!capable(CAP_NET_ADMIN))
+               return -EPERM;
+
+       val = simple_strtoul(buf, &endp, 0);
+       if (endp == buf)
+               return -EINVAL;
+
+       rtnl_lock();
+       br_stp_set_enabled(br, val);
+       rtnl_unlock();
+
+       return len;
 }
 static DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state,
                   store_stp_state);
index 2ab0a60046a5ca9c65a13164f10180a8f8833ced..c5e059352d43f1e4cfe8f17589825c82a28523a4 100644 (file)
@@ -948,7 +948,6 @@ int dev_ethtool(struct ifreq *ifr)
        return rc;
 }
 
-EXPORT_SYMBOL(dev_ethtool);
 EXPORT_SYMBOL(ethtool_op_get_link);
 EXPORT_SYMBOL(ethtool_op_get_sg);
 EXPORT_SYMBOL(ethtool_op_get_tso);
index 248d20f4c7c4edb45d94715b244331b760e77775..d29b88fe723cad5f0dc07d7d2158fac7c214c1b5 100644 (file)
@@ -298,7 +298,7 @@ static void ccid2_hc_tx_packet_sent(struct sock *sk, int more, unsigned int len)
                int rc;
 
                ccid2_pr_debug("allocating more space in history\n");
-               rc = ccid2_hc_tx_alloc_seq(hctx, CCID2_SEQBUF_LEN, GFP_KERNEL);
+               rc = ccid2_hc_tx_alloc_seq(hctx, CCID2_SEQBUF_LEN, gfp_any());
                BUG_ON(rc); /* XXX what do we do? */
 
                next = hctx->ccid2hctx_seqh->ccid2s_next;
index b5524f32ac2d5128aa0f3513c3fb45e3f52fe215..35c96bcc0f32d445649cc67901814ad11b003ead 100644 (file)
@@ -1146,6 +1146,9 @@ static void __exit econet_proto_exit(void)
                sock_release(udpsock);
 #endif
        unregister_netdevice_notifier(&econet_netdev_notifier);
+#ifdef CONFIG_ECONET_NATIVE
+       dev_remove_pack(&econet_packet_type);
+#endif
        sock_unregister(econet_family_ops.family);
        proto_unregister(&econet_proto);
 }
index a889ec3ec83abb7edb80a0c91241226b7e978dae..e14d41976c279c24f76b90de3a74d5abbefcef24 100644 (file)
@@ -104,7 +104,7 @@ static unsigned int ip_nat_sip(struct sk_buff **pskb,
        dataoff = ip_hdrlen(*pskb) + sizeof(struct udphdr);
        datalen = (*pskb)->len - dataoff;
        if (datalen < sizeof("SIP/2.0") - 1)
-               return NF_DROP;
+               return NF_ACCEPT;
 
        addr_map_init(ct, &map);
 
index 50d86e94d9ed3358bf8bad71ca36599adea63527..5dead399fe64dc50366ccbe575db02021ff4d076 100644 (file)
@@ -794,7 +794,7 @@ slow_path:
                /*
                 *      Copy a block of the IP datagram.
                 */
-               if (skb_copy_bits(skb, ptr, skb_transport_header(skb), len))
+               if (skb_copy_bits(skb, ptr, skb_transport_header(frag), len))
                        BUG();
                left -= len;
 
index d6846393182d4294dc08f30d9fa99921dd881319..761a910f4f9717754cdb3d6280bda31de43bb125 100644 (file)
@@ -820,7 +820,7 @@ static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt,
                return 0;
 
        len = min_t(unsigned int, len, ipv6_optlen(hdr));
-       if (copy_to_user(optval, hdr, len));
+       if (copy_to_user(optval, hdr, len))
                return -EFAULT;
        return ipv6_optlen(hdr);
 }
index 1900937b332871b350e9ae539b417df8c3a1e446..8ba703da2797493be2e007fd23e9ca0a53fb1b11 100644 (file)
@@ -128,8 +128,8 @@ static int __init irda_init(void)
  out_err_3:
 #ifdef CONFIG_SYSCTL
        irda_sysctl_unregister();
-#endif
  out_err_2:
+#endif
 #ifdef CONFIG_PROC_FS
        irda_proc_unregister();
 #endif
index 694ea4d92fa8bd37924938e180a494dab9701bf6..1e429c92973960fe4be164a62ef4e578f2cdc520 100644 (file)
@@ -106,7 +106,7 @@ static int irda_nl_get_mode(struct sk_buff *skb, struct genl_info *info)
        }
 
        if(nla_put_string(msg, IRDA_NL_ATTR_IFNAME,
-                         dev->name));
+                         dev->name))
                goto err_out;
 
        if(nla_put_u32(msg, IRDA_NL_ATTR_MODE, irlap->mode))
index 8ec5ed192b5d889f3211c6a955e656442ebd4fd9..7286c389a4d0ccd418a1d953e3dd921b179a9730 100644 (file)
@@ -4678,7 +4678,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
                        memset(skb->cb, 0, sizeof(skb->cb));
                        netif_rx(skb);
                        skb = skb2;
-                       break;
                }
        }
  out:
index 7ba352e3ffe0d451ad2bca62852e84a5b79b5d2e..0d99b685df5f6cf46ea3254b92bc3f103e539d17 100644 (file)
@@ -2154,7 +2154,11 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
                return 0;
        } else {
                if (ifsta->state != IEEE80211_AUTHENTICATE) {
-                       ieee80211_sta_start_scan(dev, NULL, 0);
+                       if (ifsta->auto_ssid_sel)
+                               ieee80211_sta_start_scan(dev, NULL, 0);
+                       else
+                               ieee80211_sta_start_scan(dev, ifsta->ssid,
+                                                        ifsta->ssid_len);
                        ifsta->state = IEEE80211_AUTHENTICATE;
                        set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request);
                } else
index 1276a442f10c53936d021be834631860285fd660..d449fa47491cfea5c65bfb957bda4ca60afe15a0 100644 (file)
@@ -295,6 +295,7 @@ static int epaddr_len(struct nf_conn *ct, const char *dptr,
 static int skp_epaddr_len(struct nf_conn *ct, const char *dptr,
                          const char *limit, int *shift)
 {
+       const char *start = dptr;
        int s = *shift;
 
        /* Search for @, but stop at the end of the line.
@@ -309,8 +310,10 @@ static int skp_epaddr_len(struct nf_conn *ct, const char *dptr,
        if (dptr <= limit && *dptr == '@') {
                dptr++;
                (*shift)++;
-       } else
+       } else {
+               dptr = start;
                *shift = s;
+       }
 
        return epaddr_len(ct, dptr, limit, shift);
 }
@@ -330,7 +333,8 @@ int ct_sip_get_info(struct nf_conn *ct,
 
        while (dptr <= limit) {
                if ((strncmp(dptr, hnfo->lname, hnfo->lnlen) != 0) &&
-                   (strncmp(dptr, hnfo->sname, hnfo->snlen) != 0)) {
+                   (hnfo->sname == NULL ||
+                    strncmp(dptr, hnfo->sname, hnfo->snlen) != 0)) {
                        dptr++;
                        continue;
                }
index 74f9b14c012f45e819938e6bb5c2873163d0cd13..bec427915b302fa2d9731de6045a9a6e8bd14ee4 100644 (file)
@@ -36,7 +36,7 @@ static bool u32_match_it(const struct xt_u32 *data,
                at  = 0;
                pos = ct->location[0].number;
 
-               if (skb->len < 4 || pos > skb->len - 4);
+               if (skb->len < 4 || pos > skb->len - 4)
                        return false;
 
                ret   = skb_copy_bits(skb, pos, &n, sizeof(n));
index ec077037f534b6a3265342fc0ccfd1dd56893505..7d44453dfae13a43a4e4a1a72e077ff644d96661 100644 (file)
@@ -1168,7 +1168,7 @@ static int __sock_create(int family, int type, int protocol,
        module_put(pf->owner);
        err = security_socket_post_create(sock, family, type, protocol, kern);
        if (err)
-               goto out_release;
+               goto out_sock_release;
        *res = sock;
 
        return 0;
index 338606eb7238007ea058e4c542d6fd68fb354c51..7520361663e88eef2dc96cf42e3c62571fe7a4d7 100644 (file)
@@ -315,13 +315,13 @@ int cap_syslog (int type)
        return 0;
 }
 
-int cap_vm_enough_memory(long pages)
+int cap_vm_enough_memory(struct mm_struct *mm, long pages)
 {
        int cap_sys_admin = 0;
 
        if (cap_capable(current, CAP_SYS_ADMIN) == 0)
                cap_sys_admin = 1;
-       return __vm_enough_memory(pages, cap_sys_admin);
+       return __vm_enough_memory(mm, pages, cap_sys_admin);
 }
 
 EXPORT_SYMBOL(cap_capable);
index 19d813d5e0837beaa6c332254c8538ff1d2b63d8..853ec2292798261bc675642e685cb27d84469919 100644 (file)
@@ -108,13 +108,13 @@ static int dummy_settime(struct timespec *ts, struct timezone *tz)
        return 0;
 }
 
-static int dummy_vm_enough_memory(long pages)
+static int dummy_vm_enough_memory(struct mm_struct *mm, long pages)
 {
        int cap_sys_admin = 0;
 
        if (dummy_capable(current, CAP_SYS_ADMIN) == 0)
                cap_sys_admin = 1;
-       return __vm_enough_memory(pages, cap_sys_admin);
+       return __vm_enough_memory(mm, pages, cap_sys_admin);
 }
 
 static int dummy_bprm_alloc_security (struct linux_binprm *bprm)
index 6237933f7d82c3454c4409a00a1aa779ef5ceee3..d8bc4172819c96bcefc49d69bf42f6619d6e4f04 100644 (file)
@@ -1584,7 +1584,7 @@ static int selinux_syslog(int type)
  * Do not audit the selinux permission check, as this is applied to all
  * processes that allocate mappings.
  */
-static int selinux_vm_enough_memory(long pages)
+static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
 {
        int rc, cap_sys_admin = 0;
        struct task_security_struct *tsec = current->security;
@@ -1600,7 +1600,7 @@ static int selinux_vm_enough_memory(long pages)
        if (rc == 0)
                cap_sys_admin = 1;
 
-       return __vm_enough_memory(pages, cap_sys_admin);
+       return __vm_enough_memory(mm, pages, cap_sys_admin);
 }
 
 /* binprm security operations */
index f00161ef99ed17450ae395913730ca4154469e2d..6100fc023055c0b62e4d3d4691e0593424d38113 100644 (file)
@@ -2127,7 +2127,7 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr,
        *rule = NULL;
 
        if (!ss_initialized)
-               return -ENOTSUPP;
+               return -EOPNOTSUPP;
 
        switch (field) {
        case AUDIT_SUBJ_USER: